Mauvais affichage de légende avec ggplot()

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

Jan Perret
Messages : 7
Enregistré le : 18 Jan 2017, 17:19

Mauvais affichage de légende avec ggplot()

Messagepar Jan Perret » 30 Jan 2017, 19:25

Bonjour à tous,

Je rencontre un problème avec la légende d'un graphique obtenu avec la fonction ggplot. Je voudrai représenter la phénologie de reproduction d'une espèce en mettant sur un même graphique deux courbes : l'évolution mensuelle du rapport du nombre de femelles gestantes sur le nombre total de femelle d'une part, et d'autre part l'évolution du rapport du nombre de femelle allaitantes. J'ai donc calculé mes rapports mensuels et les ai mis dans un dataframe dont le début donne :

Code : Tout sélectionner

> head(pheno_LIOSPU)
mois_num mois     prop_G   prop_ALL
1       01 janv         NA         NA
2       02 fevr 0.00000000 0.00000000
3       03 mars 0.09090909 0.09090909
4       04  avr 0.00000000 0.05405405
5       05  mai 0.00000000 0.00000000
6       06 juin 0.00000000 0.03488372


J'utilise ensuite la fonction ggplot pour tracer mes deux courbes avec le code ci-dessous :

Code : Tout sélectionner

pheno <- ggplot(pheno_LIOSPU, aes(x = mois, y = prop_G, group = 1))
pheno <- pheno + geom_line(na.rm = TRUE, show.legend = TRUE) + geom_point(show.legend = FALSE, na.rm = TRUE) + ggtitle("Phenologie de reproduction LIOSPU") + scale_x_discrete(name = "mois", limits = pheno_LIOSPU$mois)
pheno <- pheno + geom_line(data = pheno_LIOSPU, aes(x= mois, y= prop_ALL, group = 1, colour="red"), show.legend = TRUE, na.rm = TRUE) + geom_point(data = pheno_LIOSPU, aes(x= mois, y= prop_ALL, group = 1, colour="red"), show.legend = FALSE, na.rm = TRUE, shape = 17, size = 2)
pheno <- pheno + theme_bw()
pheno <- pheno + theme(legend.title=element_blank()) + theme(plot.title = element_text(hjust = 0.5))
pheno <- pheno + labs(x = "Mois", y = "Proportion")
pheno


Avec ces réglages de paramètres graphiques j'obtiens le type de graphique que je veux sauf qu'en légende il y a un unique figuré (trait rouge) et non deux comme je pense l'avoir indiqué avec les deux show.legend = TRUE, et le nom de ce figuré est "red". Je ne comprends pas d'où vient ce nom de figuré et pourquoi il n'y en a qu'un seul qui s'affiche, avez-vous une idée?

Merci d'avance,
Cordialement

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Mauvais affichage de légende avec ggplot()

Messagepar Logez Maxime » 30 Jan 2017, 20:04

Bonjour,

pour ce genre de choses j'ai plutôt tendance à mettre mon tableau en format long, avec des fonctions comme reshape (base), melt (reshape2) ou gather (tidyr) :

Code : Tout sélectionner

library(tidyr)
tab2 <- tab %>% gather(variable, valeur, -(1:2))
ggplot(tab2, aes(mois, valeur, col = variable, group = variable)) + geom_point() + geom_line()
A toi de jouer avec les fonctions scale_color_manual pour spécifier les couleurs pour chaque type de variable plus tous les autres paramètres de thèmes pour la légende.

Cordialement,
Maxime

Jan Perret
Messages : 7
Enregistré le : 18 Jan 2017, 17:19

Re: Mauvais affichage de légende avec ggplot()

Messagepar Jan Perret » 01 Fév 2017, 12:44

Bonjour,

Tout d'abord merci beaucoup de ta réponse, j'ai utilisé gather() et ça marche impeccable, j'ai mes courbes avec les bonnes légendes qui apparaissent automatiquement. Cependant je rencontre un second problème : j'aimerai ajouter sur le même graphique une courbe pour le sexratio par mois (pour montrer que le rapport nombre de mâles/nombre de femelles chute en même temps que la proportion de femelles gestantes augmente). Mais j'aimerai que la courbe représentant le sexratio n'est pas le même figuré que les deux autres (sans geom_points et un peu plus épaisse et légèrement transparente) pour qu'on la différencie facilement. En ajoutant la colonne sexratio au tableau que je mets en format long avec gather(), ça m'affiche la bonne courbe, mais je n'arrive pas à modifier le figuré uniquement pour la courbe de sexratio. Et si je met les données de sexratio dans une autre colonne de mon dataframe ça me fera comme précédemment un problème d'affichage de la légende non? Savez-vous si ce que je veux faire est possible?

Je vous remercie par avance de vos réponses !

Cordialement,
Jan

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

Re: Mauvais affichage de légende avec ggplot()

Messagepar Mickael Canouil » 01 Fév 2017, 12:56

Bonjour,

si vous voulez personnaliser la forme des points, le type de traits, etc, tout cela se définit dans les aesthetics (aes) via colour/color, linetype, shape.
Cela va générer une légende automatique qu'il vous ait alors possible de modifier avec les scale_* correspondants.

http://www.cookbook-r.com/Graphs/Legends_(ggplot2)/
Mickaël
mickael.canouil.fr | rlille.fr

Jan Perret
Messages : 7
Enregistré le : 18 Jan 2017, 17:19

Re: Mauvais affichage de légende avec ggplot()

Messagepar Jan Perret » 02 Fév 2017, 14:40

Bonjour,

Effectivement je pense que je ne comprenait pas bien la syntaxe de la fonction ggplot. En spécifiant mieux les aesthetics j'arrive à peu près au résultat que je veux :

Code : Tout sélectionner

tab <- pheno_LIOSPU %>% gather(prop_G, prop_ALL, -(1:2))

pheno <- ggplot(tab, aes(mois_num, prop_ALL, col = prop_G, alpha = prop_G, size = prop_G, group = prop_G)) + geom_line(na.rm = TRUE)
pheno <- pheno + scale_colour_manual(values=c("prop_ALL"="steelblue","prop_G"="black","sexratio"="red"),
                                     labels=c("Proportion femelles allaitantes","Proportion femelles gestantes","Sex-ratio (nb M/nb AD)"))
pheno <- pheno + scale_alpha_manual(values=c(1,1,0.3),guide=F)
pheno <- pheno + scale_size_manual(values=c(1.5,1.5,4),guide=F)
pheno <- pheno + geom_point(aes(shape=prop_G), size = 3, fill = "white", na.rm = TRUE)
pheno <- pheno + scale_shape_manual(values=c(21,22,16),
                                    labels=c("Proportion femelles allaitantes","Proportion femelles gestantes","Sex-ratio (nb M/nb AD)"))
pheno <- pheno + ggtitle("Phenologie de reproduction LIOSPU")
pheno <- pheno + theme_bw()
pheno <- pheno + theme(legend.title=element_blank()) + theme(plot.title = element_text(hjust = 0.5))
pheno <- pheno + labs(x = "Mois", y = "Proportion")
pheno <- pheno + scale_x_discrete(breaks=c("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"),
                                  labels=c("janv", "fevr", "mars", "avr", "mai", "juin", "juill", "aout", "sept", "oct", "nov", "dec"))
pheno


Cependant il me reste un problème : je voudrai que ma courbe sex-ratio n'ai pas de points (uniquement une ligne), en gardant mes points pour les deux autres courbes. J'ai pensé à créer une colonne supplémentaire dans mon tableau de départ avec une valeur "a" pour les lignes avec les valeurs de prop_G et prop_ALL, et une valeur "b" pour les lignes avec le sex-ratio, puis de spécifier l'aesthetics du geom_point avec cette colonne mais ça ne fonctionne pas. Savez-vous s'il existe un moyen de faire ça sans utiliser d'autre variable? (c'est-à-dire faire disparaitre les points sur une courbe parmi trois qui sont issues de la même colonne de données?)
J'ai pensé à utiliser scale_size_manual pour mettre manuellement la taille des points du sex-ratio à 0 pour les faire disparaitre (il ne reste plus qu'un pixel de point), mais puisque mon geom_line et mon geom_point représentent la même variable (tableau en long), je n'arrive pas à modifier la taille des points indépendamment de la taille des lignes. Savez-vous comment il est possible de modifier indépendamment la taille des points et des lignes lorsqu'ils représentent la même variable?

J'espère que mes questions sont assez claires, et vous remercie par avance de vos réponses qui m'ont déjà bien débloquées !

Cordialement,
Jan

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Mauvais affichage de légende avec ggplot()

Messagepar Logez Maxime » 02 Fév 2017, 14:54

pour se faire tu peux spécifier dans aes que le type de point dépend de la variable a représenter avec shape = variale et définir la forme des points avec la fonction scale_shape_manual avec pour valeur NA pour la variable pour laquelle tu ne veux pas de points :

Code : Tout sélectionner

ggplot(tab2, aes(mois, valeur, col = variable, group = variable, shape = variable)) +
  geom_point() + geom_line()+scale_shape_manual(values = c(19,NA))
Cordialement,
Maxime

Jan Perret
Messages : 7
Enregistré le : 18 Jan 2017, 17:19

Re: Mauvais affichage de légende avec ggplot()

Messagepar Jan Perret » 02 Fév 2017, 15:06

Et bien oui tout simplement ! Ça fonctionne, j'ai exactement le graphique que je voulais.

Merci beaucoup pour votre aide !
Jan


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité