以mtcars数据为例,我生成了一个箱线图,并希望添加矩形。这是我的完整代码。
library(ggplot2)
d=data.frame(x1=c(1,3,1,5,4), x2=c(2,4,3,6,6), y1=c(10,10,20,14,30), y2=c(15,20,25,18,35), t=c('a','a','a','b','b'))
ggplot(mtcars, aes(x = as.factor(mtcars$carb), y = mpg)) + geom_boxplot() + geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)
但是,由于美学问题,这不起作用。我不明白为什么,因为上述两个部分中的每一个都分别工作,所以:
#part 1 (works)
ggplot(mtcars, aes(x = as.factor(mtcars$carb), y = mpg)) + geom_boxplot()
#part 2 (works)
ggplot() + geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)
任何建议,我将不胜感激。谢谢。
答案 0 :(得分:1)
这是一个如何工作的示例。重要的是ggplot期望所有图层的x轴是连续或离散的,而不是混合的。 (与y轴相同。)
在您的示例中,箱线图x轴位于离散(又称有序)标度上,就像您有一个位置表示“橙色”而另一个位置表示“菠萝”一样。但是rect是按连续的比例定义的,例如1、2、3。ggplot通常要求您选择一种或另一种。如有必要,您可以将其中一项强制转换为另一项,但您需要定义方式。即“菠萝”的左边或右边是“ 2”吗?
因此,要使其正常工作,至少不能将geom_plot
层作为x轴的系数,而不必以某种方式将其转换为数字。在这里,我只保留它作为开始的原始编号,并添加一个group = carb
项,以便我们获得每个碳水化合物值的箱线图,而不是一组中的所有总和。
ggplot(mtcars) +
geom_boxplot(aes(x = carb, y = mpg, group = carb)) +
geom_rect(data=d, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=t), color="black", alpha=0.5)