web-dev-qa-db-fra.com

Comment modifier manuellement les libellés des clés dans une légende dans ggplot2

Je prépare un complot pour publication. J'ai créé un diagramme à cases empilées pour montrer la fréquence des patients dans chaque groupe qui étaient une accumulation compliquée de séronégatifs par rapport à non. La légende utilise les étiquettes du bloc de données qui sont appropriées pour nous qui travaillons sur le projet mais pas pour la publication. Je veux changer les noms en quelque chose de plus rapidement compris par le lecteur.

Ainsi, par exemple, exécutez le script suivant

grp <- gl(n=4,k=20,labels=c("group a","group b","group c", "group d"))
value <- runif(n=80, min=10, max=150)
outcome <- cut(value,2)
data <- data.frame(grp,value,outcome)
ggplot(data, aes(grp, fill=outcome)) + geom_bar() +xlab("group") 
             +ylab("number of subjects") + labs(fill="Serologic response")

Ce code crée des étiquettes clés "(10.4,80]" et "(80,150]" qui ne conviennent pas à la publication. Au lieu de cela, je voudrais "double négatif" et "positif pour a et/ou b".

Je suppose que je pourrais revenir à la trame de données et transformer pour obtenir une nouvelle variable avec le bon étiquetage. Ou je pourrais simplement renommer mon facteur ? Cependant, je préférerais le faire au moment du complot.

37
Farrel

La méthode standard consiste à utiliser les fonctions d'échelle pour modifier les étiquettes affichées pour les groupes. Vous pouvez remplacer votre appel ggplot par

ggplot(data, aes(grp, fill=outcome)) + geom_bar() +xlab("group") +
  ylab("number of subjects") + 
  scale_fill_discrete("Serologic response", 
                      breaks=c("(10.1,79.9]","(79.9,150]"), 
                      labels=c("double negative", "positive for a and/or b"))

Notez que le titre de l'échelle a été incorporé dans le scale_fill_discrete appel. Vous pouvez aussi le faire avec les axes, si vous le souhaitez

ggplot(data, aes(grp, fill=outcome)) + geom_bar() +
  scale_x_discrete("group") +
  scale_y_continuous("number of subjects") + 
  scale_fill_discrete("Serologic response", 
                      breaks=c("(10.1,79.9]","(79.9,150]"), 
                      labels=c("double negative", "positive for a and/or b"))
38
Brian Diggs

J'ai trouvé une façon hybride de le faire. Il réétiquet le facteur mais je n'ai pas à le faire dans le dataframe. Au lieu de cela, je le fais simplement dans la commande ggplot.

ggplot(data, aes(grp, fill=factor(outcome,labels=c("low","high")))) + 
  geom_bar() +xlab("group") +ylab("number of subjects") +
   labs(fill="Serologic response")

Y a-t-il d'autres moyens?

24
Farrel