Làm thế nào để đối phó với lỗi "dữ liệu của lớp không hợp lệ" từ ggplot2?


101

Trong khi cố gắng phủ một dòng mới lên ggplot hiện có, tôi gặp lỗi sau:

Error: ggplot2 doesn't know how to deal with data of class uneval

Phần đầu tiên của mã của tôi hoạt động tốt. Dưới đây là hình ảnh dữ liệu sản xuất gió hàng giờ "gần đây" từ thị trường năng lượng điện vùng Trung Tây Hoa Kỳ.

Dữ liệu gió hàng giờ gần đây

Bây giờ tôi muốn phủ màu Đỏ cho giá trị quan sát trong hai ngày qua. Nó sẽ dễ dàng nhưng tôi không thể tìm ra lý do tại sao tôi gặp lỗi.

Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao.

Dưới đây là một ví dụ có thể tái tạo:

# Read in Wind data
fname <- "https://www.midwestiso.org/Library/Repository/Market%20Reports/20130510_hwd_HIST.csv"
df <- read.csv(fname, header=TRUE, sep="," , skip=7)
df <- df[1:(length(df$MKTHOUR)-5),]

# format variables
df$MWh <- as.numeric(df$MWh)
df$Datetime <- strptime(df$MKTHOUR, "%m/%d/%y %I:%M %p")

# Create some variables
df$Date  <- as.Date(df$Datetime)
df$HrEnd <- df$Datetime$hour+1

# Subset recent and last data
last.obs  <- range(df$Date)[2]
df.recent <- subset(df, Date %in% seq(last.obs-30, last.obs-2, by=1))
df.last   <- subset(df, Date %in% seq(last.obs-2,  last.obs,   by=1))

# plot recent in Grey
p <- ggplot(df.recent, aes(HrEnd, MWh, group=factor(Date))) + 
  geom_line(color="grey") +
  scale_y_continuous(labels = comma) + 
  scale_x_continuous(breaks = seq(1,24,1)) +
  labs(y="MWh") + 
  labs(x="Hour Ending") + 
  labs(title="Hourly Wind Generation")    
p

# plot last two days in Red
p <- p + geom_line(df.last, aes(HrEnd, MWh, group=factor(Date)), color="red")  
p

Câu trả lời:


165

khi bạn thêm tập dữ liệu mới vào geom, bạn cần sử dụng data=đối số. Hoặc đặt các đối số theo thứ tự thích hợp mapping=..., data=.... Hãy xem các đối số cho ?geom_line.

Như vậy:

p + geom_line(data=df.last, aes(HrEnd, MWh, group=factor(Date)), color="red") 

Hoặc là:

p + geom_line(aes(HrEnd, MWh, group=factor(Date)), df.last, color="red") 

1
ouch thật là đáng xấu hổ !! nhưng tôi sẽ không bao giờ phạm sai lầm đó nữa. Cảm ơn Justin
MikeTP

36
Không, không phải! và có bạn sẽ làm được! Rất vui vì tôi có thể hướng bạn đi đúng hướng và bây giờ nó ở đây cho hậu thế.
Justin

13

Một nguyên nhân khác là vô tình đặt data=...bên trong aes(...)thay vì bên ngoài:

RIGHT:
ggplot(data=df[df$var7=='9-06',], aes(x=lifetime,y=rep_rate,group=mdcp,color=mdcp) ...)

WRONG:
ggplot(aes(data=df[df$var7=='9-06',],x=lifetime,y=rep_rate,group=mdcp,color=mdcp) ...)

Đặc biệt, điều này có thể xảy ra khi bạn tạo nguyên mẫu lệnh cốt truyện của mình với qplot(), lệnh này không sử dụng lệnh rõ ràng aes(), sau đó chỉnh sửa / sao chép và dán nó vàoggplot()

qplot(data=..., x=...,y=..., ...)

ggplot(data=..., aes(x=...,y=...,...))

Rất tiếc thông báo lỗi của ggplot không Thiếu đối số 'dữ liệu'! thay vì điều vô nghĩa khó hiểu này, vì đó là ý nghĩa của thông điệp này.


4

Điều này cũng có thể xảy ra nếu bạn tham chiếu đến một biến trong data.frame không tồn tại. Ví dụ, gần đây tôi đã quên yêu cầu ddply tóm tắt bằng một trong các biến của tôi mà tôi đã sử dụng trong geom_line để chỉ định màu đường. Sau đó, ggplot không biết tìm biến mà tôi chưa tạo trong bảng tóm tắt ở đâu và tôi gặp lỗi này.


6
Lỗi này cũng có thể xảy ra nếu bạn quên đặt ggplot bằng +. Tôi vô tình sử dụng toán tử%>% của dplyr và ggplot không nhận được các dòng cần thiết để hoàn thành cốt truyện.
Dan Jarratt
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.