【问题标题】:ggplot: How to change boxplot settings when stat_summary is usedggplot:使用 stat_summary 时如何更改箱线图设置
【发布时间】:2015-02-06 10:42:33
【问题描述】:

我想将由 stat_summary 定义的胡须分组箱线图。在changing-whisker-definition 的帮助下,我编写了以下代码:

# Data
xdf2 <- data.frame(month = rep(1:6,each=100)
                  , grp = rep(c('A','B'), 50*6)
                  )
xdf2$m <- rpois(n=nrow(xdf2),10)
# Definition of whiskers
f <- function(x) {
  r <- quantile(x, probs = c(0.10, 0.25, 0.5, 0.75, 0.90))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}

# Add points outside of whiskers
o <- function(x) {
  subset(x, x < quantile(x,probs=0.1) | quantile(x,probs=0.9) < x)
}


# Plot
ggplot(data = xdf2
         , aes(factor(month),m, color=grp)
         ) +
       stat_summary(fun.data = f
                    , geom="boxplot"
                    , position=position_dodge(width=1)
                    , size=1
                    ) +
        stat_summary(fun.y = o, geom="point", position=position_dodge(width=1)) +
        scale_color_manual(values = c("gray30","darkgrey"),labels = c("AAA","BBB")) +
        theme_bw()

它给出了以下图表:

我想进行一些更改:

  • 如何更改框的宽度?
  • 如何用相同颜色的边框填充框?

我很乐意提供任何帮助。非常感谢。

【问题讨论】:

  • 查看this question。虽然它适用于条形图,但在 ggplot 的 aes 中使用 width 也适用于箱线图。出于某种原因,Google 总是首先让我回答这个问题,可能是因为它是最近的。

标签: r ggplot2 boxplot


【解决方案1】:

fill 美学映射到grp 并为其添加类似的比例。我使用稍微不同的颜色来显示平均值。

要更改箱线图宽度,请使用ggsave 和各种width 参数,箱线图将自动调整。如果您想在两者之间添加一些空格,则必须作弊,见下文。

stat_summary一起修改宽度并不容易:虽然geom_bargeom_boxplot有一个width参数,但我无法使其与stat_summary一起正常工作。相反,我对scale_x 使用了一些肮脏的技巧。

K <- length(unique(xdf2$month))
lev <- seq_len(1 + 2 * K)

xdf2$month2 <- factor(2 * xdf2$month, 
                      levels = lev)

ggplot(data = xdf2, aes(month2, m, color = grp, fill = grp)) +
  stat_summary(fun.data = f, geom="boxplot", 
               position=position_dodge(width=1.5), size=1) +
  stat_summary(fun.y = o, geom="point", position=position_dodge(width=1.5)) +
  scale_color_manual(values = c("gray30","darkgrey"),labels = c("AAA","BBB")) +
  scale_fill_manual(values = c("gray20","grey75"),labels = c("AAA","BBB")) +
  theme_bw() +
  scale_x_discrete(limits = lev, breaks = 1:K*2, labels = 1:K) 

position_dodge 中调整width 以进行额外调整。

【讨论】:

  • 非常感谢!现在我得到了漂亮的箱线图。关于宽度:我想让框的宽度变窄以显示月份之间的更多区别。
  • @giordano 这并不像我希望的那么容易。但是,请参阅编辑,我认为它对您有用。
  • 非常感谢。你帮了大忙。据我了解,您创建了一个带有标签 2*month 和 13 个级别的因子。也许你可以给我一个提示,为什么盒子更窄。
  • 嗯,诀窍的核心是创建“不可见”因子水平并将它们放在现有水平之间,再加上另外两个,最左边和最右边。这些空级别没有数据,因此不会出现箱线图,这会产生额外的空间。 labels 参数恢复原来的因子顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多