离散型 x 轴下使用 geom_ribbon 叠加。

6
我希望在一组箱线图上放置一个底层,以指示从另一个来源和另一个数据框中绘制的一些数据的范围。制作一个覆盖层很容易,但制作一个底层很困难。
为了这个目的,想象一下我正在试图将一些来自于mtcars的数据放置在diamonds数据的箱线图下方:
# Find quantiles of mtcars$drat
mQ <- quantile(mtcars$wt, c(0.025, 0.975))

# Place them in a data frame with factor limits of diamonds$cut
mtcarsQ <- data.frame(x=c(min(as.numeric(diamonds$cut)), max(as.numeric(diamonds$cut))), ymin=rep(mQ[1], 2), ymax=rep(mQ[2], 2))

# Plot diamonds$cut, with overlay of quantiles from mtcars
ggplot() + 
  geom_boxplot(data=diamonds, aes(x=cut, y=y)) +
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  coord_cartesian(ylim=c(0, 12))

输入图像描述

这种方法很好 - 但我(实际上是我的合著者)希望geom_ribbon位于箱线图的下方而不是上方。(色带的颜色似乎会干扰箱线图的颜色)。当我尝试反转geoms的顺序时,如下所示:

ggplot() + 
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  geom_boxplot(data=diamonds, aes(x=cut, y=y))

我会翻译成中文:

我得到了“错误:提供给连续比例的离散值”,因为ggplot不想将一个因子映射到连续比例。

我可以尝试将该因子转换为数字:

ggplot() + 
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y))

然而,这会改变x轴标签。我认为可以通过以下方式添加轴标签:
ggplot() + 
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y, fill=cut, group=cut)) +
  scale_x_discrete(labels=levels(diamonds$cut)) +
  coord_cartesian(ylim=c(0, 12))

但是我不明白为什么x轴会出现额外的因素水平。

enter image description here

当箱线图具有离散的x轴时,是否有更简单的方法在箱线图下放置一个矩形?

3个回答

9

强制比例尺按您想要的方式进行的最普遍方法是从geom_blank开始,它将定义比例尺但不绘制任何内容。我相信它就是为这种情况而设计的:

ggplot() + 
  geom_blank(data=diamonds, aes(x=cut, y=y)) +
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) +
  coord_cartesian(ylim=c(0, 12))

enter image description here


4

如果您使用 scale_x_continuous() 并提供了不仅是 labels= 还有 breaks=,那么将因将因子值转换为数字而得到有效解决方案。

ggplot() + 
  geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
  geom_boxplot(data=diamonds, aes(x=as.numeric(cut), y=y, fill=cut, group=cut)) +
  scale_x_continuous(breaks=1:5,labels=levels(diamonds$cut)) +
  coord_cartesian(ylim=c(0, 12))

enter image description here


3

再次应用箱线图:

ggplot() + 
geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) +
geom_ribbon(data=mtcarsQ, aes(x=x, ymin=ymin, ymax=ymax), alpha=0.2)+
geom_boxplot(data=diamonds, aes(x=cut, y=y, fill=cut, group=cut)) +
coord_cartesian(ylim=c(0, 12))

enter image description here


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