在ggplot中为每个面添加不同的矩形

3

我有一个数据框,想要按ID分为4个面板,并且对于每个面板,用矩形突出显示数据。

我的数据如下:

dt<-data.frame(ID=c(rep(c("1","2","3","4"),2)),var=c(480,1180,170,130,500,1180,1450,750),
                 Method=c(rep(c("A","B"),each=4)))

我能找到的所有相关帖子都提到要创建一个新的数据框,每个矩形的信息作为单独的一行。因此,我创建了以下数据框:

rect<-data.frame(xmin = c(0.8, 0.8,0.8,0.8), xmax = c(2.2, 2.2, 2.2, 2.2), 
           ymin = c(430, 1130, 120, 80), ymax = c(550, 1230, 1500, 800), 
           alpha = c(.1, .1, .1, .1),
           fill = c("red", "green","orange","blue"))

我的ggplot代码如下:

ggplot(dt,aes(x=Method,y=var)) +
  geom_point() +
  annotate("rect", xmin = rect$xmin, xmax = rect$xmax, ymin = rect$ymin, ymax = rect$ymax,
           alpha = 0.1, fill = "green")+
  facet_wrap(~ID,ncol=4)+
  theme_bw()

以下是翻译结果:

这给了我以下结果:带注释代码的图表

对于我来说,geom_rect选项根本不起作用。我只会收到有关缺少变量的错误消息。我已将ID和Method列添加到rect数据框中,但这只会引发var变量不存在的问题。我考虑过全部合并,但我不确定那是否能解决问题。这是我尝试使用geom_rect的内容。

geom_rect(data=rect, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
          alpha = 0.1,fill = "blue")+

我想要的只是每个面板中的一个矩形,如rect数据框所示。不是所有的矩形都在每个数据框中。暂时忽略颜色,如果它们全部是绿色或蓝色也可以。谢谢您的帮助。
1个回答

5

我认为annotate()方法不允许进行面向特定方面的操作,因此geom_rect()可能是最好的选择。你需要做的两件事情是:(1) 设置inherit.aes = FALSE或将全局aes()更改为geom_point()层,并且 (2) 将面板信息添加到矩形数据框中。

library(ggplot2)

dt<-data.frame(ID=c(rep(c("1","2","3","4"),2)),var=c(480,1180,170,130,500,1180,1450,750),
               Method=c(rep(c("A","B"),each=4)))

rect<-data.frame(xmin = c(0.8, 0.8,0.8,0.8), xmax = c(2.2, 2.2, 2.2, 2.2), 
                 ymin = c(430, 1130, 120, 80), ymax = c(550, 1230, 1500, 800), 
                 alpha = c(.1, .1, .1, .1),
                 fill = c("red", "green","orange","blue"))

ggplot(dt,aes(x=Method,y=var)) +
  geom_point() +
  geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            alpha = 0.1, fill = "green",
            data = transform(rect, ID = as.character(1:4)),
            inherit.aes = FALSE) +
  facet_wrap(~ID,ncol=4)+
  theme_bw()

该内容于2021-04-12由reprex包(v1.0.0)创建

小提示,如果您希望矩形具有来自数据框的填充颜色,请在矩形aes()中使用fill = I(fill)(并删除aes外部的填充赋值)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接