2016-10-23 4 views
1

У меня есть эти данные:ggplot2 стороны geom_boxplot бок с гранями

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 == xdarkgray и df$group == ydarkred.

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

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 дает мне: enter image description here

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

Любая идея, как это сделать?

+0

Кажется, что вы определяете неправильную ось x, делает ли ggplot (df, aes (side, color = group)) 'дает вам правильный результат? – mtoto

+0

К сожалению, нет – dan

+1

Можете ли вы рассказать о том, как будет выглядеть ожидаемый результат? – mtoto

ответ

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") 

enter image description here

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

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") 

enter image description here

Смежные вопросы