如何处理来自ggplot2的“不同类的数据”错误?

当试图覆盖一个新的行到现有的ggplot我收到以下错误:

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

我的代码的第一部分工作正常。 以下是来自美国中西部电力市场的“近期”每小时风力发电数据的图像。

近期小时风资料

现在我想把最后两天的观察结果叠加在红色上。 这应该很容易,但我不知道为什么我得到一个错误。

任何援助将不胜感激。

以下是一个可重现的例子:

 # 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 

当你添加一个新的数据集到一个geom时,你需要使用data=参数。 或者把参数放在正确的顺序mapping=..., data=... 看看?geom_line的参数。

从而:

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

要么:

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

另一个原因是无意中把data=...放在aes(...)里面而不是在外面:

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

特别是当你使用qplot()不使用明确的aes()qplot()你的plot命令的原型时,可以编辑/复制并粘贴到ggplot()

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

这是一个可惜ggplot的错误消息不是缺less'数据'的说法! 而不是这个晦涩的废话,因为这是这个信息往往意味着什么。

如果您引用不存在的data.frame中的variables,也会发生这种情况。 例如,最近我忘了告诉ddply总结我的一个variables,我用geom_line来指定线的颜色。 然后,ggplot不知道在哪里find我没有在汇总表中创build的variables,我得到了这个错误。