Boucler sur les variables dans ggplot
Je veux utiliser ggplot en boucle sur plusieurs colonnes pour créer plusieurs parcelles, mais l'utilisation de l'espace réservé dans la boucle for qui modifie le comportement de ggplot.
Si j'ai ceci:
t <- data.frame(w = c(1, 2, 3, 4), x = c(23,45,23, 34),
y = c(23,34,54, 23), z = c(23,12,54, 32))
Cela fonctionne bien:
ggplot(data=t, aes(w, x)) + geom_line()
Mais ce n'est pas:
i <- 'x'
ggplot(data=t, aes(w, i)) + geom_line()
Qui est un problème si je veux finalement en boucle sur x, y et z.
Toute aide?
- Généralement,
ggplot2
est plus heureux avec de longues format de données.cadres, je.e,m = melt(t, id="w") ; ggplot(subset(m, variable == "x"), aes(w, value)) + geom_line()
oup <- ggplot(m, aes(w, value)) + geom_line(aes(colour=variable)
, oud_ply(m, .(variable), function(d) p %+% d, .print=TRUE)
, etc.
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin d'utiliser
aes_string
au lieu deaes
, comme ceci:Noter que
w
doit alors être spécifié comme une chaîne de caractères, trop.ggplot2 v3.0.0
publié en juillet 2018 supporte bien rangé évaluation, telles que!!
(bang bang) à l'intérieur deaes()
. Afin que nous puissions effectuer les opérations suivantes:Construire une fonction qui prend x & y - les noms de colonnes comme des entrées. Notez l'utilisation de
rlang::sym
&!!
.Ensuite une boucle sur chaque colonne à l'aide de
purrr::map
.Définir une fonction qui accepte les chaînes en entrée
Boucle dans chaque colonne
Modifier: la fonction ci-dessus peut également être écrite w/o
sym
et!!
Ou nous pouvons simplement utiliser
facet_grid
/facet_wrap
après convertir les données d'image à partir de l'échelle de format long (tidyr::rassembler
)Le problème est de savoir comment vous accédez à la trame de données
t
. Comme vous le savez probablement, il y a plusieurs façons de le faire, mais malheureusement, à l'aide d'un personnage n'est évidemment pas l'un d'eux dansggplot
.D'une manière qui pourrait travail est d'utiliser la position numérique de la colonne dans votre exemple, par exemple, vous pourriez essayer de
i <- 2
. Toutefois, si cela fonctionne repose sur ggplot que je n'ai jamais utilisé (mais je sais que d'autres travaux par le Hadley et je pense que cela devrait fonctionner)Une autre façon de contourner cela est par la création d'un nouveau temporaire de la trame de données chaque fois que vous appelez ggplot. par exemple:
aes_string()
méthode (Matt Parker réponse) fonctionne dans le cas général. Je viens de commenter afin que toute personne utilisant cette réponse plutôt que connaît ses limites.En fonction de ce que vous essayez de faire, je trouve
facet_wrap
oufacet_grid
de bien travailler à la création de plusieurs parcelles avec la même structure de base. Quelque chose comme cela devrait vous mettre dans l'approximation: