ggplot2 geom_boxplot рядом с гранями

#r #ggplot2 #facet

#r #ggplot2 #грань

Вопрос:

У меня есть эти данные:

 set.seed(1)
df <- data.frame(y=rnorm(12),name=factor(rep(c("a","a","b","b","c","c"),2),levels=c("a","b","c")),side=factor(rep(1:2,6),levels=1:2),group=factor(c(rep("x",6),rep("y",6)),levels=c("x","y")),stringsAsFactors=F)
df$upper <- df$y 0.1*df$y
df$lower <- df$y-0.1*df$y
df$max <- df$y 0.25*df$y
df$min <- df$y-0.25*df$y
  

И я хотел бы ggplot geom_boxplot их так, чтобы было две грани, сверху df$group == x и снизу df$group == y , где в каждой грани df$side == 1 отображается слева от df$side == 2 . Я также хочу раскрасить df$group == x darkgray и df$group == y darkred .

Вот что я пробовал:

 library(ggplot2)
p <- ggplot(data=df,aes(name,color=group)) facet_wrap(~group,ncol=1) scale_color_manual(values=c("darkgray","darkred"),labels=levels(df$group),name="group") scale_fill_manual(values=c("darkgray","darkred"),labels=levels(df$group),name="group")
p <- p geom_boxplot(aes(fill=group,lower=lower,upper=upper,middle=y,ymin=min,ymax=max),position=position_dodge(width=0),alpha=0.5,stat="identity") theme(text=element_text(size=10))
p <- p guides(fill=guide_legend(reverse=FALSE),colour=guide_legend(reverse=FALSE))
  

p дает мне:
введите описание изображения здесь

который близок, за исключением того, что не имеет df$side == 1 слева от df$side == 2 .

Есть идеи, как это сделать?

Комментарии:

1. Похоже, вы определяете неправильную ось x, ggplot(df,aes(side,color=group)) дает ли вам правильный результат?

2. Можете ли вы уточнить, как будет выглядеть ожидаемый результат?

Ответ №1:

Я думаю, это может быть то, что вам нужно, оно использует interaction для создания коэффициента, основанного на всех комбинациях уровней его аргументов (вы также могли бы использовать side:name ):

 ggplot(df, aes(x=name, group=interaction(side, name),
               col=group, fill=group))  
    facet_wrap(~group)  
    geom_boxplot(aes(lower = lower, upper = upper,
      middle = y, ymin = min, ymax = max),
      position = position_dodge(width = 0.5),
      alpha = 0.5, stat = "identity")
  

введите описание изображения здесь

Возможно, было бы понятнее вместо этого использовать цвет, чтобы показать, какая сторона какая, поскольку фасеты уже помечают группу:

 ggplot(df, aes(x=name, group=interaction(side, name),
               col=side, fill=side))  
    facet_wrap(~group)  
    geom_boxplot(aes(lower = lower, upper = upper,
      middle = y, ymin = min, ymax = max),
      position = position_dodge(width = 0.5),
      alpha = 0.5, stat = "identity")
  

введите описание изображения здесь