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

Результат:

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

Chrisss
источник
1
Да, это сработало, спасибо за объяснение, я немного новичок в этом, ценю вашу помощь
Уастхана
Разъяснение, aesна самом деле функция. Аргумент ggplotесть mapping. Мы обеспечиваем это сопоставление с помощью aesфункции, поэтому вы часто видите шаблон ggplot(df, aes(...)). Но шаблон ggplot (data_frame) + aes (x = X, y = Y) тоже подойдет. Помимо, возможно, улучшенной читабельности, вызов по aesотдельности может использоваться для изменения эстетики готового графика: p <- ggplot (iris) + aes (x = Species, 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")
user11366761
источник
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
Сейма Калай
источник