2013-02-18 22 views
8

Ich versuche, ein gestapeltes Balkendiagramm in R mit ggplot zu plotten. Ich möchte auch Prozent in jedem Stück Bars für dieses Stück enthalten. Ich habe versucht, den Pfosten 1, 2, 3 zu folgen, aber die Werte sind nicht genau in ihren jeweiligen Blöcken. Meine Daten sind eine Datei in dropbox.R gestapelt Balkendiagramm Plot geom_text

Mein Code ist wie folgt:

f<-read.table("Input.txt", sep="\t", header=TRUE) 

ggplot(data=f, aes(x=Form, y=Percentage, fill=Position)) + 
    geom_bar(stat="identity", colour="black") + 
    geom_text(position="stack", aes(x=Form, y=Percentage, ymax=Percentage, label=Percentage, hjust=0.5)) + 
    facet_grid(Sample_name ~ Sample_type, scales="free", space="free") + 
    opts(title = "Input_profile", 
     axis.text.x = theme_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = theme_text(face="bold", size=11), 
     axis.title.x = theme_text(face="bold", size=9), 
     axis.title.y = theme_text(face="bold", size=9, angle=90), 
     panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank()) + 
    scale_fill_hue(c=45, l=80) 

ggsave("Output.pdf") 

Der Ausgang ist-

enter image description here

Jede Hilfe wird sehr geschätzt. Vielen Dank für Ihre Hilfe und Zeit!

+5

um die y-Wert Denken Sie 'geom_text' sind zu geben. Es ist die _Height_ jedes Balkensegments. Sie müssen einige Arithmetik berechnen, um den Mittelpunkt (oder Spitze oder was auch immer) jedes Balkensegments zu berechnen, fügen Sie das als eine separate Variable hinzu und verwenden Sie es als die y-Variable in 'geom_text'. Die Funktion "Cumsum" kann hilfreich sein. – joran

+1

In diesem Fall werden die Y-Positionen für die Beschriftungen am Mittelpunkt jedes Balkensegments berechnet: 'f <- ddply (f,. (Formular, Beispielname, Beispieltyp), transformieren, pos = (cumsum (Prozent) - 0,5 * Prozent))) '(erfordert plyr), dann sollte die' geom_text' Anweisung lauten: 'geom_text (aes (x = Formular, y = pos, label = Prozentsatz))' –

Antwort

9

Ich denke, Sie verwenden eine ältere Version von ggplot2. Denn mit dem Code für ggplot2 v 0.9.3 geändert, ich diese:

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position)) 
p <- p + geom_bar(stat = "identity", colour = "black") 
p <- p + geom_text(position = "stack", aes(x = Form, y = Percentage, ymax = Percentage, label = Percentage, hjust = 0.5)) 
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free") 
p <- p + theme(plot.title = element_text("Input_profile"), 
     axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = element_text(face="bold", size=11), 
     axis.title.x = element_text(face="bold", size=9), 
     axis.title.y = element_text(face="bold", size=9, angle=90), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank()) 
p <- p + scale_fill_hue(c=45, l=80) 
p 

ggplot2_text_placement

Sie sehen, dass die Textobjekte normalerweise richtig platziert sind. Es gibt Orte, an denen die Balken einfach zu kurz sind, so dass sich die Zahlen überschneiden. Sie können auch mit dem Parameter size spielen.

Um dies zu korrigieren, könnten Sie etwas tun, um die Zahlen selbst zu addieren.

df <- ddply(df, .(Form, Sample_type, Sample_name), transform, 
     cum.perc = Reduce('+', list(Percentage/2,cumsum(c(0,head(Percentage,-1)))))) 

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position)) 
p <- p + geom_bar(stat = "identity", colour = "black") 
p <- p + geom_text(aes(x = Form, y = cum.perc, ymax = cum.perc, label = Percentage, hjust = 0.5), size=2.7) 
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free") 
p <- p + theme(plot.title = element_text("Input_profile"), 
     axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = element_text(face="bold", size=11), 
     axis.title.x = element_text(face="bold", size=9), 
     axis.title.y = element_text(face="bold", size=9, angle=90), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank()) 
p <- p + scale_fill_hue(c=45, l=80) 
p 

Das gibt:

ggplot2_facet_text_final

5

Hier ist eine Lösung barchart aus Gitter verwenden.

enter image description here

library(latticeExtra) 
barchart(Percentage~Form|Sample_type*Sample_name,data=dat, 
     groups =Position,stack=T, 
     panel=function(...){ 
      panel.barchart(...) 
      ll <- list(...) 
      keep <- !is.na(ll$groups[ll$subscripts]) 
      x <- as.numeric(ll$x[keep]) 
      y <- as.numeric(ll$y[keep]) 
      groups <- as.numeric(factor(ll$groups)[ll$subscripts[keep]]) 
      for (i in unique(x)) { 
       ok <- x == i 
       ord <- sort.list(groups[ok]) 
       pos <- y[ok][ord] > 0 
       nok <- sum(pos, na.rm = TRUE) 
       h <- y[ok][ord][pos] 
       panel.text(x = rep(i, nok),y = cumsum(h)-0.5*h, 
          label = h,cex=1.5) 
      } 
     }, 
     auto.key = list(columns = 5), 
     par.settings = ggplot2like(n = 5), 
     lattice.options = ggplot2like.opts())