2012-04-13 2 views
12

Mit ggplot2 Ich erstelle ein Histogramm mit einem Faktor auf der horizontalen Achse und einem anderen Faktor für die Füllfarbe, mit einer ausgewichenen Position. Mein Problem ist, dass der Füllfaktor manchmal nur einen Wert für einen Wert des horizontalen Faktors benötigt, und mit nichts zu umgehen, nimmt der Balken die volle Breite ein. Gibt es eine Möglichkeit, es dem Nichts auszuweichen, damit alle Balkenbreiten gleich sind? Oder äquivalent um die 0's zu plotten?Eine Möglichkeit, immer ein Histogramm auszuweichen?

Zum Beispiel

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) + 
geom_histogram(position = "dodge") 

enter image description here

This answer hat ein paar Ideen. Es wurde auch gefragt, bevor die neue Version veröffentlicht wurde, also hat sich vielleicht etwas geändert? Facetten verwenden (auch gezeigt here) Ich mag nicht für meine Situation, obwohl ich denke, die Bearbeitung der Daten und Verwendung von geom_bar könnte funktionieren, aber es fühlt sich unelegant. Außerdem, wenn ich versuchte, Facettieren sowieso

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) + 
    geom_bar() + facet_grid(~factor(carb)) 

ich den Fehler "Fehler in layout_base (Daten, cols, Tropfen = drop): Mindestens eine Schicht alle Variablen für Facettieren verwendet werden, enthalten muss"

I Angenommen, ich könnte einen Datenrahmen von Zählungen erzeugen und dann geom_bar verwenden,

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")), 
    .fun = count, .variables = c("carb", "gear")) 

die Ebene ausfüllen, die mit 0 ist nicht vorhanden ist. Weiß jemand, ob das funktioniert oder ob es einen besseren Weg gibt?

+2

Ich weiß, dass Sie es nicht ideal betrachten, aber ich denke, die Grafen Vorausberechnen und geom_bar unter Verwendung wäre meine bevorzugte Art und Weise, dies zu tun sein. – joran

Antwort

11

Aktualisiertgeom_bar Bedürfnisse stat = "identity"

Ich bin mir nicht sicher, ob dies für Sie zu spät ist, aber sehe die Antwort auf einen kürzlich erschienenen Beitrag here Das heißt, ich Joran Rat vorab berechnen nehmen würde Zählt außerhalb des ggplot Anrufs und verwendet geom_bar. Wie bei der Antwort auf einen anderen Post, werden die Zählungen in zwei Schritten erhalten: Zuerst wird eine Kreuztabelle von Zählungen erhalten unter Verwendung von dcast; dann zweite, melt die Kreuztabelle.

library(ggplot2) 
library(reshape2) 

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length) 
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5")) 
dat.melt 

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
    geom_bar(stat = "identity", position = "dodge")) 

Das Diagramm:

enter image description here

+0

Möchten Sie auch das Endergebnis-Bild anhängen? –

+0

Ich habe das Diagramm hinzugefügt und einige redaktionelle Änderungen vorgenommen, um die Antwort zu klären. –

+0

Nie zu spät! Danke, dass Sie diesen Kommentar zu einer vollständigen Antwort erweitert haben. – Gregor