Como lidar com o erro “data of class uneval” do ggplot2?

101

Ao tentar sobrepor uma nova linha a um ggplot existente, recebo o seguinte erro:

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

A primeira parte do meu código funciona bem. Abaixo está uma imagem de dados "recentes" de geração eólica por hora de um mercado de energia elétrica do meio-oeste dos Estados Unidos.

Dados recentes de vento por hora

Agora eu quero sobrepor os últimos dois dias de observações em vermelho. Deve ser fácil, mas não consigo entender por que estou recebendo um erro.

Qualquer ajuda seria muito apreciada.

Abaixo está um exemplo reproduzível:

# 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
fonte

Respostas:

165

quando você adiciona um novo conjunto de dados a um geom, você precisa usar o data=argumento. Ou coloque os argumentos na ordem adequada mapping=..., data=.... Dê uma olhada nos argumentos para ?geom_line.

Portanto:

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

Ou:

p + geom_line(aes(HrEnd, MWh, group=factor(Date)), df.last, color="red") 
Justin
fonte
1
ai isso é meio embaraçoso !! mas nunca mais cometerei esse erro. Obrigado Justin
MikeTP
36
Não, não é! e sim você vai! Que bom que pude guiá-lo na direção certa e agora está aqui para a posteridade.
Justin
13

Outra causa é colocar acidentalmente data=...dentro em aes(...)vez de fora:

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

Em particular, isso pode acontecer quando você protótipo seu comando plot com qplot(), que não usa um explícito aes(), e então edita / copia e cola em umggplot()

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

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

É uma pena que a mensagem de erro do ggplot não esteja faltando o argumento 'dados'! em vez desse absurdo críptico, porque é isso que essa mensagem geralmente significa.

smci
fonte
4

Isso também pode ocorrer se você se referir a uma variável no data.frame que não existe. Por exemplo, recentemente esqueci de dizer ao ddply para resumir por uma das minhas variáveis ​​que usei em geom_line para especificar a cor da linha. Então, o ggplot não sabia onde encontrar a variável que eu não havia criado na tabela de resumo e recebi este erro.

Nova
fonte
6
Este erro também pode ocorrer se você esquecer de canalizar ggplot com +. Eu usei acidentalmente o operador%>% do dplyr e o ggplot não obteve as linhas necessárias para completar o gráfico.
Dan Jarratt