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

我明白Error: Discrete value supplied to continuous scale了,因为 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 轴出现了额外的因子水平。

在此处输入图像描述

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

4

3 回答 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))

在此处输入图像描述

于 2013-05-07T11:12:57.743 回答
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))

在此处输入图像描述

于 2013-05-07T05:10:58.350 回答
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))

在此处输入图像描述

于 2013-05-07T04:29:36.120 回答