【发布时间】:2017-09-29 18:54:35
【问题描述】:
我想要一个类似于 geom_boxplot 的东西,但它只有一个盒子,我可以为盒子的上下部分设置功能,例如,显示加减 1 SD 的数据从平均数。如果stat_boxplot 可以用于此目的,或者如果其他一些功能更适合,我不会。
这可以(几乎)使用 stat="identity" 和预计算在数据上手动完成,例如:
y <- rnorm(100)
y1 <- mean(y) - sd(y)
y2 <- mean(y) + sd(y)
df1 <- data.frame(y)
df2 <- data.frame(
x = 1,
y0 = y1,
y25 = y1,
y50 = y1, # this is a problem...
y75 = y2,
y100 = y2
)
ggplot(df1, aes(x=1,y=y)) +
geom_boxplot() +
geom_boxplot(data = df2,
mapping = aes(x = 1, y = 1, ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100),
stat = "identity", alpha = 0.1, fill = "red")
这个例子有几个问题:
- 框不符合箱线图的宽度
- 盒子的下半部分比上半部分的线粗(因为我需要说“中间”应该在哪里)
- 需要根据数据手动进行计算(可以将其包装在一个函数中,但由于其他问题,我还没有做到这一点)。
简而言之,我想要 geom_box 之类的东西,但无法从谷歌搜索中找到它,我很乐意提供一些关于如何继续编写这样一个自定义的 geom 函数的指导(我猜this只是一个开始,但欢迎提供更多帮助)。
【问题讨论】:
-
我们是否只想显示没有箱线图的红框?
-
@zx8754 好吧,如果它是一个 geom_box,那么它们可以相互叠加或不叠加(即:ggplot(df1) + geom_boxplot(...stuff...) + geom_box( ...稍微其他的东西...))
-
显然
width是一个计算变量(以及盒子和胡须范围)。看来原始箱线图的宽度是0.75,因此您可以添加到第二个geom_boxplot调用的aes。middle的一个选项是将其放在中间位置,然后将其绘制在与原始箱线图相同的位置。 -
@aosmith - 这是可能的,但如果我想要没有箱线图的盒子怎么办?也许它可以基于geom_rect?!
-
可能是relevant post?