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

Published

June 17, 2026

Slides

View full screen

Nos 15 astuces, avec quelques ressources supplémentaires

1. Des couleurs qui parlent

  • Pour extraire les coleurs: imagecolorpicker.com
  • Pour les appliquer au graphique: mes_coleurs (avec un named vector!), puis, scale_fill/colour_manual(values = my_colours)

2. Des couleurs facilement différenciables

3. Des couleurs atténuées

4. Un contraste suffisant (3:1 pour les elements graphiques significatifes, 4.5:1 pour le texte ou, encore mieux, 7:1 pour le petit texte)

  • Sauf que ce n’est pas possible de combiner avec 3. si on plus d’une poignée de couleurs: Power of Colour, Nightingale Issue 03
  • 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

7. Des annotations bien situées

  • Idéalement là où le lecteur regarde déjà!
  • Pour placer l’annotation relative au graphique entier: I()

8. Des couleurs pour optimiser la lecture

  • On évite le noir sur le blanc
  • Pour tester les contrastes de texte: colourcontrast.cc

9. De la place pour respirer

10. Un fond pour tout rassembler

  • theme(plot.background = ())
  • 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")
  )

Reuse

Citation

For attribution, please cite this work as:
“Bien Plus Qu’un Beau Graphique : Creativité Et Accessibilité Avec Ggplot2.” 2026. June 17, 2026. https://www.cararthompson.com/talks/rencontresR-2026-beau-graphique/.