ต้องไม่ใช้ R ggplot2: stat_count () โดยมีข้อผิดพลาดเกี่ยวกับสุนทรียศาสตร์ในกราฟแท่ง


92

ฉันได้รับข้อผิดพลาดนี้ขณะพล็อตกราฟแท่งและฉันไม่สามารถกำจัดมันได้ฉันได้ลองทั้ง 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

ข้อผิดพลาดเกิดขึ้นในแผนภูมิแท่งและไม่อยู่ในแผนภูมิเส้นประ

คำตอบ:


151

ก่อนอื่นรหัสของคุณเป็นบิตปิด 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
ใช่ที่ได้ผลขอบคุณสำหรับการอธิบายฉันรู้สึกใหม่เล็กน้อยสำหรับเรื่องนี้ขอขอบคุณสำหรับความช่วยเหลือของคุณ
Uasthana

การชี้แจง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)
teofil

ตั้งแต่ปี 2020 (และนานก่อนหน้านี้) ggplot(...) + aes(...) + layersเป็นเรื่องปกติ
Ofek Shilon

8

เมื่อคุณต้องการใช้ข้อมูลของคุณที่มีอยู่ในกรอบข้อมูลของคุณเป็นค่า y คุณต้องเพิ่ม stat = "identity" ในพารามิเตอร์การแมป ฟังก์ชัน geom_bar มีค่า y เริ่มต้น ตัวอย่างเช่น,

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

7

คุณสามารถใช้ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.