Des images dans un ggplot

Contexte : surveiller l’état de santé des abeilles à La Réunion

💻 J’ai envie de te montrer un petit bout d’un travail en cours, en collaboration avec le GDS Réunion.

C’est une association qui, entre autres, s’occupe du suivi sanitaire des abeilles et donc de leur état de santé sur toute l’île de La Réunion.

🐝 Pour cela, 7 ruchers disposés aux 7 coins de l’île sont surveillés tous les mois. Les techniciens du GDS et les apiculteurs qui s’occupent des ruchers en questions récoltent beaucoup de données sur l’état global des colonies d’abeilles et sur la présence de symptomes cliniques, de pathogènes, etc.

👑 Une des choses importantes à suivre dans une colonie, c’est la reine !

Chaque mois, on essaie de repérer la reine. Il y a 3 cas de figure possibles :

  • ❎ on ne voit pas la reine
  • ✍️ on repère la reine et elle n’est pas marquée. Dans ce cas, on lui met, avec un marqueur, un point de couleur qui représente son année de naissance
  • 🎨 on repère la reine et elle est déjà marquée.

Objectif : représenter la reine de la colonie

🗒️ L’objectif global, c’est de produire un rapport mensuel personnalisé pour l’apiculteur afin qu’il puisse suivre lui-même l’état de santé de ses colonies.

⚙️ Ce rapport sera automatisé, c’est-à-dire qu’il est produit avec rmarkdown et qu’il suffit de changer le nom du rucher et la date pour produire un nouveau rapport avec les mêmes éléments sur les données qui nous intéressent.

Ici, je vais te montrer la réflexion en cours pour produire une des figures qui figurera dans ce rapport.

Cette figure doit montrer si la reine a été repérée dans la colonie et de quelle couleur elle est.

Code R

Bon, comme d’habitude, je commence par charger les packages dont je vais avoir besoin :

library(tibble) # pour créer un jeu de données sans fichier externe (csv ou excel)
library(dplyr) # manipulation des jeux de données
library(ggplot2) # graphiques
library(ggimg) # pour insérer des images dans les ggplots
library(knitr) # ici, pour représenter une table dans un rmarkdown

# vecteur de couleurs personnalisées
coul_reine <- c(Blanc = "#BABABA", Jaune = "#FFE100", Rouge = "#ED0000", Vert = "#00AD0E", Bleu = "#0044C2")

Voilà un petit jeu de données exemple, pour m’entraîner :

ruches <- tribble(
  ~Colonie, ~Couleur_de_la_reine,                   ~Statut_de_la_reine,
      "11",              "Jaune",                  "Reine déjà marquée",
      "12",              "Jaune",                  "Reine déjà marquée",
      "13",                   NA,                             "Non vue",
      "14",              "Jaune",                  "Reine déjà marquée",
      "15",              "Blanc", "Nouvelle reine marquée le jour même"
  )

kable(ruches) # la fonction kable(), c'est juste pour que la table soit jolie
Colonie Couleur_de_la_reine Statut_de_la_reine
11 Jaune Reine déjà marquée
12 Jaune Reine déjà marquée
13 NA Non vue
14 Jaune Reine déjà marquée
15 Blanc Nouvelle reine marquée le jour même

J’ai envie de créer un seul graphique qui combine la couleur et le statut de la reine.

Voilà ma première tentative :

ggplot(ruches) +
  aes(x = Colonie, y = 1, fill = Couleur_de_la_reine, label = Colonie, shape = Statut_de_la_reine) + # rôles des variables
  geom_tile(colour = "white") + # les rectangles en couleur de fond
  geom_point(size = 5, position = position_nudge(y = -0.2)) + # les points représentant le statut
  geom_text(size = 5, nudge_y = 0.2) + # les identifiants des colonies
  scale_fill_manual(values = coul_reine, drop = FALSE, na.value = "transparent") + # choix des couleurs
  scale_shape_manual(values = c("Non vue" = 1, "Nouvelle reine marquée le jour même" = 2, "Reine déjà marquée" = 14)) + # choix des formes de point
  labs(fill = "Couleur de la reine", y = NULL, shape = "Statut de la reine") + # titre des légendes
  coord_fixed() +
  theme_minimal() +
  theme(axis.text = element_blank())

Les informations y sont :

  • le statut de la reine est encodé par la forme du point représentant la colonie
  • la couleur de la reine est encodée par la couleur derrière les points

Et en même temps, je ne suis pas hyper contente de ce graphique. Je ne le trouve pas très intuitif et la légende est bizarre avec ces gros points noirs qui arrivent par défaut…

Avec mes partenaires, nous avons eu l’idée de faire quelque chose d’un peu plus rigolo !

# Je créé ici une colonne qui contient le chemin vers les images que j'ai envie d'afficher dans le graphique
ruches <- ruches %>% 
  mutate(
    chemin_reine = case_when(
      Statut_de_la_reine == "Non vue" ~ "crossed-eye.png",
      Statut_de_la_reine == "Nouvelle reine marquée le jour même" ~ "marker-pen.png",
      Statut_de_la_reine == "Reine déjà marquée" ~ "bee.png"
    )
  )

kable(ruches)
Colonie Couleur_de_la_reine Statut_de_la_reine chemin_reine
11 Jaune Reine déjà marquée bee.png
12 Jaune Reine déjà marquée bee.png
13 NA Non vue crossed-eye.png
14 Jaune Reine déjà marquée bee.png
15 Blanc Nouvelle reine marquée le jour même marker-pen.png
ggplot(ruches) +
  aes(x = Colonie, y = 1, img = chemin_reine) +
  geom_point_img(size = 3) + # le statut de la reine, cette fonction marche comme un geom_point, sauf qu'elle prend en compte l'aesthetic "img" pour afficher une image à la place d'un point classique
  geom_point(aes(colour = Couleur_de_la_reine), size = 4) + # la couleur de la reine
  scale_colour_manual(values = coul_reine, drop = FALSE, na.value = "transparent") +
  labs(colour = "Couleur de la reine", y = NULL) +
  theme_minimal() +
  theme(axis.text.y = element_blank(), panel.grid = element_blank())

La documentation du package ggimg que j’utilise pour afficher des images dans le graphique se trouve juste ici.

J’ai trouvé ce package en farfouillant dans les extensions de ggplot2 : exts.ggplot2.tidyverse.org. Il y a de quoi bien s’amuser !


✨ Un grand merci pour la confiance du GDS Réunion où j’accompagne actuellement ses techniciens et ses chercheurs vers des méthodes et des résultats plus clairs, reproductibles, efficaces, valorisables.

Anna Doizy
Anna Doizy
Chercheuse, consultante et formatrice freelance
Libre comme l’R

Méthodologie scientifique et analyses de données statistiques