2013-09-25 19 views
5

Tôi tạo ra âm mưu này enter image description hereThêm dòng tùy chỉnh trong ggplot barplot

với mã này:

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

Bây giờ, tôi cần thêm dòng tùy chỉnh mà cho thấy sự khác nhau giữa các cặp vợ chồng các giá trị. Dưới đây là một ví dụ về những gì tôi muốn làm (xem hai thanh đầu tiên với p = 0,46):

enter image description here

Tôi không có ý tưởng về giải pháp, và những điều này cũng là phức tạp hơn đối với tôi kể từ khi tôi sử dụng facet_grid. Có ai giúp tôi không?

Trả lời

6

Đầu tiên, vì dữ liệu mẫu không được cung cấp, tạo dữ liệu mẫu của riêng tôi. Những dữ liệu đã được tóm tắt (chỉ có một giá trị cho mỗi sự kết hợp của các cấp.

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 

Bây giờ bạn cần phải thêm hai giá trị mới cho các vị trí của dòng. ymin giá trị là giá trị ban đầu cộng với hằng số nhỏ. ymax giá trị được tính cho mỗi khía cạnh (sử dụng TreatmentType như nhóm) và nó là giá trị tối đa trong khía cạnh cộng với một số không đổi.

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 

khung dữ liệu thứ hai được thực hiện cho các nhãn. ở mỗi vị trí khía cạnh y là một lần nữa gốc ymax giá trị cộng với một số hằng số và lab chứa các nhãn bạn cần hiển thị.

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  * 

Như bây giờ df đã được tóm tắt sử dụng giá trị geom_bar(stat="identity") thay vì stat_summary(). Các dòng bổ sung được thêm vào với hai cuộc gọi geom_segment() - số đầu tiên vẽ các đường thẳng đứng và thứ hai thêm đường ngang. geom_text() thêm nhãn trên các dòng.

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

nhờ Rất kiên nhẫn của bạn, Didzis. Nó rất rõ ràng và đầy đủ cho tôi. –

Các vấn đề liên quan