¿Cómo lidiar con el error de "datos de clase desigual" de ggplot2?

101

Al intentar superponer una nueva línea a un ggplot existente, aparece el siguiente error:

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

La primera parte de mi código funciona bien. A continuación se muestra una imagen de datos "recientes" de generación eólica por hora de un mercado de energía eléctrica del medio oeste de Estados Unidos.

Datos de viento por hora recientes

Ahora quiero superponer las observaciones de los últimos dos días en rojo. Debería ser fácil, pero no puedo entender por qué recibo un error.

Cualquier ayuda será muy apreciada.

A continuación se muestra un ejemplo reproducible:

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

Respuestas:

165

cuando agrega un nuevo conjunto de datos a un geom, necesita usar el data=argumento. O coloque los argumentos en el orden correcto mapping=..., data=.... Eche un vistazo a los argumentos a favor ?geom_line.

Así:

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") 
Justin
fuente
1
¡¡Eso es algo vergonzoso !! pero nunca volveré a cometer ese error. Gracias Justin
MikeTP
36
¡No, no es! y si lo harás! Me alegro de poder guiarte en la dirección correcta y ahora está aquí para la posteridad.
Justin
13

Otra causa es colocar accidentalmente el data=...interior en aes(...)lugar del exterior:

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

En particular, esto puede suceder cuando crea un prototipo de su comando de trazado con qplot(), que no usa un explícito aes(), luego lo edita / copia y pega en unggplot()

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

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

¡Es una lástima que el mensaje de error de ggplot no sea el argumento "datos" que faltan! en lugar de estas tonterías crípticas, porque eso es lo que a menudo significa este mensaje.

smci
fuente
4

Esto también podría ocurrir si hace referencia a una variable en el data.frame que no existe. Por ejemplo, recientemente olvidé decirle a ddply que resuma por una de mis variables que usé en geom_line para especificar el color de la línea. Entonces, ggplot no sabía dónde encontrar la variable que no había creado en la tabla de resumen y recibí este error.

Estrella nueva
fuente
6
Este error también podría ocurrir si olvida canalizar ggplot con +. Usé accidentalmente el operador%>% de dplyr y ggplot no obtuvo las líneas que necesitaba para completar la gráfica.
Dan Jarratt