[Résolu] assignation ggplot différente boucle

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

[Résolu] assignation ggplot différente boucle

Messagepar Mathilde Fer » 07 Avr 2017, 19:43

Bonjour tout le monde !

J'ai réalisé une boucle pour pouvoir réaliser des plots, à l'aide de ggplot. Chaque plot représente l’évolution d'une proportion d'individu au cours du temps.
Voilà mon code :

Code : Tout sélectionner

a<-names(test)

for(i in 2:5){
  x<-ggplot(data = test, aes(x=test[,a[1]],y=test[,a[i]]/test[,a[6]])) + geom_point()
  x<-x + xlab("Age (year cal.BP)")+ylab("Rate of reads") + labs(title=a[i])
  x<-x + geom_line(color="black",size=0.2)
  print(x)
}


Le code marche, mais le problème c'est que j'aimerai, au lieu d'assigner chaque plot à l'objet x, assigner chaque plot à l'individu correspondant soit a[i].
Je ne sais pas si j'ai été claire.

Si quelqu'un peut m'aider.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: assignation ggplot différente boucle

Messagepar Pierre-Yves Berrard » 08 Avr 2017, 12:03

Bonjour,

Code : Tout sélectionner

for(i in 2:5){
  # { code qui crée x }
  assign(paste0("graph", i), x)
}
PY

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

Re: assignation ggplot différente boucle

Messagepar Mathilde Fer » 08 Avr 2017, 16:18

Merci bien ça marche ! j'ai juste remplacé "graph", i par a[i] et ça marche super !

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

Re: assignation ggplot différente boucle

Messagepar Mathilde Fer » 10 Avr 2017, 09:06

En fait ce n'est pas résolu...
Car quant je fais

Code : Tout sélectionner

assign(x=a[i],value = x)


j'ai certes un nom différent pour chaque graph, mais j'ai le même graph pour tous mes individus.

Si quelqu'un a la solution

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: assignation ggplot différente boucle

Messagepar Mickael Canouil » 10 Avr 2017, 09:16

Bonjour,

avez-vous ajouter le "assign" dans votre boucle génératrice de graphiques? (Et non pas dans une seconde boucle)
Mickaël
mickael.canouil.fr | rlille.fr

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

Re: assignation ggplot différente boucle

Messagepar Mathilde Fer » 10 Avr 2017, 09:18

il me semble oui voila mon code

Code : Tout sélectionner

for(i in 2:5){
  x<-ggplot(data = test, aes(x=test[,a[1]],y=test[,a[i]]/test[,a[6]])) + geom_point()
  x<-x + xlab("Age (year cal.BP)")+ylab("Rate of reads") + labs(title=a[i])
  x<-x + geom_line(color="black",size=0.2)
  assign(a[i],x)
}

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

Re: assignation ggplot différente boucle

Messagepar Mathilde Fer » 10 Avr 2017, 09:41

il me donne le graph du dernier individu dans toutes mes différentes assignations

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: assignation ggplot différente boucle

Messagepar Mickael Canouil » 10 Avr 2017, 10:04

Cela est dû au fait que ggplot n'évalue les variables dans "aes" que lors de l'affichage de l'objet.
Or, ici l'objet x n'est jamais évalué. Ainsi, lorsque vous voulez afficher le résultat de votre affection, ggplot évalue a[i], donc la dernière valeur de i.

Vous pouvez le vérifier, en prenant différente valeur pour "i" et en affichant le même objet crée avec assign. Vous devriez voir que lorsque i change, le graphique aussi, sans que vous faisiez de changement.

Un moyen de contourner le problème est de restreindre "l'environnement". Au lieu de travailler dans l’environnement global directement, travailler dans un environnement séparé pour chaque "i", par exemple en utilisant un lapply, et en réalisant l'affection dans l'environnement global.

Code : Tout sélectionner

test <- iris
a <- colnames(test)

plotlist <- lapply(2:4, function (i) {
    x<-ggplot(data = test, aes(x=test[,a[1]],y=test[,a[i]]/test[,a[1]])) + geom_point()
    x<-x + xlab("Age (year cal.BP)")+ylab("Rate of reads") + labs(title=a[i])
    x<-x + geom_line(color="black",size=0.2)
    assign(a[i], x, envir = .GlobalEnv)
    return(x)
})
Mickaël
mickael.canouil.fr | rlille.fr

Mathilde Fer
Messages : 66
Enregistré le : 17 Nov 2015, 17:33

Re: assignation ggplot différente boucle

Messagepar Mathilde Fer » 10 Avr 2017, 10:20

merci ! ça à l'aire de fonctionner!


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité