Giải thích cảnh báo ggplot2: "Đã xóa k hàng chứa giá trị bị thiếu"


89

Tôi nhận được cảnh báo này khi tôi đang cố tạo ra một âm mưu với ggplot.

Sau khi nghiên cứu trực tuyến một thời gian, nhiều người cho rằng cơ sở dữ liệu của tôi chứa các giá trị rỗng hoặc dữ liệu bị thiếu nói chung, điều này không đúng.

Trong câu hỏi này, câu trả lời được chấp nhận cho biết như sau:

Cảnh báo có nghĩa là một số phần tử bị xóa vì chúng nằm ngoài phạm vi được chỉ định

Tôi đã tự hỏi chính xác phạm vi này đề cập đến điều gì và làm cách nào để ai đó có thể tăng phạm vi này theo cách thủ công để tránh tất cả các cảnh báo?


5
Có một giới hạn về ytrục cho câu hỏi đó. Các giá trị được giới hạn từ 0 đến 0,12 vì chức năng này:ylim(0,0.12)
LyzandeR

1
Một ví dụ có thể tái tạo sẽ giúp trả lời câu hỏi. @LyzandeR có vẻ đang đi đúng hướng.
vpipkt

Câu trả lời:


84

Hành vi bạn đang thấy là do cách ggplot2xử lý dữ liệu nằm ngoài phạm vi trục của biểu đồ. Bạn có thể thay đổi hành vi này tùy thuộc vào việc bạn sử dụng scale_y_continuous(hoặc, tương đương ylim) hoặc coord_cartesianđể đặt các dải trục, như được giải thích bên dưới.

library(ggplot2)

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

Trong đoạn mã dưới đây, một điểm có hp = 335 nằm ngoài phạm vi y của biểu đồ. Ngoài ra, vì chúng tôi đã sử dụng scale_y_continuousđể đặt phạm vi trục y, điểm này không được bao gồm trong bất kỳ số liệu thống kê hoặc đo lường tóm tắt nào khác được tính bằng ggplot, chẳng hạn như đường hồi quy tuyến tính.

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

Trong đoạn mã dưới đây, điểm có hp = 335 vẫn nằm ngoài phạm vi y của biểu đồ, nhưng điểm này vẫn được đưa vào bất kỳ số liệu thống kê hoặc thước đo tóm tắt nào mà ggplot tính toán, chẳng hạn như đường hồi quy tuyến tính. Điều này là do chúng tôi đã sử dụng coord_cartesianđể đặt phạm vi trục y và hàm này không loại trừ các điểm nằm ngoài phạm vi biểu đồ khi nó thực hiện các phép tính khác trên dữ liệu.

Nếu bạn so sánh phần này và phần trước, bạn có thể thấy rằng đường hồi quy tuyến tính trong phần thứ hai có độ dốc lớn hơn một chút, vì điểm có hp = 335 được đưa vào khi tính toán đường hồi quy, mặc dù nó không hiển thị trong phần .

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

11

Chỉ cần lắc hoàn thành câu trả lời do eipi10 đưa ra.

Tôi đã phải đối mặt với cùng một vấn đề, mà không sử dụng scale_y_continuouscũng không coord_cartesian.

Xung đột đến từ trục x, nơi tôi đã xác định limits = c(1, 30). Có vẻ như giới hạn như vậy không cung cấp đủ không gian nếu bạn muốn "né" các thanh của mình, vì vậy R vẫn ném lỗi

Đã xóa 8 hàng chứa các giá trị bị thiếu (geom_bar)

Điều chỉnh các giới hạn của trục x để limits = c(0, 31)giải quyết vấn đề.

Tóm lại, ngay cả khi bạn không đặt giới hạn cho trục y của mình, hãy kiểm tra hành vi trục x của bạn để đảm bảo bạn có đủ không gian


Điều này thường bị bỏ qua. Bởi cùng một người. Một lần nữa sau một thời gian ... thở dài Cảm ơn!
Genom

1

Ngay cả khi dữ liệu của bạn nằm trong giới hạn đã chỉ định của bạn (ví dụ c(0, 335)), việc thêm một geom_jitter()câu lệnh có thể đẩy một số điểm ra ngoài các giới hạn đó, tạo ra cùng một thông báo lỗi.

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

Được tạo vào 2020-08-24 bởi gói reprex (v0.3.0)


0

Tôi cũng gặp phải vấn đề này, nhưng trong trường hợp tôi muốn tránh các thông báo lỗi bổ sung trong khi vẫn giữ phạm vi được cung cấp. Một tùy chọn cũng là đặt dữ liệu con trước khi đặt phạm vi, để phạm vi có thể được giữ theo cách bạn muốn mà không gây ra cảnh báo.

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.