Ggplot: Как изменить настройки boxplot при использовании stat_summary

Я хотел бы сгруппировать ящики, усы которых определяются 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

Карта fill эстетика grp и добавьте для нее подобный масштаб. Я использую несколько разные цвета, чтобы сделать видимым среднее.

Чтобы изменить ширину boxplot, используйте ggsave с различными параметрами width, ящики будут автоматически настроены. Если вы хотите добавить промежуток между ними, вам придется немного обмануть, см. Ниже.

Невозможно изменить ширину в сочетании с stat_summary: хотя есть параметр width для geom_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 для дополнительной настройки.