R ggplot2: stat_count () не можна використовувати з естетичною помилкою на гістограмі


91

Я отримую цю помилку під час побудови гістограми, і я не можу її позбутися, я пробував як qplot, так і ggplot, але все одно та ж помилка.

Далі мій код:

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

Помилка:

  stat_count() must not be used with a y aesthetic

Дані в data_country:

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

Помилка з’являється на гістограмі, а не на пунктирній діаграмі.

Відповіді:


149

По-перше, ваш код трохи не працює. aes()є аргументом у ggplot(), ви не використовуєте ggplot(...)+aes(...) + layers

По-друге, з довідкового файлу ?geom_bar:

За замовчуванням geom_bar використовує stat = "count", що робить висоту штанги пропорційною кількості випадків у кожній групі (або, якщо надається ваговий естетичний, сума ваг). Якщо ви хочете, щоб висоти стовпчиків представляли значення в даних, використовуйте stat = "identity" та зіставляйте змінну з y естетикою.

Вам потрібен другий випадок, коли висота штанги дорівнює conversion_rateОтже, що ви хочете - це ...

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

Результат:

введіть тут опис зображення


1
Так, це спрацювало, дякуючи за пояснення, я трохи новачок у цьому, ціную вашу допомогу
Уастана

Уточнення, aesнасправді є функцією. Аргументом ggplotє mapping. Ми пропонуємо це відображення через aesфункцію, так що ви бачите шаблон ggplot(df, aes(...))багато. Але шаблон ggplot (data_frame) + aes (x = X, y = Y) теж прекрасний. Окрім можливо покращеної читабельності, aesокремий виклик може бути використаний для модифікації естетики попередньо виготовленого сюжету: p <- ggplot (ірис) + aes (x = Види, y = Sepal.Length) + geom_point (); q <- p + aes (y = Petal.Length)
теофіл

7

коли ви хочете використовувати дані, що існують у вашому фреймі даних, як значення y, ви повинні додати stat = "identity" у параметр відображення. Функція geom_bar має значення y за замовчуванням. Наприклад,

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

6

Ви можете використовувати безпосередньо geom_col (). Дивіться різницю між geom_bar () та geom_col () за цим посиланням https://ggplot2.tidyverse.org/reference/geom_bar.html

geom_bar () робить висоту стовпця пропорційною кількості випадків у кожній групі. Якщо ви хочете, щоб висоти стовпчиків представляли значення в даних, використовуйте натомість geom_col ().

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

Я можу підтвердити, що у мене була ця проблема, і це було найпростіше рішення.
Spence_p

0

Я шукав те саме, і це також може спрацювати

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

імена (p.Wages.all.A_MEAN) [1] "Кластер кар'єри" "Рік" "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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.