2013-09-25 18 views
5

habe ich diese Handlung enter image description hereFügen Sie benutzerdefinierte Linien in ggplot BarPlot

mit diesem Code:

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

Nun, ich brauche benutzerdefinierte Linien hinzufügen, die die Unterschiede zwischen Paaren von Werten zeigen. Hier ist ein Beispiel dafür, was ich (mit p finden Sie in den ersten beiden Takten = 0,46) zu tun:

enter image description here

Ich habe keine Ahnung von Lösung, und die Dinge sind auch komplizierter für mich, da ich verwendet facet_grid. Kann mir jemand helfen?

Antwort

6

Zuerst, da Beispieldaten nicht zur Verfügung gestellt werden, machte meine eigenen Beispieldaten. Diese Daten sind bereits zusammengefasst (es gibt nur einen Wert pro jeweils Kombinationen von Ebenen.

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 

Nun müssen Sie zwei neue Werte für die Positionen der Zeilen hinzuzufügen. ymin Wert ist der ursprüngliche Wert plus kleine Konstante. ymax Wert wird für jede Facette berechnet (Treatment und Type als Gruppierung verwendet wird) und Maximalwert in Facette plus einig konstant ist.

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 

zweiter Datenrahmen für die Etiketten hergestellt wird. Hier in jeder y-Position Facette wieder original ymax Wert plus etwas Konstante und lab enthält Etiketten, die Sie anzeigen müssen.

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  * 

Wie nun df bereits Wert zusammengefasst Verwendung geom_bar(stat="identity") statt stat_summary(). Zusätzliche Zeilen werden mit zwei geom_segment() Aufrufen hinzugefügt - zuerst zeichnet eine vertikale Linien und zweite fügt horizontale Linie hinzu. geom_text() fügt Beschriftungen über den Zeilen hinzu.

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) 

enter image description here

+0

Sehr vielen Dank für Ihre Geduld, Didzis. Es ist sehr klar und vollständig für mich. –

Verwandte Themen