2012-09-12 6 views
17

ich eine Grafik erzeugen möchten, die etwa wie folgt aussieht:R gestapelt Prozentbalkendiagramm mit Prozentsatz von binären Faktor und Etiketten (mit ggplot)

enter image description here

Meine ursprünglichen Datensatz etwa wie folgt aussieht:

So ist
> bb[sample(nrow(bb), 20), ] 
     IMG QUANT FIX 
25663 1  1 0 
7936 2  2 0 
23586 3  2 0 
23017 2  2 1 
31363 1  3 1 
7886 2  2 0 
23819 3  3 1 
29838 2  2 1 
8169 2  3 1 
9870 2  3 0 
31440 2  1 0 
35564 3  1 0 
24066 1  2 0 
12020 3  2 0 
6742 3  2 0 
6189 2  3 0 
26692 2  3 0 
1387 3  2 0 
31839 2  3 1 
28637 3  2 0 

die Idee, dass die Balken angezeigt werden, wo FIX = 1 pro Faktor QUANT und pro Faktor IMG.

QUANT IMG FIX.PROP 
1  1 1 0.52439024 
2  1 2 0.19085366 
3  1 3 0.13658537 
4  2 1 0.20414201 
5  2 2 0.53964497 
6  2 3 0.09585799 
7  3 1 0.29000000 
8  3 2 0.13000000 
9  3 3 0.40705882 

Aber jetzt, wenn ich ein Diagramm machen, ist es nicht: plyr

library(plyr) 
bb.perc <- ddply(bb,.(QUANT,IMG),summarise,FIX.PROP = sum(FIX)/length(FIX)) 

Es ist fast das Richtige mit

Ich habe meine Daten in Prozentsätzen aggregiert Konto für die FIX==0 Fälle, dh alle Bars haben die gleiche Höhe, nämlich 100%, was nicht das ist, was ich will. Beachten Sie, wie die einzelnen QUANT Subframes summieren sich nicht zu 100%:

> sum(bb.perc[1:3,]$FIX.PROP) 
[1] 0.8518293 
> sum(bb.perc[4:6,]$FIX.PROP) 
[1] 0.839645 
> sum(bb.perc[7:9,]$FIX.PROP) 
[1] 0.8270588 

Das Beste, was ich mit R tun können, ist Zählungen anzuzeigen:

# Take only the positive samples 
bb.pos <- bb[bb$FIX == 1,] 
# Plot the counts 
ggplot(bb,aes(factor(QUANT),fill=factor(IMG))) + geom_bar() + 
    scale_y_continous(labels=percent) 

und Ergebnisse in: enter image description here Dies ist auch nicht was ich will:

  • Die Prozentskala ist weg. Ich brauche einen Weg, um den 100% -Punkt an die percent Funktion zu übergeben, aber ich habe keine Ahnung wie.
  • Es fehlen die Etiketten.

Es gibt viel ähnlich Fragen auf SO schon, aber ich scheine die ausreichende Menge an Intelligenz (oder Verständnis von R) fehle von ihnen zu einer Lösung für mein besonderes Problem zu extrapolieren.

Danke für irgendwelche Hinweise!

EDIT: Sven Hohenstein bereits eine Antwort zur Verfügung gestellt, aber hier ist, wie ich es selbst auch tun endete:

> ggplot(bb.perc,aes(x=factor(QUANT),y=FIX.PROP,label=paste(round(FIX.PROP*100), 
    "%"),fill=factor(IMG)))+ geom_bar(stat="identity") + geom_text(position="stack", 
    aes(ymax=1),vjust=5) + scale_y_continuous(labels = percent) 

die bb.perc Verwendung, die ich weiter plyr mit definiert werden. Dieser hat den Vorteil, dass die Prozentsätze lokal pro Spalte und nicht global berechnet werden.

Danke allen für die Hilfe.Die beiden folgenden Fragen und ihre jeweiligen Antworten hat mir geholfen, stark es immer rechts:

Stacked Bar Graph Labels with ggplot2

Adding labels to ggplot bar chart

Was ich falsch gemacht habe anfangs war vorbei an der position = "fill" Parameter geom_bar(), die aus irgendeinem Grund Alle Bars haben die gleiche Höhe!

Antwort

21

Dies ist ein Weg, um die Handlung zu generieren:

ggplot(bb[bb$FIX == 1, ],aes(x = factor(QUANT), fill = factor(IMG), 
          y = (..count..)/sum(..count..))) + 
geom_bar() + 
stat_bin(geom = "text", 
      aes(label = paste(round((..count..)/sum(..count..)*100), "%")), 
      vjust = 5) + 
scale_y_continuous(labels = percent) 

Ändern Sie den Wert des Parameters vjust die vertikale Position der Etiketten einzustellen.

enter image description here

+0

Erstaunlich, danke! Ich hatte gerade gerade den Punkt erreicht, an dem ich auch die richtige Handlung hatte, aber ich benutzte den 'plyr'-Weg, um es zu tun. Ich wusste nicht, dass es innerhalb von ggplot selbst möglich ist! –

Verwandte Themen