2013-04-29 11 views
7

Chciałbym utworzyć wykres słupkowy za pomocą ggplot2 z dodtonowanymi grupami i etykietami osi dla obu słupków (męski, żeński) i grup (Badanie 1, Badanie 2 ...). Oto jak chciałbym mój wykres wyglądać:Etykiety osi dla każdego słupka i każdej grupy na wykresach słupkowych z unikanymi grupami

enter image description here

A niektóre kod R. W takim przypadku tylko grupy są oznaczone na osi (nie słupki w grupie). Etykiety prętów na osi w zasadzie zastępują legendę.

x  = runif(8) 
gender = factor(c("male","female","male","female","male","female","male","female")) 
group = c(0,0,1,1,2,2,3,3) 
df  = data.frame(x,gender,group) 

ggplot(df,aes(x=group,y=x,fill=gender)) + 
    geom_bar(stat="identity",position="dodge") + 
    scale_x_continuous("",breaks=c(0:3), 
     labels=c('G1','G2','G3','G4')) 

enter image description here

Odpowiedz

8

Zainspirowany @Sandy Muspratt odpowiedź na this SO question.

Najpierw utwórz i zapisz jako wykres obiektu bez legendy i zmień etykiety osi X na Female lub Male na scale_x_continuous(). Dodaj dodatkową przestrzeń pod działką z plot.margin= w theme().

library(ggplot2) 
library(gridExtra) 
p<-ggplot(df,aes(x=group,y=x,fill=gender)) + 
    geom_bar(stat="identity",position="dodge") + 
    scale_x_continuous("",breaks=c(-0.25,0.25,0.75,1.25,1.75,2.25,2.75,3.25), 
        labels=rep(c("Female","Male"),times=4))+ 
    theme(legend.position="none")+ 
    theme(plot.margin = unit(c(1,2,3,1), "lines")) 

Teraz z funkcji annotation_custom() i textGrob() dodać etykiety Study 1, Study 2 pod działki rolne X i Y (ujemne współrzędne y stawia etykiet pod wykresem).

p1<-p+annotation_custom(grob=textGrob("Study 1"), 
          xmin=0,xmax=0,ymin=-.2,ymax=-0.2)+ 
     annotation_custom(grob=textGrob("Study 2"), 
          xmin=1,xmax=1,ymin=-.2,ymax=-0.2)+ 
     annotation_custom(grob=textGrob("Study 3"), 
          xmin=2,xmax=2,ymin=-.2,ymax=-0.2)+ 
     annotation_custom(grob=textGrob("Study 4"), 
          xmin=3,xmax=3,ymin=-.2,ymax=-0.2) 

Aby zapewnić wykreślenie nowych etykiet, należy przekonwertować wykres na obiekt Grobs, a następnie wyłączyć obcinanie.

gt <- ggplot_gtable(ggplot_build(p1)) 
gt$layout$clip[gt$layout$name=="panel"] <- "off" 
grid.draw(gt) 

enter image description here

Powiązane problemy