wake-up-neo.net

Zeige% anstelle von Zählungen in Diagrammen der kategorialen Variablen

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

147

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

 enter image description here

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:

 enter image description here

204
Andrew

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.

55
Ramnath

Mit ggplot2 Version 2.1.0 ist es so

+ scale_y_continuous(labels = scales::percent)
42
Fabian Hertwig

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.

30
Olivier Ma

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")

 enter image description here

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()
  )

 enter image description here

18
Sam Firke

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:

 enter image description here

6
ACNB

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)
6
Steve Powell

Für diejenigen, die nach 2018 kommen, ersetzen Sie "labels = percent_format ()" durch "scales :: percent".

3
Ghazal

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..))) 
0
Rtist