R ggplot2: stat_count () ne doit pas être utilisé avec une erreur esthétique dans le graphique à barres

89

J'obtiens cette erreur en traçant un graphique à barres et je ne suis pas en mesure de m'en débarrasser, j'ai essayé à la fois qplot et ggplot mais toujours la même erreur.

Voici mon code:

 library(dplyr)
 library(ggplot2)

 #Investigate data further to build a machine learning model
 data_country = data %>%
           group_by(country) %>%
           summarise(conversion_rate = mean(converted))
  #Ist method
  qplot(country, conversion_rate, data = data_country,geom = "bar", stat ="identity", fill =   country)
  #2nd method
  ggplot(data_country)+aes(x=country,y = conversion_rate)+geom_bar()

Erreur:

  stat_count() must not be used with a y aesthetic

Données dans data_country:

    country conversion_rate
    <fctr>           <dbl>
  1   China     0.001331558
  2 Germany     0.062428188
  3      UK     0.052612025
  4      US     0.037800687

L'erreur vient dans le graphique à barres et non dans le graphique en pointillés.

Uasthana
la source

Réponses:

147

Tout d'abord, votre code est un peu décalé. aes()est un argument dans ggplot(), vous n'utilisez pas ggplot(...)+aes(...) + layers

Deuxièmement, à partir du fichier d'aide ?geom_bar:

Par défaut, geom_bar utilise stat = "count" qui rend la hauteur de la barre proportionnelle au nombre de cas dans chaque groupe (ou si le poids éthétique est fourni, la somme des poids). Si vous voulez que les hauteurs des barres représentent les valeurs dans les données, utilisez stat = "identity" et mappez une variable à l'esthétique y.

Vous voulez le deuxième cas, où la hauteur de la barre est égale à conversion_ratedonc ce que vous voulez c'est ...

data_country <- data.frame(country = c("China", "Germany", "UK", "US"), 
            conversion_rate = c(0.001331558,0.062428188, 0.052612025, 0.037800687))
ggplot(data_country, aes(x=country,y = conversion_rate)) +geom_bar(stat = "identity")

Résultat:

entrez la description de l'image ici

Chrisss
la source
1
Oui, cela a fonctionné merci de l'avoir expliqué, je suis un peu nouveau dans ce
domaine.appréciez
La clarification aesest en fait une fonction. L'argument ggplotest mapping. Nous fournissons ce mappage via la aesfonction, de sorte que vous voyez ggplot(df, aes(...))beaucoup le modèle . Mais le motif ggplot (data_frame) + aes (x = X, y = Y) convient également. En plus d'une meilleure lisibilité, l'appel aesséparé peut être utilisé pour modifier l'esthétique d'un tracé prédéfini: p <- ggplot (iris) + aes (x = Species, y = Sepal.Length) + geom_point (); q <- p + aes (y = Petal.Length)
teofil
7

lorsque vous souhaitez utiliser vos données existantes dans votre bloc de données comme valeur y, vous devez ajouter stat = "identity" dans le paramètre de mappage. La fonction geom_bar a la valeur y par défaut. Par exemple,

ggplot(data_country)+
  geom_bar(mapping = aes(x = country, y = conversion_rate), stat = "identity")
user11366761
la source
5

Vous pouvez utiliser geom_col () directement. Voir les différences entre geom_bar () et geom_col () dans ce lien https://ggplot2.tidyverse.org/reference/geom_bar.html

geom_bar () rend la hauteur de la barre proportionnelle au nombre d'observations dans chaque groupe Si vous voulez que les hauteurs des barres représentent des valeurs dans les données, utilisez plutôt geom_col ().

ggplot(data_country)+aes(x=country,y = conversion_rate)+geom_col()
Poisson d'or salé
la source
Je peux confirmer que j'avais ce problème et que c'était la solution la plus simple.
Spence_p le
0

Je cherchais la même chose et cela peut aussi fonctionner

p.Wages.all.A_MEAN <- Wages.all %>%
                  group_by(`Career Cluster`, Year)%>%
                  summarize(ANNUAL.MEAN.WAGE = mean(A_MEAN))

names (p.Wages.all.A_MEAN) [1] "Career Cluster" "Year" "ANNUAL.MEAN.WAGE"

p.Wages.all.a.mean <- ggplot(p.Wages.all.A_MEAN, aes(Year, ANNUAL.MEAN.WAGE , color= `Career Cluster`))+
                  geom_point(aes(col=`Career Cluster` ), pch=15, size=2.75, alpha=1.5/4)+
                  theme(axis.text.x = element_text(color="#993333",  size=10, angle=0)) #face="italic",
p.Wages.all.a.mean
Seyma Kalay
la source