#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))
который близок, за исключением того, что не имеет 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")