2010-02-16 92 views
4

我正在使用ggplot2來探索不同軍事行動對謀殺率的影響。爲了顯示效果,我在操作發生時繪製了一條垂直線,並在手術前後繪製了一條平滑的謀殺率線。如何從ggplot2中獲取geom_vline和facet_wrap以在函數內部工作

我寫了一個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(表達式,ENVIR,enclos):對象 '縣' 未找到

有人知道如何解決這一問題?

回答

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) 
+0

因此,技巧是使用第二個數據框...謝謝! – diegovalle 2010-02-16 13:44:12

相關問題