R ggplot2: stat_count () no debe usarse con un error estético ay en el gráfico de barras

91

Recibo este error al trazar un gráfico de barras y no puedo deshacerme de él, he probado tanto qplot como ggplot, pero sigo teniendo el mismo error.

A continuación está mi código:

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

Error:

  stat_count() must not be used with a y aesthetic

Datos en data_country:

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

El error viene en el gráfico de barras y no en el gráfico de puntos.

Uasthana
fuente

Respuestas:

149

En primer lugar, su código está un poco fuera de lugar. aes()es un argumento en ggplot(), no usas ggplot(...)+aes(...) + layers

En segundo lugar, del archivo de ayuda ?geom_bar:

Por defecto, geom_bar usa stat = "count" que hace que la altura de la barra sea proporcional al número de cajas en cada grupo (o si se proporciona la estética de peso, la suma de los pesos). Si desea que las alturas de las barras representen valores en los datos, use stat = "identity" y asigne una variable a la estética y.

Quieres el segundo caso, donde la altura de la barra es igual a la conversion_rateEntonces lo que quieres es ...

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

Resultado:

ingrese la descripción de la imagen aquí

Chrisss
fuente
1
Sí, eso funcionó gracias por explicarlo, soy un poco nuevo en esto, agradezco su ayuda
Uasthana
La aclaración, aeses de hecho una función. El argumento de ggplotes mapping. Proporcionamos ese mapeo a través de la aesfunción, para que vea mucho el patrón ggplot(df, aes(...)). Pero el patrón ggplot (data_frame) + aes (x = X, y = Y) también está bien. Aparte de una legibilidad posiblemente mejorada, las llamadas por aesseparado se pueden usar para modificar la estética en un gráfico prefabricado: p <- ggplot (iris) + aes (x = Species, y = Sepal.Length) + geom_point (); q <- p + aes (y = Petal.Length)
teofil
7

cuando desee utilizar sus datos existentes en su marco de datos como valor y, debe agregar stat = "identity" en el parámetro de mapeo. La función geom_bar tiene el valor y predeterminado. Por ejemplo,

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

Puede usar geom_col () directamente. Vea las diferencias entre geom_bar () y geom_col () en este enlace https://ggplot2.tidyverse.org/reference/geom_bar.html

geom_bar () hace que la altura de la barra sea proporcional al número de casos en cada grupo. Si desea que las alturas de las barras representen valores en los datos, utilice geom_col () en su lugar.

ggplot(data_country)+aes(x=country,y = conversion_rate)+geom_col()
Pescado dorado salado
fuente
Puedo confirmar que había tenido este problema y que esta era la solución más simple.
Spence_p
0

Estaba buscando lo mismo y esto también puede funcionar.

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

nombres (p.Wages.all.A_MEAN) [1] "Grupo de carreras" "Año" "SALARIO.MEAN.ANUAL"

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
fuente