อธิบายคำเตือน ggplot2: "ลบ k แถวที่มีค่าที่ขาดหายไป"


90

ggplotฉันได้รับการเตือนนี้เมื่อฉันพยายามที่จะสร้างพล็อตด้วย

หลังจากค้นคว้าข้อมูลทางออนไลน์มาระยะหนึ่งหลายคนแนะนำว่าฐานข้อมูลของฉันมีค่าว่างหรือข้อมูลที่ขาดหายไปโดยทั่วไปซึ่งไม่เป็นเช่นนั้น

ในคำถามนี้คำตอบที่ยอมรับมีดังต่อไปนี้:

คำเตือนหมายความว่าองค์ประกอบบางส่วนจะถูกลบออกเนื่องจากอยู่นอกช่วงที่ระบุ

ฉันสงสัยว่าช่วงนี้อ้างถึงอะไรกันแน่และใครบางคนสามารถเพิ่มช่วงนี้ด้วยตนเองเพื่อหลีกเลี่ยงคำเตือนทั้งหมดได้อย่างไร


5
มีข้อ จำกัด เกี่ยวกับyแกนของคำถามนั้น ค่าถูก จำกัด ระหว่าง 0 ถึง 0.12 เนื่องจากฟังก์ชันนี้:ylim(0,0.12)
LyzandeR

1
ตัวอย่างที่ทำซ้ำได้จะช่วยตอบคำถามได้ @LyzandeR ดูเหมือนจะไปถูกทางแล้ว
vpipkt

คำตอบ:


85

พฤติกรรมที่คุณเห็นเกิดจากการggplot2จัดการกับข้อมูลที่อยู่นอกช่วงแกนของพล็อต คุณสามารถเปลี่ยนลักษณะการทำงานนี้ได้ขึ้นอยู่กับว่าคุณใช้scale_y_continuous(หรือเทียบเท่าylim) หรือcoord_cartesianกำหนดช่วงแกนตามที่อธิบายไว้ด้านล่าง

library(ggplot2)

# All points are visible in the plot
ggplot(mtcars, aes(mpg, hp)) + 
  geom_point()

ในโค้ดด้านล่างจุดหนึ่งที่มี hp = 335 อยู่นอกช่วง y ของพล็อต นอกจากนี้เนื่องจากเราเคยscale_y_continuousกำหนดช่วงแกน y จุดนี้จึงไม่รวมอยู่ในสถิติอื่น ๆ หรือการวัดสรุปที่คำนวณโดย ggplot เช่นเส้นการถดถอยเชิงเส้น

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,335) and the warning disappars
  geom_smooth(method="lm")

Warning messages:
1: Removed 1 rows containing missing values (stat_smooth). 
2: Removed 1 rows containing missing values (geom_point).

ในโค้ดด้านล่างจุดที่มี hp = 335 ยังคงอยู่นอกช่วง y ของพล็อต แต่อย่างไรก็ตามจุดนี้ยังรวมอยู่ในสถิติหรือการวัดสรุปที่ ggplot คำนวณเช่นเส้นการถดถอยเชิงเส้น เนื่องจากเราใช้coord_cartesianกำหนดช่วงแกน y และฟังก์ชันนี้ไม่รวมจุดที่อยู่นอกช่วงพล็อตเมื่อทำการคำนวณอื่น ๆ กับข้อมูล

หากคุณเปรียบเทียบสิ่งนี้กับพล็อตก่อนหน้าคุณจะเห็นว่าเส้นถดถอยเชิงเส้นในพล็อตที่สองมีความชันที่ชันกว่าเล็กน้อยเนื่องจากจุดที่มี hp = 335 รวมอยู่ในการคำนวณเส้นการถดถอยแม้ว่าจะมองไม่เห็นในพล็อต .

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")

12

เพียงแค่เขย่าเพื่อตอบคำตอบที่ได้รับจาก eipi10

ผมก็ประสบปัญหาเดียวกันโดยไม่ต้องใช้มิได้scale_y_continuouscoord_cartesian

ความขัดแย้งมาจากแกน x limits = c(1, 30)ที่ฉันกำหนด ดูเหมือนว่าขีด จำกัด ดังกล่าวจะไม่มีพื้นที่เพียงพอหากคุณต้องการ "หลบ" แท่งของคุณดังนั้น R ยังคงแสดงข้อผิดพลาด

ลบ 8 แถวที่มีค่าที่ขาดหายไป (geom_bar)

การปรับขีด จำกัด ของแกน x เพื่อlimits = c(0, 31)แก้ไขปัญหา

สรุปได้ว่าแม้ว่าคุณจะไม่ได้ จำกัด แกน y ของคุณให้ตรวจสอบพฤติกรรมของแกน x เพื่อให้แน่ใจว่าคุณมีพื้นที่เพียงพอ


นี่พลาดบ่อยมาก โดยคนเดียวกัน. อีกครั้ง ... ถอนหายใจขอบคุณ!
Genom

1

แม้ว่าข้อมูลของคุณจะอยู่ในขีด จำกัด ที่คุณระบุไว้ (เช่นc(0, 335)) การเพิ่มgeom_jitter()คำสั่งอาจผลักดันบางจุดที่อยู่นอกขีด จำกัด เหล่านั้นทำให้เกิดข้อความแสดงข้อผิดพลาดเดียวกัน

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))


# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

สร้างเมื่อ 2020-08-24 โดยแพ็คเกจ reprex (v0.3.0)


0

ฉันพบสิ่งนี้เช่นกัน แต่ในกรณีที่ฉันต้องการหลีกเลี่ยงข้อความแสดงข้อผิดพลาดเพิ่มเติมในขณะที่รักษาช่วงที่ให้ไว้ นอกจากนี้ยังมีตัวเลือกในการย่อยข้อมูลก่อนที่จะตั้งค่าช่วงเพื่อให้สามารถเก็บช่วงได้ตามที่คุณต้องการโดยไม่มีคำเตือน

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.