J'ai une commande ggplot
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
à l'intérieur d'une fonction. Mais j'aimerais pouvoir utiliser un paramètre de la fonction pour choisir la colonne à utiliser comme couleur et groupe. Ie je voudrais quelque chose comme ça
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
Pour que la colonne utilisée dans le ggplot soit déterminée par le paramètre. Par exemple, pour f ("majr"), nous obtenons l'effet de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
mais pour f ("gender") nous obtenons l'effet de
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Certaines choses que j'ai essayées:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
n'a pas marché. Pas plus que
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
aes_string(x = rates.by.groups$name...
, et de toute façon vous n'en avez pas besoin puisque vous avez déjà passé l'ggplot(data = rates.by.groups...
argument. (Le problème dans cette question )"column_name"
ou"column"
ne fonctionnerait pasD'après les notes de version de
ggplot2 V3.0.0
:La manière idiomatique maintenant serait de convertir en symbole la chaîne que la variable contient, en utilisant
sym()
(qui est presque le même que les alias de baseas.name()
/as.symbol()
), et de la décompresser en utilisant!!
Simuler les données d'OP, nous pouvons faire:
Si nous préférons donner des noms bruts à la fonction, nous pouvons faire:
Il fonctionnera avec des noms aka symboles ET avec des chaînes littérales
Comme le dit Lionel
ensym()
:Une note sur
enquo()
enquo()
cite l'expression (pas nécessairement un symbole) fournie à l'argument, il ne convertit pas une chaîne littérale en symbole comme leensym()
fait donc il pourrait être moins adapté ici, mais nous pouvons le faire:la source
aes()
elle-même en parleenquo()
mais ne fonctionne pas. Et qui en a déjà entendu parlerensym()
? BIG SIGHf2
, les quatre exemples fonctionnent, tout comme la capture du nom de la colonne dans une variable (ieaname <- "mjr"; f2(aname)
). Si j'ajoute du code pour manipuler le bloc de données en l'utilisant,dplyr
il tente de trouver une colonne en utilisant le nom de la variable et non la chaîne dans le nom de la variable. En d'autres termes, comment puis-je me rendrerates.by.groups %>% group_by(!!column)...
au travail tout en soutenant les trois modes d'appelsf2
?ensym
est conçu pour traiter les arguments fournis sous forme de noms et tolère les guillemets autour d'eux. Je crois que vous aimeriez traiter l'argument comme un nom et vous rabattre sur la valeur si le nom n'est pas trouvé. C'est en fait ce qui se passe avecselect
, mais pas avecgroup_by
... Il est possible de pirater mais pas évident. Si c'est important pour vous, je pense qu'il mériterait sa propre question.select
etgroup_by
c'était probablement le problème. Je peux créer une nouvelle question, mais je dois trouver un exemple simple et vérifier si une réponse a été donnée. Je peux le poster sinon.facet_grid
? Cela fonctionne avecfacet_grid(cols = vars(!!column))
mais génère une erreur avecfacet_grid(~ !!column)
Essayez d'utiliser à la
aes_string
place deaes
.la source
Une autre option (
ggplot2 > 3.0.0
) consiste à utiliser le pronom d'évaluation ordonné.data
pour découper la variable / colonne choisie dans le bloc derates.by.groups
données.Créé le 04/04/2019 par le package reprex (v0.2.1.9000)
la source
L'utilisation
aes_string
résout ce problème, mais rencontre un problème lors de l'ajout de barres d'erreurgeom_errorbar
. Voici une solution simple.Bonus, vous pouvez également ajouter des facettes à votre tracé en utilisant ces lignes à l'intérieur du ggplot:
Ce script a été modifié à partir de ce message d'origine: ggplot2 - Barres d'erreur utilisant une fonction personnalisée
la source
Voici un exemple extrêmement simple.
Fais juste deux choses
!!
quand vous l'utilisezla source