我想在一组箱线图上放置一个底图,以指示从单独的来源和单独的数据框中提取的一些数据的范围。制作叠加层很容易;制作底衬很困难。
想象一下,出于这些目的,我正在尝试将一些数据从数据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 轴时,是否有更简单的方法将矩形放在箱线图下方?