Come gestire l'errore "data of class uneval" da ggplot2?


101

Durante il tentativo di sovrapporre una nuova riga a un ggplot esistente, ricevo il seguente errore:

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

La prima parte del mio codice funziona bene. Di seguito è riportata un'immagine dei dati "recenti" sulla generazione di energia eolica oraria da un mercato dell'energia elettrica degli Stati Uniti del Midwest.

Dati orari recenti sul vento

Ora voglio sovrapporre in rosso le osservazioni degli ultimi due giorni. Dovrebbe essere facile ma non riesco a capire perché ricevo un errore.

Qualsiasi assistenza sarebbe molto apprezzata.

Di seguito è riportato un esempio riproducibile:

# 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

Risposte:


165

quando aggiungi un nuovo set di dati a un geom, devi utilizzare l' data=argomento. Oppure metti gli argomenti nell'ordine corretto mapping=..., data=.... Dai un'occhiata agli argomenti per ?geom_line.

Così:

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

O:

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

1
ahi questo è un po 'imbarazzante !! ma non farò mai più quell'errore. Grazie Justin
MikeTP

36
No non lo è! e si lo farai! Sono contento di averti potuto guidare nella giusta direzione e ora è qui per i posteri.
Justin

13

Un'altra causa è mettere accidentalmente l' data=...interno al aes(...)posto che all'esterno:

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

In particolare questo può accadere quando prototipi il tuo comando di trama con qplot(), che non usa un esplicito aes(), quindi lo modifichi / lo copi e lo incolli in unggplot()

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

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

È un peccato che il messaggio di errore di ggplot non abbia l'argomento "dati" mancante! invece di queste assurdità criptiche, perché questo è ciò che spesso significa questo messaggio.


4

Ciò potrebbe verificarsi anche se fai riferimento a una variabile in data.frame che non esiste. Ad esempio, di recente ho dimenticato di dire a ddply di riassumere con una delle mie variabili che ho usato in geom_line per specificare il colore della linea. Quindi, ggplot non sapeva dove trovare la variabile che non avevo creato nella tabella di riepilogo e ho ricevuto questo errore.


6
Questo errore potrebbe verificarsi anche se ti dimentichi di reindirizzare ggplot con +. Ho usato accidentalmente l'operatore%>% di dplyr e ggplot non ha ottenuto le linee necessarie per completare la trama.
Dan Jarratt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.