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

EB7*_*B77 4 r annotate facet ggplot2 geom

我有一个数据框,我想以 4 个方面(按 ID)的形式呈现,并且对于每个方面,用矩形突出显示数据。

我的数据是:

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)))
Run Code Online (Sandbox Code Playgroud)

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

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"))
Run Code Online (Sandbox Code Playgroud)

我的 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()
Run Code Online (Sandbox Code Playgroud)

这给了我以下内容:带有注释代码的绘图

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")+
Run Code Online (Sandbox Code Playgroud)

我想要的只是每个方面一个矩形,根据矩形数据框。并非每个数据帧上都有它们。现在忽略颜色,如果它们都是绿色或蓝色就可以了。

在此先感谢您的帮助。

teu*_*and 6

我认为该annotate()方法不允许考虑方面特异性,因此geom_rect()可能是可行的方法。您必须做的两件事是(1)设置或更改图层的inherit.aes = FALSE全局,以及(2)将构面信息添加到矩形 data.frame 中。aes()geom_point()

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()
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 4 月 12 日创建(v1.0.0)

小旁注,如果您希望矩形逐字地具有 data.frame 中的填充,您可以fill = I(fill)在矩形中使用aes()(并删除 aes 之外的填充分配)。