Jak radzić sobie z błędem „data of class uneval” z ggplot2?

101

Podczas próby nałożenia nowej linii na istniejący ggplot otrzymuję następujący błąd:

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

Pierwsza część mojego kodu działa dobrze. Poniżej znajduje się obraz „ostatnich” danych godzinowych dotyczących generacji wiatrowej z rynku energii elektrycznej w środkowo-zachodnich Stanach Zjednoczonych.

Najnowsze godzinowe dane wiatru

Teraz chcę nałożyć obserwacje z ostatnich dwóch dni na czerwono. To powinno być łatwe, ale nie mogę dowiedzieć się, dlaczego pojawia się błąd.

Każda pomoc byłaby bardzo mile widziana.

Poniżej znajduje się odtwarzalny przykład:

# 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
źródło

Odpowiedzi:

165

kiedy dodajesz nowy zestaw danych do geom, musisz użyć data=argumentu. Lub ułóż argumenty w odpowiedniej kolejności mapping=..., data=.... Spójrz na argumenty za ?geom_line.

A zatem:

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

Lub:

p + geom_line(aes(HrEnd, MWh, group=factor(Date)), df.last, color="red") 
Justin
źródło
1
ach, to trochę zawstydzające !! ale nigdy więcej nie popełnię tego błędu. Dzięki Justin
MikeTP
36
Nie, nie jest! i tak, będziesz! Cieszę się, że mogłem skierować cię we właściwym kierunku, a teraz jest tu dla potomności.
Justin
13

Inną przyczyną jest przypadkowe włożenie data=...wnętrza aes(...)zamiast na zewnątrz:

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

W szczególności może się to zdarzyć, gdy prototypujesz polecenie wykresu za pomocą qplot(), które nie używa jawnego aes(), a następnie edytuj / kopiuj i wklejaj doggplot()

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

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

Szkoda, że ​​komunikat o błędzie ggplot nie jest brakującym argumentem „dane”! zamiast tego tajemniczego nonsensu, bo to właśnie często oznacza ta wiadomość.

smci
źródło
4

Może to również wystąpić, jeśli odwołujesz się do zmiennej w data.frame, która nie istnieje. Na przykład ostatnio zapomniałem powiedzieć ddply, aby podsumował przez jedną z moich zmiennych, których użyłem w geom_line do określenia koloru linii. Następnie ggplot nie wiedział, gdzie znaleźć zmienną, której nie utworzyłem w tabeli podsumowania, i otrzymałem ten błąd.

Nova
źródło
6
Ten błąd może również wystąpić, jeśli zapomnisz potokować ggplot z +. Przypadkowo użyłem operatora%>% dplyra i ggplot nie uzyskał linii potrzebnych do ukończenia wykresu.
Dan Jarratt