Ich zeichne eine kategoriale Variable und anstatt die Anzahl für jeden Kategoriewert anzuzeigen.
Ich suche nach einer Möglichkeit, ggplot
den Prozentsatz der Werte in dieser Kategorie anzuzeigen. Natürlich ist es möglich, eine andere Variable mit dem berechneten Prozentsatz zu erstellen und diese zu zeichnen, aber ich muss es mehrere Dutzend Mal tun und hoffe, dies in einem Befehl zu erreichen.
Ich habe mit so etwas experimentiert
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
aber ich muss es falsch verwenden, da ich Fehler habe.
Um das Setup einfach zu reproduzieren, hier ein vereinfachtes Beispiel:
mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.
Im wirklichen Fall werde ich wahrscheinlich ggplot
anstelle von verwenden qplot
, aber der richtige Weg, stat_bin zu verwenden, entgeht mir immer noch.
Ich habe auch diese vier Ansätze ausprobiert:
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
aber alle 4 geben:
Error: ggplot2 doesn't know how to deal with data of class factor
Der gleiche Fehler tritt für den einfachen Fall von auf
ggplot (data=mydataf, aes(levels(mydataf))) +
geom_bar()
Es geht also eindeutig darum, wie ggplot
mit einem einzelnen Vektor interagiert wird. Ich kratzte mir am Kopf und googelte nach diesem Fehler, was zu einem einzigen Ergebnis führte .
Antworten:
Seitdem dies beantwortet wurde, wurden einige bedeutende Änderungen an der
ggplot
Syntax vorgenommen. Fassen Sie die Diskussion in den obigen Kommentaren zusammen:Hier ist ein reproduzierbares Beispiel mit
mtcars
:Diese Frage ist derzeit die Nummer 1 bei Google für "ggplot count vs prozentuales Histogramm". Hoffentlich hilft dies dabei, alle Informationen zu destillieren, die derzeit in Kommentaren zur akzeptierten Antwort enthalten sind.
Anmerkung: Wenn
hp
nicht als Faktor festgelegt, gibt ggplot Folgendes zurück:quelle
percent
dem Paket, aus dem es stammt , ein Präfix voranstellen , damit das oben genannte funktioniert (ich habe es getan).ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))
stattdessen. Jede Facette sollte 100% ergeben.Dieser geänderte Code sollte funktionieren
Wenn Ihre Daten NAs haben und Sie nicht möchten, dass sie in den Plot aufgenommen werden, übergeben Sie na.omit (mydataf) als Argument an ggplot.
hoffe das hilft.
quelle
formatter
Argument in ggplot2 Version 0.9.0 nicht mehr funktioniert. Stattdessen möchten Sie so etwas wielabels = percent_format())
.scales
Bibliothek vor der Verwendung ladenpercent_format()
, sonst funktioniert es nicht. 0.9.0 lädt nicht mehr automatisch unterstützende Pakete.? stat_bin
. Es zeigt, durch welche zusätzlichen Spalten dem Datenrahmen hinzugefügt wirdggplot2
. Alle zusätzlichen Spalten haben die Form..variable..
.aes(y = (..count..)/sum(..count..))
einfach zu ersetzenaes(y = ..density..)
? Optisch gibt es ein sehr ähnliches (aber immer noch anderes) Bildscales
Bibliothek laden und dannscale_y_continuous(labels=percent)
wie in den Dokumenten erwähnt verwendenMit ggplot2 Version 2.1.0 ist es
quelle
Ab März 2017 wird mit
ggplot2
2.2.1 die beste Lösung in Hadley Wickhams R for Data Science-Buch erklärt:stat_count
Berechnet zwei Variablen: Wirdcount
standardmäßig verwendet, Sie können jedoch auswählen,prop
welche Proportionen angezeigt werden sollen .quelle
fill
Mapping nicht verwenden (es wird kein Fehler ausgegeben, aber keine Füllfarbe hinzugefügt).group = 1
, um eine Füllungszuordnung zu erhalten. Vielleicht hilft esgroup
Parameter entferne , werden jedoch nicht die richtigen Prozentsätze angezeigt, da für jeden eindeutigen x-Wert alles zu einer eigenen Gruppe gehört.Wenn Sie Prozentsätze auf der y-Achse und Beschriftungen auf den Balken wünschen :
Wenn Sie die Balkenbeschriftungen hinzufügen, möchten Sie möglicherweise die y-Achse für ein übersichtlicheres Diagramm weglassen, indem Sie am Ende Folgendes hinzufügen:
quelle
Wenn Sie prozentuale Beschriftungen, aber tatsächliche Ns auf der y-Achse wünschen , versuchen Sie Folgendes:
quelle
Hier ist eine Problemumgehung für facettierte Daten. (Die akzeptierte Antwort von @Andrew funktioniert in diesem Fall nicht.) Die Idee ist, den Prozentwert mit dplyr zu berechnen und dann mit geom_col das Diagramm zu erstellen.
Dies ist die Handlung:
quelle
Beachten Sie, dass Sie, wenn Ihre Variable kontinuierlich ist, geom_histogram () verwenden müssen, da die Funktion die Variable nach "Bins" gruppiert.
quelle