R ggplot2: stat_count () non deve essere utilizzato con un errore estetico nel grafico a barre


89

Ricevo questo errore durante il tracciamento di un grafico a barre e non sono in grado di eliminarlo, ho provato sia qplot che ggplot ma sempre lo stesso errore.

Di seguito è il mio codice:

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

Errore:

  stat_count() must not be used with a y aesthetic

Dati in data_country:

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

L'errore sta arrivando nel grafico a barre e non nel grafico tratteggiato.

Risposte:


147

Prima di tutto, il tuo codice è un po 'spento. aes()è un argomento in ggplot(), non usi ggplot(...)+aes(...) + layers

Secondo, dal file della guida ?geom_bar:

Per impostazione predefinita, geom_bar utilizza stat = "count" che rende l'altezza della barra proporzionale al numero di casi in ogni gruppo (o se viene fornita l'estetica del peso, la somma dei pesi). Se desideri che le altezze delle barre rappresentino i valori nei dati, utilizza stat = "identity" e associa una variabile all'estetica y.

Vuoi il secondo caso, dove l'altezza della barra è uguale al conversion_rateQuindi quello che vuoi è ...

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

Risultato:

inserisci qui la descrizione dell'immagine


1
Sì, ha funzionato, grazie per averlo spiegato, sono un po 'nuovo per questo apprezzo il tuo aiuto
Uasthana

La chiarificazione, aesinfatti , è una funzione. L'argomento ggplotè mapping. Forniamo questa mappatura attraverso la aesfunzione, quindi puoi vedere molto lo schema ggplot(df, aes(...)). Ma anche il pattern ggplot (data_frame) + aes (x = X, y = Y) va bene. A parte un possibile miglioramento della leggibilità, la chiamata aesseparatamente può essere utilizzata per modificare l'estetica di un grafico predefinito: p <- ggplot (iris) + aes (x = Species, y = Sepal.Length) + geom_point (); q <- p + aes (y = Petal.Length)
teofil

7

quando si desidera utilizzare i dati esistenti nel frame di dati come valore y, è necessario aggiungere stat = "identity" nel parametro di mappatura. La funzione geom_bar ha un valore y predefinito. Per esempio,

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

5

Puoi usare geom_col () direttamente. Guarda le differenze tra geom_bar () e geom_col () in questo link https://ggplot2.tidyverse.org/reference/geom_bar.html

geom_bar () rende l'altezza della barra proporzionale al numero di casi in ogni gruppo Se si desidera che le altezze delle barre rappresentino i valori nei dati, utilizzare invece geom_col ().

ggplot(data_country)+aes(x=country,y = conversion_rate)+geom_col()

Posso confermare di aver avuto questo problema e questa è stata la soluzione più semplice.
Spence_p

0

Stavo cercando lo stesso e anche questo potrebbe funzionare

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

nomi (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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.