ggplot:如何在使用stat_summary时更改boxplot设置

时间:2015-02-06 10:42:34

标签: r ggplot2 boxplot

我想有一个分组的箱形图,其中哪些是由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()

给出了以下图表: enter image description here

我想要执行一些更改:

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

我很乐意为你提供帮助。非常感谢。

1 个答案:

答案 0 :(得分:3)

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

要更改箱线图宽度,请使用ggsave和各种width参数,框图将自动调整。如果您想在它们之间添加一些空间,您将不得不作弊,见下文。

stat_summary一起修改宽度并不容易:虽然widthgeom_bar有一个geom_boxplot参数,但我无法做到与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) 

enter image description here

width内的position_dodge游戏以进行其他调整。