【问题标题】:Drawing rectangles on boxplot (ggplot2 in R)在箱线图上绘制矩形(R 中的 ggplot2)
【发布时间】:2019-07-01 03:32:22
【问题描述】:

以 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)

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

  • 与箱线图相比,您希望矩形出现在哪里?在您的示例中,箱线图 x 轴是离散的(也称为序数)比例,就像您有一个位置为“橙色”而另一个位置为“菠萝”。但是矩形是在连续的尺度上定义的,比如 1、2、3。 ggplot 通常要求您选择一种或另一种;如有必要,您可以将一个强制转换为另一个,但您需要定义如何。即“2”在“菠萝”的左边还是右边?
  • 谢谢你,乔恩。好点!我认为x轴上的第一个类别(这里,car=1)会对应x=1,好像是连续的,但也许我需要在某个地方插入一个转换?也许as.factoras.numeric ?谢谢。
  • 不要在aes()中使用$

标签: r ggplot2 rectangles


【解决方案1】:

这是一个如何工作的示例。重要的是 ggplot 期望所有层的 x 轴是连续的或离散的,而不是混合的。 (对于 y 轴也是如此。)

在您的示例中,箱线图 x 轴是离散的(也称为序数)比例,就像您有一个位置为“橙色”而另一个位置为“菠萝”。但是矩形是在连续的尺度上定义的,比如 1、2、3。 ggplot 通常要求您选择一种或另一种;如有必要,您可以将一个强制转换为另一个,但您需要定义如何。即“2”在“菠萝”的左边还是右边?

因此,要使其工作,您不能为geom_boxplot 层提供 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)

【讨论】:

  • 完美的乔恩!感谢您的详细解释和修改代码。正是我所希望的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2019-11-12
相关资源
最近更新 更多