R ggplot2: stat_count () nie może być używane z estetycznym błędem w wykresie słupkowym

91

Otrzymuję ten błąd podczas kreślenia wykresu słupkowego i nie jestem w stanie się go pozbyć, próbowałem zarówno qplot, jak i ggplot, ale nadal ten sam błąd.

Oto mój kod:

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

Błąd:

  stat_count() must not be used with a y aesthetic

Dane w data_country:

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

Błąd pojawia się na wykresie słupkowym, a nie na wykresie kropkowanym.

Uasthana
źródło

Odpowiedzi:

149

Po pierwsze, twój kod jest trochę uszkodzony. aes()jest argumentem w ggplot(), nie używasz ggplot(...)+aes(...) + layers

Po drugie, z pliku pomocy ?geom_bar:

Domyślnie geom_bar używa stat = "count", co powoduje, że wysokość słupka jest proporcjonalna do liczby obserwacji w każdej grupie (lub, jeśli podano wagę, suma wag). Jeśli chcesz, aby wysokości słupków reprezentowały wartości w danych, użyj stat = "identity" i przypisz zmienną do estetyki y.

Chcesz drugi przypadek, w którym wysokość paska jest równa conversion_rateWięc to, czego chcesz, to ...

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

Wynik:

wprowadź opis obrazu tutaj

Chrisss
źródło
1
Tak, dzięki za wyjaśnienie, jestem trochę nowy w tym, doceniam twoją pomoc
Uasthana
Wyjaśnienie aesjest w rzeczywistości funkcją. Argumentem ggplotjest mapping. Zapewniamy to mapowanie za pomocą aesfunkcji, więc często widzisz wzór ggplot(df, aes(...)). Ale wzór ggplot (data_frame) + aes (x = X, y = Y) też jest w porządku. Oprócz możliwej poprawy czytelności, aesosobne wywołanie może być użyte do modyfikacji estetyki na gotowym wykresie: p <- ggplot (tęczówka) + aes (x = Gatunek, y = Sepal.Length) + geom_point (); q <- p + aes (y = długość płatka)
teofil
7

jeśli chcesz użyć danych istniejących w ramce danych jako wartości y, musisz dodać stat = "identity" w parametrze mapowania. Funkcja geom_bar ma domyślną wartość y. Na przykład,

ggplot(data_country)+
  geom_bar(mapping = aes(x = country, y = conversion_rate), stat = "identity")
user11366761
źródło
6

Możesz bezpośrednio użyć geom_col (). Zobacz różnice między geom_bar () i geom_col () w tym linku https://ggplot2.tidyverse.org/reference/geom_bar.html

geom_bar () sprawia, że ​​wysokość słupka jest proporcjonalna do liczby obserwacji w każdej grupie Jeśli chcesz, aby wysokości słupków reprezentowały wartości w danych, użyj zamiast tego funkcji geom_col ().

ggplot(data_country)+aes(x=country,y = conversion_rate)+geom_col()
Słona złota ryba
źródło
Potwierdzam, że miałem ten problem i to było najprostsze rozwiązanie.
Spence_p
0

Szukałem tego samego i to też może się udać

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

nazwy (p.Wages.all.A_MEAN) [1] "Klaster kariery" "Rok" "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
źródło