Pyramides des âges supperposées avec texture

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

Anjasoa Randrianarijaona
Messages : 3
Enregistré le : 25 Sep 2018, 12:10

Pyramides des âges supperposées avec texture

Messagepar Anjasoa Randrianarijaona » 03 Oct 2018, 09:50

Bonjour à tous,

Je voudrais faire une figure avec 2 pyramides des âges supperposées où celle du dessus soit en texture (rayure par exemple) pour que l'on puisse voir la pyramide du dessous même si il y a des barres plus longues que les barres du dessous.

Je ne sais pas si je me fais comprendre,
mais voici un code:

Code : Tout sélectionner

#Chargement de package
library(plotrix)

# Creation de la base "donnee1"
donnee1<-c(1:9)
donnee1<-as.data.frame(donnee1)
donnee1$age<-c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +")
donnee1$nbrM<-c(25,26,17,12,10,5,3,1.4,0.6)
donnee1$nbrF<-c(23,27,20,13,7,4,3,2,1)

#Creation de la base "donnee2"
donnee2<-c(1:9)
donnee2<-as.data.frame(donnee2)
donnee2$age<-c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +")
donnee2$nbrM<-c(14,30,18, 13,10,8,4,2,1)
donnee2$nbrF<-c(20, 33,  16,  11,  8, 5,  4,  2,1)

#Les deux pyramides:
    #Pyramide de la base "donnee1"
    par(mar=pyramid.plot(donnee1$nbrM,donnee1$nbrF,labels=c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +"),
                         lxcol="#7F7F7F",rxcol="#7F7F7F",
                         laxlab=c(0,5,10,15,20,25,30,35),raxlab=c(0,5,10,15,20,25,30,35),
                         gap=3.2))
    par(new=TRUE) #pour obtenir des figures supperposées
    #Pyramide de la base "donnee2"
    par(mar=pyramid.plot(donnee2$nbrM,donnee2$nbrF,labels=c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +"),
                         lxcol=NULL,rxcol=NULL,
                         laxlab=c(0,5,10,15,20,25,30,35),raxlab=c(0,5,10,15,20,25,30,35),
                         gap=3.2))

Au lieu de mettre les couleurs, pour la pyramide de la base de données "donnee2", en NULL ou en d'autres couleurs, est-il possible que les remplissages soient en texture. Sinon, existe t-il une solution alternative?

Merci d'avance

jean lobry
Messages : 633
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Pyramides des âges supperposées avec texture

Messagepar jean lobry » 03 Oct 2018, 18:12

Bonjour Anjasoa,

j'arrive à exécuter ton code. C'est très bon signe, il y aura forcément une réponse positive ici tôt ou tard.

bien amicalement,

jean lobry

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

Re: Pyramides des âges supperposées avec texture

Messagepar Mickael Canouil » 04 Oct 2018, 12:58

Bonjour,

voici deux propositions de visualisation utilisant ggplot2.

Packages:

Code : Tout sélectionner

library(tidyverse)
library(ggpubr)


Données:

Code : Tout sélectionner

# Creation de la base "donnee1"
donnee1<-c(1:9)
donnee1<-as.data.frame(donnee1)
donnee1$age<-c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +")
donnee1$nbrM<-c(25,26,17,12,10,5,3,1.4,0.6)
donnee1$nbrF<-c(23,27,20,13,7,4,3,2,1)

#Creation de la base "donnee2"
donnee2<-c(1:9)
donnee2<-as.data.frame(donnee2)
donnee2$age<-c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79","80 et +")
donnee2$nbrM<-c(14,30,18, 13,10,8,4,2,1)
donnee2$nbrF<-c(20, 33,  16,  11,  8, 5,  4,  2,1)

# Reformat data
donnee <- bind_rows(
  donnee1 %>% mutate(data = "donnee1", donnee1 = NULL),
  donnee2 %>% mutate(data = "donnee2", donnee2 = NULL)
) %>%
  mutate(age = factor(x = age, levels = unique(age))) %>%
  gather(key = "label", value = "nombre", nbrM, nbrF) %>%
  mutate(
    sex = factor(x = unname(c("nbrM" = "Male", "nbrF" = "Female")[label]), levels = c("Female", "Male")),
    direction = c("nbrM" = -1, "nbrF" = 1)[label],
    alpha = data
  )


Première proposition

Code : Tout sélectionner

ggplot() +
  theme_classic() +
  geom_bar(
    data = filter(donnee, data=="donnee1"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.90
  ) +
  geom_bar(
    data = filter(donnee, data=="donnee2"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.45
  ) +
  geom_hline(yintercept = 0) +
  coord_flip() +
  scale_y_continuous(labels = function(x){paste0(abs(x), "%")}) +
  scale_alpha_manual(values = c(0.2, 1), breaks = c("donnee1", "donnee2")) +
  scale_fill_discrete(drop = FALSE) +
  labs(x = "Age", y = NULL, fill = "Sex")

Image

Deuxième proposition (plus tordue comme approche)

Code : Tout sélectionner

pmale <- ggplot() +
  theme_classic(base_size = 11) +
  geom_bar(
    data = filter(donnee, sex=="Male"&data=="donnee1"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.90
  ) +
  geom_bar(
    data = filter(donnee, sex=="Male"&data=="donnee2"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.45
  ) +
  coord_flip() +
  scale_y_continuous(labels = function(x){paste0(abs(x), "%")}, expand = expand_scale(mult = c(0.05, 0))) +
  scale_x_discrete(position = "top") +
  scale_alpha_manual(values = c(0.2, 1), breaks = c("donnee1", "donnee2")) +
  scale_fill_discrete(drop = FALSE) +
  labs(x = NULL, y = NULL, fill = "Sex") +
  theme(axis.text.y.right = element_text(hjust = 0.5)) +
  theme(plot.margin = margin(t = 11/2, r = 11/2, b = 11/2, l = 0, unit = "pt"))

pfemale <- ggplot() +
  theme_classic(base_size = 11) +
  geom_bar(
    data = filter(donnee, sex=="Female"&data=="donnee1"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.90
  ) +
  geom_bar(
    data = filter(donnee, sex=="Female"&data=="donnee2"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.45
  ) +
  coord_flip() +
  scale_y_continuous(labels = function(x){paste0(abs(x), "%")}, expand = expand_scale(mult = c(0, 0.05))) +
  scale_x_discrete(position = "bottom") +
  scale_alpha_manual(values = c(0.2, 1), breaks = c("donnee1", "donnee2")) +
  scale_fill_discrete(drop = FALSE) +
  labs(x = NULL, y = NULL, fill = "Sex") +
  theme(axis.text.y = element_blank()) +
  theme(plot.margin = margin(t = 11/2, r = 11/2, b = 11/2, l = 0, unit = "pt"))
 
ggarrange(pmale, pfemale, ncol = 2, align = "hv", common.legend = TRUE, legend = "right") %>%
  annotate_figure(top = text_grob("Age", face = "bold", size = 14, hjust = 2.6))

Image

Cordialement,
Mickaël

jean lobry
Messages : 633
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Pyramides des âges supperposées avec texture

Messagepar jean lobry » 04 Oct 2018, 17:16

Bonjour Mickael,

c'est vraiment pas mal du tout, ça me donne envie de me lancer dans l'exploration de ggplot2 dès que j'aurai un peu de temps pour ça :-)

Amicalement,
jean

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

Re: Pyramides des âges supperposées avec texture

Messagepar Mickael Canouil » 05 Oct 2018, 09:23

Bonjour Jean,

merci, là c'est assez brute comme mise en page, mais il est très facile de modifier l'ensemble des éléments d'un graphique ggplot2 et ce de façon plutôt explicite.
Et maintenant, grâce à Thomas Lin Pedersen (https://github.com/thomasp85/gganimate) et depuis useR2018, il est possible de s'amuser un peu plus avec ces graphiques: https://www.youtube.com/watch?v=21ZWDrTukEs

Par exemple:

Code : Tout sélectionner

library(gganimate)
ggplot(data = donnee, aes(x = age, y = nombre*direction, fill = sex)) +
  theme_classic() +
  geom_bar(
    stat = "identity",
    width = 0.90
  ) +
  geom_hline(yintercept = 0) +
  coord_flip() +
  scale_y_continuous(labels = function(x){paste0(abs(x), "%")}, breaks = seq(-40, 40, 10)) +
  scale_fill_discrete(drop = FALSE) +
  labs(x = "Age", y = NULL, fill = "Sex", title = "Age pyramid from {closest_state}") +
  transition_states(states = data, transition_length = 2, state_length = 5)

Image

PS: Pour une publication, ce n'est pas le plus approprié, mais pour une inclusion dans une présentation je trouve que cela peut être un plus (à utiliser avec parcimonie)
Mickaël

Anjasoa Randrianarijaona
Messages : 3
Enregistré le : 25 Sep 2018, 12:10

Re: Pyramides des âges supperposées avec texture

Messagepar Anjasoa Randrianarijaona » 11 Oct 2018, 07:13

Bonjour,

Merci Beaucoup Mickael. En fait, on pensait pouvoir mettre la figure dans une publication d'article scientifique, donc les couleurs en nuance de gris seulement.C'est pour cela que j'ai précisé le point en n'utilisant pas d'autres couleurs.
Mais quand même, avec ton code, j'ai pu découvrir une autre utilité de ggplot2.
Ou peut-être bien qu'avec ton code, et en y essayant de transformer les couleurs j'aurais une solution.
Je vais essayer. Merci encore.

En passant, merci Jean pour ton encouragement.

Amicalement,

Anjasoa

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

Re: Pyramides des âges supperposées avec texture

Messagepar Mickael Canouil » 11 Oct 2018, 08:21

Bonjour,

pour les couleurs, il suffit de changer celles-ci à l'aide des fonction scale_fill* https://ggplot2.tidyverse.org/reference/index.html

En remplaçant l'échelle de couleur par défaut "scale_fill_discrete(drop = FALSE)" par "scale_fill_grey(drop = FALSE)"

Code : Tout sélectionner

ggplot() +
  theme_classic() +
  geom_bar(
    data = filter(donnee, data=="donnee1"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.90
  ) +
  geom_bar(
    data = filter(donnee, data=="donnee2"),
    aes(x = age, y = nombre*direction, fill = sex, group = data, alpha = alpha),
    stat = "identity",
    width = 0.45
  ) +
  geom_hline(yintercept = 0) +
  coord_flip() +
  scale_y_continuous(labels = function(x){paste0(abs(x), "%")}) +
  scale_alpha_manual(values = c(0.2, 1), breaks = c("donnee1", "donnee2")) +
  scale_fill_grey(drop = FALSE) +
  labs(x = "Age", y = NULL, fill = "Sex")


Image

Si cete proposition (forme générale) vous convient, je vous suggère de regarder l'aide de ggplot2 pour personnaliser les aspects esthétiques du graphique (couleur, style des axes, polices, etc.).

Cordialement,
Mickaël

Anjasoa Randrianarijaona
Messages : 3
Enregistré le : 25 Sep 2018, 12:10

Re: Pyramides des âges supperposées avec texture

Messagepar Anjasoa Randrianarijaona » 16 Oct 2018, 08:24

Bonjour,

D'accord, merci beaucoup Mickael.

Cordialement

Anjasoa


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Serge Rapenne et 1 invité