【问题标题】:How to create a customized "geom_box" in ggplot2?如何在 ggplot2 中创建自定义的“geom_box”?
【发布时间】: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")

这个例子有几个问题:

  1. 框不符合箱线图的宽度
  2. 盒子的下半部分比上半部分的线粗(因为我需要说“中间”应该在哪里)
  3. 需要根据数据手动进行计算(可以将其包装在一个函数中,但由于其他问题,我还没有做到这一点)。

简而言之,我想要 geom_box 之类的东西,但无法从谷歌搜索中找到它,我很乐意提供一些关于如何继续编写这样一个自定义的 geom 函数的指导(我猜this只是一个开始,但欢迎提供更多帮助)。

【问题讨论】:

  • 我们是否只想显示没有箱线图的红框?
  • @zx8754 好吧,如果它是一个 geom_box,那么它们可以相互叠加或不叠加(即:ggplot(df1) + geom_boxplot(...stuff...) + geom_box( ...稍微其他的东西...))
  • 显然width 是一个计算变量(以及盒子和胡须范围)。看来原始箱线图的宽度是0.75,因此您可以添加到第二个geom_boxplot 调用的aesmiddle 的一个选项是将其放在中间位置,然后将其绘制在与原始箱线图相同的位置。
  • @aosmith - 这是可能的,但如果我想要没有箱线图的盒子怎么办?也许它可以基于geom_rect?!
  • 可能是relevant post

标签: r ggplot2 boxplot


【解决方案1】:
newbox <- function(values) {
  values <- na.omit(values)
  data.frame(
    ymin = mean(values) - sd(values),
    lower = mean(values) - sd(values),
    middle = mean(values),
    upper = mean(values) + sd(values),
    ymax = mean(values) + sd(values),
    width = 0.75
  )
}

ggplot(iris, aes(Species, Sepal.Length)) + 
  stat_summary(fun.data = newbox, geom = "boxplot", fatten = NA) 

喜欢吗?

如果你想要它没有填充,你可以使用内置函数,例如:

ggplot(iris, aes(Species, Sepal.Length)) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1), 
               geom = "crossbar", fatten = NA) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多