2010-02-16 9 views
4

J'utilise ggplot2 pour explorer les effets de différentes opérations militaires sur les taux de meurtre. Pour montrer l'effet, je dessine une ligne verticale lorsque l'opération s'est produite et une ligne lissée du taux de meurtre avant et après l'opération.Comment obtenir geom_vline et facet_wrap de ggplot2 pour travailler dans une fonction

J'ai écrit un tracé facet_wrap pour le montrer à tout un tas de comtés. Cela fonctionne admirablement, mais quand converti en fonction j'obtiens une erreur en utilisant une variable locale pour dessiner la ligne verticale.

Voici quelques exemples de code:

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

Il n'y a pas d'erreur avec la variable globale, mais il semble laid.

Si au lieu de la variable temp[i] j'utilise dates[i] intérieur geom_vline(), je reçois ceci:

Erreur dans NextMethod ("["): objet 'i' not found

Si J'enveloppe la variable dates[i] dans aes(), je reçois:

Erreur dans eval (expr, Envir, Enclos): objet 'comté' Pas trouvé

Quelqu'un sait comment résoudre ce problème?

Répondre

3

Je ne sais pas ce qui est à l'origine de l'erreur, mais une solution que je pouvais venir avec est de remplacer la boucle avec une trame de données comme ceci:

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

Donc, l'astuce est d'utiliser un deuxième trame de données ... Merci! – diegovalle