我创造了这个情节
使用此代码:
ggplot(data_long, aes(Trial,value,fill=factor(Trial))) +
stat_summary(fun.y=mean,geom="bar") + facet_grid(Task~Gruppo) + labs(x="Trial
type",y="Accuracy %") + theme(legend.position="none")
现在,我需要添加自定义行,以显示值之间的差异。这是我想要做的一个例子(参见前两个p = 0.46的条形码):
我不知道解决方案,因为我使用facet_grid
,事情对我来说也更复杂。
任何人都可以帮助我吗?
答案 0 :(得分:6)
首先,由于未提供样本数据,因此制作了我自己的样本数据。这些数据已经汇总(每个级别组合只有一个值。
set.seed(1)
df<-data.frame(expand.grid(c("Control","Effect"),c("Self","Other"),c("Type1","Type2")),
runif(8,0,1))
colnames(df)<-c("Treatment","Group","Type","value")
df
Treatment Group Type value
1 Control Self Type1 0.2655087
2 Effect Self Type1 0.3721239
3 Control Other Type1 0.5728534
4 Effect Other Type1 0.9082078
5 Control Self Type2 0.2016819
6 Effect Self Type2 0.8983897
7 Control Other Type2 0.9446753
8 Effect Other Type2 0.6607978
现在您需要为线的位置添加两个新值。 ymin
值是原始值加上小常量。为每个方面计算ymax
值(使用Treatment
和Type
作为分组),它是方面的最大值加上一些常量。
library(plyr)
df<-ddply(df,.(Treatment,Type),transform,ymax=max(value)+0.2)
df$ymin<-df$value+0.05
df
Treatment Group Type value ymax ymin
1 Control Self Type1 0.2655087 0.7728534 0.3155087
2 Control Self Type2 0.2016819 1.1446753 0.2516819
3 Control Other Type1 0.5728534 0.7728534 0.6228534
4 Control Other Type2 0.9446753 1.1446753 0.9946753
5 Effect Self Type1 0.3721239 1.1082078 0.4221239
6 Effect Self Type2 0.8983897 1.0983897 0.9483897
7 Effect Other Type1 0.9082078 1.1082078 0.9582078
8 Effect Other Type2 0.6607978 1.0983897 0.7107978
为标签制作第二个数据框。在每个方面,y位置再次是原始ymax
值加上一些常量,lab
包含您需要显示的标签。
df.names<-ddply(df,.(Treatment,Type),summarise,ymax=ymax[1]+0.1)
df.names$lab<-c("p=0.46","**","***","*")
df.names
Treatment Type ymax lab
1 Control Type1 0.8728534 p=0.46
2 Control Type2 1.2446753 **
3 Effect Type1 1.2082078 ***
4 Effect Type2 1.1983897 *
现在df
已经汇总了值geom_bar(stat="identity")
而不是stat_summary()
。通过两个geom_segment()
调用添加附加行 - 第一个绘制垂直线,第二个添加水平线。 geom_text()
会在行上方添加标签。
ggplot(df, aes(Group,value,fill=Group)) +
geom_bar(stat="identity") + facet_grid(Type~Treatment) +
theme(legend.position="none")+
geom_segment(aes(x=Group,xend=Group,y=ymin,yend=ymax))+
geom_segment(aes(x="Self",xend="Other",y=ymax,yend=ymax))+
geom_text(data=df.names,aes(x=1.5,y=ymax,label=lab),inherit.aes=FALSE)