Gestapeltes Histogramm von bereits zusammengefasst zählt mit ggplot2
Ich würde gerne helfen, einige Färbung ein ggplot2-Histogramm generiert aus den bereits zusammengefassten Daten zählen.
Die Daten sind so etwas wie die Grafen # Männer und # Frauen Leben in verschiedenen Bereichen. Es ist leicht genug, um plot, das Histogramm für die gesamtaktivität (also Männchen + Weibchen):
set.seed(1)
N=100;
X=data.frame(C1=rnbinom(N,15,0.1), C2=rnbinom(N,15,0.1),C=rep(0,N));
X$C=X$C1+X$C2;
ggplot(X,aes(x=C)) + geom_histogram()
Allerdings würde ich gerne die Farbe jedes Balkens nach der relativen Beitrags von C1 und C2, so daß ich das gleiche Histogramm (d.h. Gesamt-bar-Höhen) wie im obigen Beispiel, plus ich sehen, der Anteil von Typ "C1" und "C2" die Individuen wie in einem gestapelten Balkendiagramm.
Vorschläge für eine saubere Weg dies zu tun ist mit ggplot2, mit Daten wie "X" im Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehr schnell, Sie können tun, was der OP will mit der
stat="identity"
option und dieplyr
Paket manuell zu berechnen, das Histogramm, und zwar so:Wir im Grunde nur ein 'mitten' - Spalte, wie Sie die Spalten und erstellen Sie zwei Diagramme: eines mit dem zählen für den Gesamt - (C) und eine mit den Spalten angepasst, um die Anzahl der Spalten (C1). Sie sollten in der Lage sein anpassen von hier.
Update 1: ich merkte, ich machte einen kleinen Fehler in der Berechnung der mitten. Ist jetzt behoben. Auch, ich weiß nicht, warum ich eine 'ddply' - Anweisung zur Berechnung der mitten. Das war albern. Der neue code ist klarer und übersichtlicher.
Update 2: ich kehrte zum anzeigen eines Kommentars und bemerkt etwas entsetzliches: ich war mit Summen als die Histogramm-Frequenzen. Ich habe den code aufgeräumt, ein wenig und auch Vorschläge aus den Kommentaren bezüglich der Färbung syntax.
geom_histogram(aes(x=mid, y=total), fill="blue")
(d.h. setzen diefill
Spezifikation außerhalb der mapping), dann müssen Sie herausfinden, wie Sie die guide (Legende) manuell.Hier ist ein hack mit
ggplot_build
. Die Idee ist zum ersten mal Ihren alten/ursprünglichen plot:gespeichert in
p
. Verwenden Sie dannggplot_build(p)$data[[1]]
zum extrahieren der Daten, insbesondere die Spaltenxmin
undxmax
(um den gleichen Pausen/binwidths Histogramm) undcount
Spalte (Normalisierung der Prozentsatz voncount
. Hier ist der code:Wie Daten generiert nun? Was verstehe ich von deinem post ist dieser. Nehmen Sie zum Beispiel die erste bar in Ihrer Zeichnung. Es hat eine Anzahl von 2 und es reicht aus
xmin = 147
zuxmax = 156.8
. Wenn wir überprüfenX
für diese Werte:Hier berechne ich
(91+86)/(154+156)*(count=2) = 1.141935
und(63+70)/(154+156) * (count=2) = 0.8580645
als die beiden normierten Werte für die einzelnen Balken, die wir generieren werden.- Und dies ist der ursprüngliche plot:
Und das ist, was ich bekomme:
Edit: Wenn Sie wollen auch Holen Sie sich die Pausen die richtige, dann erhalten Sie die entsprechenden
x
- Koordinaten aus den alten plot und benutze es hier, anstattid
:require(reshape2);ggplot(melt(X,id.vars="C"),aes(x=C,fill=variable)) + geom_histogram()
nicht tun?plyr
undreshape2
diesen Tagen habe ich eine version von @Arun Antwort mittidyr
undlapply
im diese AntwortWie etwa:
position="stack"
setzt die Variablen auf der jeweils anderen. Die Gesamthöhe der gleiche sein wird. Ich 'll fügen Sie einige Details zu Ben' s Antwort auf die hoffentlich deutlicher machen.stat="identity"
um etwas zu tun.