Ich zeichne eine kategoriale Variable und anstatt die Zählwerte für jeden Kategoriewert anzuzeigen.
Ich suche nach einer Möglichkeit, ggplot
die prozentualen Werte in dieser Kategorie anzuzeigen. Natürlich ist es möglich, eine andere Variable mit dem berechneten Prozentsatz zu erstellen und diesen darzustellen, aber ich muss es mehrere Dutzend Male tun, und ich hoffe, dass dies mit einem Befehl erreicht wird.
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 bekam.
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 qplot
verwenden, aber die richtige Verwendung von stat_bin 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. Ich kratzte mich am Kopf und googling für diesen Fehler ergibt ein einzelnes Ergebnis .
Seitdem dies beantwortet wurde, hat es einige bedeutende Änderungen an der ggplot
-Syntax gegeben. Fassen Sie die Diskussion in den obigen Kommentaren zusammen:
require(ggplot2)
require(scales)
p <- ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
## version 3.0.0
scale_y_continuous(labels=percent)
Hier ist ein reproduzierbares Beispiel mit mtcars
:
ggplot(mtcars, aes(x = factor(hp))) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(labels = percent) ## version 3.0.0
Diese Frage ist derzeit der # 1-Hit auf Google für "ggplot count vs. percent histogram". Dies hilft hoffentlich dabei, alle Informationen, die derzeit in Kommentaren der akzeptierten Antwort enthalten sind, zu destillieren.
Anmerkung: Wenn hp
nicht als Faktor festgelegt ist, gibt ggplot Folgendes zurück:
dieser modifizierte Code sollte funktionieren
p = ggplot(mydataf, aes(x = foo)) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent')
wenn Ihre Daten über NAs verfügen und Sie nicht möchten, dass sie in die Zeichnung aufgenommen werden, übergeben Sie na.omit (mydataf) als Argument an ggplot.
hoffe das hilft.
Mit ggplot2 Version 2.1.0 ist es so
+ scale_y_continuous(labels = scales::percent)
Ab März 2017, mit ggplot2
2.2.1, denke ich, dass die beste Lösung in Hadley Wickhams R für Data Science Book erklärt wird:
ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1))
stat_count
berechnet zwei Variablen: count
wird standardmäßig verwendet. Sie können jedoch prop
verwenden, um die Proportionen anzuzeigen.
Wenn Sie Prozentsätze auf der y-Achse haben möchten, sind und auf den Balken beschriftet:
library(ggplot2)
library(scales)
ggplot(mtcars, aes(x = as.factor(am))) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
scale_y_continuous(labels = percent) +
labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission")
Wenn Sie die Leistenbeschriftungen hinzufügen, möchten Sie möglicherweise die y-Achse eines saubereren Diagramms weglassen, indem Sie am Ende Folgendes hinzufügen:
theme(
axis.text.y=element_blank(), axis.ticks=element_blank(),
axis.title.y=element_blank()
)
Hier ist eine Problemumgehung für facettierte Daten. (Die akzeptierte Antwort von @Andrew funktioniert in diesem Fall nicht.) Die Idee ist, den Prozentsatz mit dplyr zu berechnen und dann mit geom_col den Plot zu erstellen.
library(ggplot2)
library(scales)
library(magrittr)
library(dplyr)
binwidth <- 30
mtcars.stats <- mtcars %>%
group_by(cyl) %>%
mutate(bin = cut(hp, breaks=seq(0,400, binwidth),
labels= seq(0+binwidth,400, binwidth)-(binwidth/2)),
n = n()) %>%
group_by(cyl, bin) %>%
summarise(p = n()/n[1]) %>%
ungroup() %>%
mutate(bin = as.numeric(as.character(bin)))
ggplot(mtcars.stats, aes(x = bin, y= p)) +
geom_col() +
scale_y_continuous(labels = percent) +
facet_grid(cyl~.)
Dies ist die Handlung:
Wenn Sie prozentuale labels aber tatsächliche Ns auf der y-Achse wünschen, versuchen Sie Folgendes:
library(scales)
perbar=function(xx){
q=ggplot(data=data.frame(xx),aes(x=xx))+
geom_bar(aes(y = (..count..)),fill="orange")
q=q+ geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen")
q
}
perbar(mtcars$disp)
Für diejenigen, die nach 2018 kommen, ersetzen Sie "labels = percent_format ()" durch "scales :: percent".
Wenn Ihre Variable stetig ist, müssen Sie geom_histogram () verwenden, da die Funktion die Variable nach "Bins" gruppiert.
df <- data.frame(V1 = rnorm(100))
ggplot(df, aes(x = V1)) +
geom_histogram(aes(y = (..count..)/sum(..count..)))
# if you use geom_bar(), with factor(V1), each value of V1 will be treated as a
# different category. In this case this does not make sense, as the variable is
# really continuous. With the hp variable of the mtcars (see previous answer), it
# worked well since hp was not really continuous (check unique(mtcars$hp)), and one
# can want to see each value of this variable, and not to group it in bins.
ggplot(df, aes(x = factor(V1))) +
geom_bar(aes(y = (..count..)/sum(..count..)))