Bien plus qu’un beau graphique : Creativité et accessibilité avec ggplot2
data-visualisation
r-how-to
Un parcours rapide des données du Great British Bake Off (Le Meilleur Paatissier) pour illustrer en 45 minutes 15 astuces pour optimiser l’accessibilité de nos graphiques
L’astuce: choisir des formes de point ggplot2 avec un contour (e.g. 21, 22, 25)
5. Une typographie qui guide le regard
Optimiser la hierarchie visuelle du texte avec theme(plot.title = element_text(size = rel(1.6))) pour garder la taille relative des textes si on change la taille de base du texte
6. Une police lisible, qui a du caractère
On recherche ceo I1l qp db et des chiffres bien alignés
Pour faciliter l’alignement avec le reste du texte, mais aussi pour isoler le graphique du reste
11. Une intensité dans le bon sens
Plus de couleur = une valeur plus élevée
`scale_fill/colour_gradient(low = “white”, high = ma_couleur_plus_intense_mais_attenuee), voir 4.
12. Des petits rappels visuels
On peut facilement ajouter des emoji avec ggtext::geom_textbox()
Ou des images/symboles (png/svg) avec ggimage::geom_image
13. Des guides utiles
Pour controller les légendes: guides(fill = "colourbar", size = "none")
Pour modifier le texte sur X or Y ou la légende: scale[](labels = function(x) paste0(x, "mon unité"))
14. Le texte dans le bon sens
Attention à modifier le texte qui existe! strip.text.y.right = element_text(angle = 0)
15. Un emplacement optimisé
Pour éviter de couper le texte ou les symboles en bord de graphique: coord_cartesian(clip = "off")
Pour donner plus de place: `scale_y_continuous(expand = expansion(mult = c(0.1, 0.4)))
Parce qu’on ma beaucoup posé la question pendant les pauses café…
Pour ceux qui explorent l’idée de se mettre à leur compte, j’ai partagé plusieurs fois la métaphore du King du Caniche. Elle n’est pas de moi mais de George Swift et Tracey Miller de Bigger Brighter Bolder. Ils ont un workshop gratuit en ligne (en Anglais) que je recommande à tout le monde pour explorer les idées sur lesquelles il faut réfléchir, idéalement avant de se lancer mais il n’est jamais trop tard!
Enregistrement
Coming soon!
Code
Code
library(tidyverse)creations <- bakeoff::challenges |>select(-technical) |>pivot_longer(c(signature, showstopper)) |>group_by(series) |>mutate(chocolat =sum(grepl("[Cc]hocolat", value)),framboise =sum(grepl("[Rr]aspberr", value)),orange =sum(grepl("[Oo]range", value)) ) |>select(series, chocolat, framboise, orange) |>unique() |>pivot_longer(-series, names_to ="ingredient") |>mutate(rank =rank(-value, ties.method ="min"),mary_berry =case_when(series <8~"oui", TRUE~"non") )couleurs_accessibles <-c("chocolat"="#5F1C34","orange"="#DCA113","framboise"="#d33b66","mary"="#F2CAE4")creations |>ggplot(aes(x = series,y = value,colour = ingredient,fill = ingredient )) +annotate(geom ="rect",xmin =-Inf,xmax =7.5,ymin =-Inf,ymax =Inf,fill = couleurs_accessibles["mary"],alpha =0.3 ) +geom_line(show.legend =FALSE) +geom_vline(xintercept =7.5, linewidth =0.2, colour ="#ca3e8c") + ggtext::geom_textbox(data =data.frame(),aes(x =7.5, y =31, label ="**Les années Mary Berry**"),hjust =1,halign =1,box.colour =NA,colour ="#3f4a57",family ="Inclusive Sans",fill =NA ) +geom_point(aes(shape = ingredient), size =8, colour ="#3f4a57") +labs(title ="Le chocolat demeure l'ingrédient le plus utilisé, même s'il s'est fait brièvement doubler par les oranges en Saison 8",subtitle ="Le nombre de créations incluant du chocolat était bien plus élevé pendant que Mary Berry était dans le jury. On anticipe d'avoir besoin de deux fois plus de chocolat la saison prochaine si elle revient.",x ="Saison",y ="Nombre de créations" ) +scale_shape_manual(values =c("chocolat"=22, "orange"=21, "framboise"=25), ) +scale_fill_manual(values = couleurs_accessibles) +scale_colour_manual(values = couleurs_accessibles) +scale_y_continuous(limits =c(0, 31), expand =expansion(add =c(0, 2))) +scale_x_continuous(breaks =c(1:10)) +theme_minimal(base_size =12) +theme(plot.title.position ="plot",text =element_text(family ="Inclusive Sans", colour ="#3f4a57"),axis.text =element_text(family ="Inclusive Sans", colour ="#3f4a57"),axis.title =element_text(family ="Inclusive Sans", colour ="#3f4a57"),plot.title = marquee::element_marquee(width =1,style = marquee::classic_style(weight ="bold"),margin =margin(12, 0, 18, 0),size =rel(1.6),lineheight =1.15,family ="Inclusive Sans",colour ="#071526" ),plot.subtitle = marquee::element_marquee(width =1,vjust =0,size =rel(1.2),family ="Inclusive Sans",colour ="#3f4a57",lineheight =1.2,margin =margin(12, 0, 24, 0) ),legend.title =element_blank(),legend.position ="bottom",legend.justification =0.5,panel.grid.minor.x =element_blank(),plot.margin =margin_auto(16*1.5),plot.background =element_rect(fill ="#f8f8f8", colour ="#f8f8f8") )