Comment gérer l'erreur «données de classe inégale» de ggplot2?

101

En essayant de superposer une nouvelle ligne à un ggplot existant, j'obtiens l'erreur suivante:

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

La première partie de mon code fonctionne bien. Ci-dessous, une image des données horaires "récentes" de production éolienne d'un marché de l'énergie électrique du Midwest des États-Unis.

Données horaires récentes du vent

Maintenant, je veux superposer les deux derniers jours d'observations en rouge. Cela devrait être facile, mais je ne comprends pas pourquoi j'obtiens une erreur.

Toute assistance sera grandement appréciée.

Voici un exemple reproductible:

# 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
la source

Réponses:

165

lorsque vous ajoutez un nouvel ensemble de données à un geom, vous devez utiliser l' data=argument. Ou mettez les arguments dans le bon ordre mapping=..., data=.... Jetez un œil aux arguments pour ?geom_line.

Donc:

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
la source
1
aïe c'est un peu gênant !! mais je ne referai plus jamais cette erreur. Merci Justin
MikeTP
36
Non ce n'est pas! et oui vous le ferez! Heureux d'avoir pu vous orienter dans la bonne direction et maintenant c'est ici pour la postérité.
Justin
13

Une autre cause est de mettre accidentellement l' data=...intérieur au aes(...)lieu de l'extérieur:

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 particulier, cela peut se produire lorsque vous prototypez votre commande plot avec qplot(), qui n'utilise pas un explicite aes(), puis que vous l'éditez / copiez et collez dans unggplot()

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

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

C'est dommage que le message d'erreur de ggplot ne soit pas l'argument 'data' manquant! au lieu de ce non-sens cryptique, car c'est ce que ce message signifie souvent.

smci
la source
4

Cela peut également se produire si vous faites référence à une variable du data.frame qui n'existe pas. Par exemple, j'ai récemment oublié de dire à ddply de résumer par l'une de mes variables que j'ai utilisées dans geom_line pour spécifier la couleur de la ligne. Ensuite, ggplot ne savait pas où trouver la variable que je n'avais pas créée dans le tableau récapitulatif, et j'ai eu cette erreur.

Nova
la source
6
Cette erreur peut également se produire si vous oubliez de diriger ggplot avec +. J'ai accidentellement utilisé l'opérateur%>% de dplyr et ggplot n'a pas obtenu les lignes nécessaires pour terminer le tracé.
Dan Jarratt