2015-10-22 5 views
3

J'ai un data.frame avec plusieurs colonnes du formulaire contenant les valeurs agrégées pour chaque point de temps des variables x, y, z, w ... an: temps x_mean x_sd y_mean y_sd z_mean y_sd w_mean w_sd ...R qqplot aes_ dans une fonction et une fonction de la colonne de données

maintenant, je veux écrire une fonction qui trace la moyenne et une bande de confiance de +/- 1SD autour d'elle, avec ggplot2. mon code ressemble actuellement:

plotfunc <- function(ds1,val) { 
    val_mean <- paste(val,"_mean",sep="") 
    val_p_sd <- paste(val,"_mean + ",val,"_sd",sep="") 
    val_m_sd <- paste(val,"_mean - ",val,"_sd",sep="") 
    ggplot() + geom_line(data=ds1,aes_q(x=as.name("TIME"),y=as.name(val_mean),color="good")) + 
geom_ribbon(data=ds1,aes_q(x=as.name("TIME"),ymin=as.name(val_m_sd),ymax=as.name(val_p_sd),alpha=0.3,fill="good")) 
} 

Et je l'appelle avec:

plotfunc(df,"x") 

Il se plaint:

Error in eval(expr, envir, enclos) : object 'x_mean - x_sd' not found 

Comment puis-je obtenir les limites supérieure et inférieure? Dois-je utiliser substitute ou quote?

+1

Avez-vous essayé 'aes_string'? –

Répondre

1

J'utilisé aes_string et corriger certaines erreurs de syntaxe dans votre code de fonction: - couleur « bonne » unkown - l'argument de la couleur, qui est spécifiée à une valeur fixe, a donc d'être en dehors de la fonction aes

df = data.frame("TIME"=11:20, "x_mean"=rnorm(10, mean=10), "x_sd"=rnorm(10, mean=1, sd=0.1), 
       "y_mean"=rnorm(10, mean=12), "y_sd"=rnorm(10, mean=2, sd=0.2)) 

plotfunc <- function(ds1,val) { 
    val_mean <- paste(val,"_mean",sep="") 
    val_p_sd <- paste(val,"_mean + ",val,"_sd",sep="") 
    val_m_sd <- paste(val,"_mean - ",val,"_sd",sep="") 
    ggplot() + geom_line(data=ds1,aes_string(x=as.name("TIME"),y=as.name(val_mean)),color="red") + 
    geom_ribbon(data=ds1,aes_string(x=as.name("TIME"),ymin=as.name(val_m_sd),ymax=as.name(val_p_sd)),alpha=0.3,fill="blue") 
} 

plotfunc(df,"x") 

enter image description here Cela vous convient-il?

+0

bien que l'on pourrait probablement rendre votre fonction beaucoup plus simple. – agenis