我正在使用ggplot2探讨不同军事行动对谋杀率的影响。为了显示效果,我在操作发生时绘制一条垂直线,并在操作前后绘制一条平滑的谋杀率线。
我已经写了一个facet_wrap图来向一大堆县展示这个。它工作得很漂亮,但转换为函数时,使用局部变量绘制垂直线时会出错。
以下是一些示例代码:
drawTS <- function(df, dates, text) {
p <- ggplot(df, aes(date, murders)) +
facet_wrap(~ county, ncol = 1,
scale="free_y") +
scale_x_date() +
geom_smooth(aes(group = group), se = FALSE)
for(i in 1:length(dates)) {
#If it's not a global variable I get an object not found error
temp[i] <<- dates[i]
p <- p + geom_text(aes(x,y), label = text[i],
data = data.frame(x = dates[i], y = -10),
size = 3, hjust = 1, vjust = 0) +
#Here's the problem
geom_vline(xintercept=temp[i], alpha=.4)
}
p
}
library(ggplot2)
df <- data.frame(date = rep(seq(as.Date("2007/1/01"),
length=36, by='1 month'),4),
murders = round(runif(36*4) * 100),
county = rep(rep(factor(1:4),9),each=4),
group = rep(c(rep(1,6), rep(2,12),rep(3,18))), each=4)
dates <- c(as.Date("2007/6/15"), as.Date("2008/6/15"))
temp <- c()
drawTS(df, dates, c("Op 1","Op 2"))
全局变量没有错误,但看起来很难看。
如果我在temp[i]
内使用dates[i]
而不是geom_vline()
变量,我会得到这个:
NextMethod中的错误(“[”):对象'我找不到
如果我将变量dates[i]
包装在aes()
中,我会得到:
eval中的错误(expr,envir,enclos):找不到对象'县'
有人知道如何解决这个问题吗?
答案 0 :(得分:3)
我不知道是什么导致了这个错误,但是我能想到的一个解决方法是用这样的数据框替换for循环:
date.df<-data.frame(d=dates,t=text)
p <- p + geom_text(aes(x=d,label=t),y=0,
data = date.df,
size = 3, hjust = 1, vjust = 0)
p<-p+geom_vline(aes(xintercept=d),data=date.df,alpha=.4)