Как бороться с ошибкой «данные класса невалидно» из ggplot2?

101

При попытке наложить новую строку на существующий ggplot я получаю следующую ошибку:

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

Первая часть моего кода работает нормально. Ниже приведено изображение "последних" почасовых данных о ветроэнергетике на рынке электроэнергии Среднего Запада США.

Последние почасовые данные о ветре

Теперь я хочу наложить наблюдения за последние два дня красным цветом. Это должно быть легко, но я не могу понять, почему я получаю сообщение об ошибке.

Будем очень благодарны любой помощи.

Ниже приведен воспроизводимый пример:

# 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
MikeTP
источник

Ответы:

165

когда вы добавляете новый набор данных в geom, вам нужно использовать data=аргумент. Или расставьте аргументы в правильном порядке mapping=..., data=.... Взгляните на аргументы в пользу ?geom_line.

Таким образом:

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

Или:

p + geom_line(aes(HrEnd, MWh, group=factor(Date)), df.last, color="red") 
Джастин
источник
1
ай вот как-то неловко !! но я больше никогда не совершу эту ошибку. Спасибо, Джастин
MikeTP
36
Нет, это не так! и да будет! Рад, что смог направить вас в правильном направлении, и теперь он здесь для потомков.
Джастин
13

Другая причина - случайно поместить data=...внутрь aes(...)вместо внешнего:

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

В частности, это может произойти, когда вы прототипируете свою команду построения графика с помощью qplot(), которая не использует явный aes(), а затем редактируете / копируете и вставляете ее вggplot()

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

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

Жаль, что сообщение об ошибке ggplot не отсутствует аргумент «данные»! вместо этой загадочной чепухи, потому что это сообщение часто означает именно это.

smci
источник
4

Это также может произойти, если вы обратитесь к несуществующей переменной в data.frame. Например, недавно я забыл сказать ddply, что нужно суммировать одну из моих переменных, которые я использовал в geom_line для определения цвета линии. Затем ggplot не знал, где найти переменную, которую я не создал в сводной таблице, и я получил эту ошибку.

Новая звезда
источник
6
Эта ошибка также может произойти, если вы забудете передать ggplot с помощью +. Я случайно использовал оператор dplyr%>%, и ggplot не получил строк, необходимых для завершения графика.
Дэн