Problème d'affichage de légende.

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

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Problème d'affichage de légende.

Messagepar Jean-Emmanuel Longueville » 06 Fév 2017, 13:08

Le code suivant donne un graphique correct (après observation en détail les valeurs ne correspondent pas avec la position) :

Code : Tout sélectionner

 library(ggplot2)
    library(scales)
    library(dplyr);

    #Definition of data
    graph<-cbind.data.frame(
        sample(c("FI", "FA","FC"), 100, replace = TRUE),
        sample(c("Rep","Dip"),100, replace=TRUE)
    )
    names(graph)<- c("RegimeInscription","repondant")
   tabl <- graph %>% table() %>% prop.table(2) %>% data.frame() %>% group_by(repondant) %>% mutate(pos = cumsum(Freq) - (0.5 * Freq))
   
   #Some var
    theme_barre <- theme_bw()+
      theme(
       panel.grid=element_blank(),
       plot.title=element_text(colour = 'red', size=10, face="bold", hjust = 0.5, vjust = 0.5),
       legend.text=element_text(size=9),
       legend.key.size = unit(2, "mm"),
       panel.background = element_rect(fill = "transparent",colour = NA), # or theme_blank()
        plot.background  = element_rect(fill = "transparent",colour = NA),
        panel.grid.minor = element_blank()#,
       )
   
    #Make the graph
    tabl <- graph[,c("repondant","RegimeInscription")] %>% table() %>% prop.table(1) %>% data.frame() %>% group_by(repondant) %>% mutate(pos = cumsum(Freq) - (0.5 * Freq))
    ggplot(tabl, aes(x = factor(repondant), y=Freq, fill = factor(RegimeInscription) )) +#Initiation du graphique
      geom_bar(position = "fill", stat="identity")+ #Realisation du graphique
      theme_barre + #fond blanc
      coord_flip()+ #barre horizontale
      scale_fill_discrete( name=" ", labels=c("FI"="Fi","FA"="Fa","FC"="Fc") )+
      labs(x=" ", y=" ")+
      scale_y_continuous(breaks=seq(0,1,0.1), labels=percent)+
      ggtitle("Régime d'inscription")+
      geom_text( mapping = aes(x= factor(repondant), y = pos, label = lab(Freq) ),size=3)


Cependant quand je change les données par mes données personnelles j'ai le résultat suivant :

Image

Auriez vous une idée du pourquoi du comment ?
Merci
Jean-Emmanuel
Ingénieur d'étude LNEC

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

Re: Problème d'affichage de légende.

Messagepar Mickael Canouil » 06 Fév 2017, 17:20

Bonjour,

le problème vient du fait que les "blocs" de votre facteur "RegimeInscription" sont empilé selon l'ordre des valeurs de celui-ci (alphabétique ici).
Dans ce cas ggplot, place le facteur "1" en haut. Lorsque vous calculer votre somme cumulée, vous comptez la somme dans l'ordre des modalités.
Ainsi, les positions calculées à la main sont exactement l'inverse de celle des blocs dans ggplot.

Deux solutions:

Code : Tout sélectionner

geom_text( mapping = aes(x= factor(repondant), y = 1-pos, label = lab(Freq) ),size=3)

ou plus pénible, changer l'ordre des modalités lors du calcul de la somme cumulée.
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Problème d'affichage de légende.

Messagepar Jean-Emmanuel Longueville » 07 Fév 2017, 09:12

Du coup j'ai du mal à comprendre comment GGplot place les différents facteurs dans l'ordre d'apparition ?
Jean-Emmanuel
Ingénieur d'étude LNEC

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

Re: Problème d'affichage de légende.

Messagepar Logez Maxime » 07 Fév 2017, 09:31

Bonjour,

Pour avoir une idée de comment est construit le graph tu peux utiliser la fonction ggplot_build.

Code : Tout sélectionner

g <- ggplot(tabl, aes(x = factor(repondant), y=Freq, fill = factor(RegimeInscription) )) +#Initiation du graphique
      geom_bar(position = "fill", stat="identity")+ #Realisation du graphique
      theme_barre + #fond blanc
      coord_flip()+ #barre horizontale
      scale_fill_discrete( name=" ", labels=c("FI"="Fi","FA"="Fa","FC"="Fc") )+
      labs(x=" ", y=" ")+
      scale_y_continuous(breaks=seq(0,1,0.1), labels=percent)+
      ggtitle("Régime d'inscription")+
      geom_text( mapping = aes(x= factor(repondant), y = pos, label = lab(Freq) ),size=3)
 
 g
 
 ggplot_build(g)     
 
Cordialement,
Maxime

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

Re: Problème d'affichage de légende.

Messagepar Mickael Canouil » 07 Fév 2017, 09:39

avec un petit exemple, ce sera peut-être plus clair:

Code : Tout sélectionner

dta <- data.frame(fill= c("A", "B", "C", "D"), y = c(0.10, 0.20, 0.30, 0.40))

Avec position "stack", ggplot2 utilise l'ordre des facteurs et les places empiler dans le même ordre que la légende, ainsi la première modalité est toujours en haut et la dernière en bas, comme sur la légende. (Simplicité de lecture)

Code : Tout sélectionner

ggplot(data = dta, aes(x = 1, y = y, fill = fill)) + geom_bar(stat = "identity", position = "stack")
ggplot(data = dta, aes(x = 1, y = y, fill = factor(fill, levels = c("B", "A", "D", "C")))) + geom_bar(stat = "identity", position = "stack")

Avec position "dodge", ggplot2 les modalités sont ordonnées de gauche à droite dans le sens de lecture classique

Code : Tout sélectionner

ggplot(data = dta, aes(x = 1, y = y, fill = fill)) + geom_bar(stat = "identity", position = "dodge")


Ainsi, dans ggplot2, les modalités sont placés de haut en bas ou de gauche à droite, après transformation en facteurs par défaut.
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Problème d'affichage de légende.

Messagepar Jean-Emmanuel Longueville » 09 Fév 2017, 08:49

Merci beaucoup pour vos réponses
Jean-Emmanuel
Ingénieur d'étude LNEC


Retourner vers « Questions en cours »

Qui est en ligne

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