代码绘制交替阴影箱线图(ggplot2,R)的问题

Problem with code drawing alternately shaded boxplot (ggplot2, R)

我想在箱线图中绘制备用 shades/rectangles,类似于此 post 中的第二张图片:

下面是我的代码,以 mtcars 为例。我将 carb 和 cyl 转换为 factor 以更好地匹配我的真实数据和代码

 library(ggplot2)
 odd_numbers <- seq(1,33,2)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$cyl <- as.factor(mtcars$cyl)
 ggplot(mtcars) + 
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), position = position_dodge(0.9)) + 
   geom_rect(data = mtcars, aes(x = carb, y = mpg), 
             xmin= as.numeric(mtcars$carb[odd_numbers]) - 0.5, 
             xmax = as.numeric(mtcars$carb[odd_numbers]) + 0.5, 
             ymin = -Inf, 
             ymax = Inf, fill='grey', alpha=0.5)

我以为x-axis是数字的问题在代码中已经解决了,但是还是有问题:

Warning: Ignoring unknown aesthetics: x, y

Error: Aesthetics must be either length 1 or the same as the data (32): xmin, xmax

请问大家有什么建议吗?谢谢。

编辑

根据评论,我编辑了代码,如下所示: - 已删除 [odd_numbers] - 调换了 geom_boxplotgeom_rect

的顺序

代码:

 library(ggplot2)
 odd_numbers <- seq(1,33,2)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$cyl <- as.factor(mtcars$cyl)
 ggplot(mtcars) + 
   geom_rect(data = mtcars, aes(x = carb, y = mpg), 
         xmin= as.numeric(mtcars$carb) - 0.5, 
         xmax = as.numeric(mtcars$carb) + 0.5, 
         ymin = -Inf, 
         ymax = Inf, fill='grey', alpha=0.5) + 
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), position = position_dodge(0.9))

这会产生以下结果,所以还不是很清楚。谢谢。

与此类似的期望结果:

就像我在 中所说的,data 参数和其他参数的大小必须匹配。因此,在对 geom_rect 的调用中,仅从 mtcars 中提取 odd_numbers。并且不需要通过子集mtcars$carb设置xminxmax,直接使用odd_numbers
并交换两个 geom 以在灰色矩形上放置方框。
另请注意,我已将 odd_numbers 更改为最多 32,而不是 33。nrow(mtcars) 之后的一个值会引发错误。

library(ggplot2)

mtcars$carb <- as.factor(mtcars$carb)
mtcars$cyl <- as.factor(mtcars$cyl)

odd_numbers <- seq(1, 32, 2)

ggplot(mtcars) + 
   geom_rect(data = mtcars[odd_numbers, ], 
             xmin = odd_numbers - 0.5, 
             xmax = odd_numbers + 0.5, 
             ymin = -Inf,
             ymax = Inf, fill = 'grey', alpha = 0.5) +
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), 
                position = position_dodge(0.9))