Une solution simple et efficace pour réaliser des timelines avec R consiste à employer le package vistime
, et sa fonctiongg_vistime()
.
Cette fonction s’applique sur un data frame qui doit comporter au minimum 3 variables :
D’autres variables peuvent ensuite être employées pour gérer la couleur des périodes, la couleur des textes, etc…
De plus, comme son nom l’indique (parce qu’elle commence par gg
), la fonction gg_vistime()
est ggplot2 compatible. Cela veut dire, que dans un second temps, nous pourrons employer des couches ggplot2 pour modifier les couleurs, employer un thème et même modifier l’étiquette des dates représenter sur l’axe des x.
Nous allons créer un jeu de données afin de représenter chronologiquement 5 étapes de développement d’un projet. Pour cela, nous avons besoin :
stage
) ; chaque étape correpondant à une lignestart_date
)end_date
)library(lubridate)
# Création des données
stages <- c("Conception", "Développement", "Tests", "Déploiement", "Maintenance")
start_dates <- ymd(c("2023-01-01", "2023-06-01", "2024-01-01", "2024-07-01", "2025-01-01"))
end_dates <- ymd(c("2023-05-31", "2023-12-31", "2024-06-30", "2024-12-31", "2025-12-31"))
# Créer le DataFrame
mydata1 <- data.frame( stages, start_dates, end_dates)
Voici le data frame créé :
# Afficher le DataFrame
mydata1
stages start_dates end_dates
1 Conception 2023-01-01 2023-05-31
2 Développement 2023-06-01 2023-12-31
3 Tests 2024-01-01 2024-06-30
4 Déploiement 2024-07-01 2024-12-31
5 Maintenance 2025-01-01 2025-12-31
La timeline se crée facilement avec la fonction gg_vistime()
. Cette fonction dispose de 12 arguments qui permettent de gérer l’apparence de la timeline. Les plus importants sont :
col.event
col.start
col.end
library(vistime)
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates")
Vous trouverez un descriptif des 12 arguments de la fonction, dans la vignette du du package : https://cran.r-project.org/web/packages/vistime/vignettes/vistime-vignette.html
Pour modifier la couleur des boites, il s’agit d’ajouter, dans le dataframe, une variable contenant les couleurs désirées. Cette variable est ensuite spécifiée dans l’argument col.color
de la fonction gg_vistime()
library(dplyr)
mydata1 <- mydata1 %>%
mutate(colors = c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd"))
mydata1
stages start_dates end_dates colors
1 Conception 2023-01-01 2023-05-31 #1f77b4
2 Développement 2023-06-01 2023-12-31 #ff7f0e
3 Tests 2024-01-01 2024-06-30 #2ca02c
4 Déploiement 2024-07-01 2024-12-31 #d62728
5 Maintenance 2025-01-01 2025-12-31 #9467b
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
title = "Timeline du Projet", # ajout d'un titre
col.color = "colors")
C’est le même principe pour la couleur de la police, avec cette fois l’argument col.fontcolor
:
mydata1$col_text <- c("orange", "white", "magenta","black" ,"navyblue")
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
title = "Timeline du Projet",
col.color = "colors",
col.fontcolor = "col_text")
Comme je le disais précédemment, la fonction gg_vistime()
est compatible avec ggplot2.
Pour appliquer un thème spécifique, il suffit d’utiliser une couche theme()
Ici j’ai choisi le thème theme_blackboard()
du package see
et le theme theme_solarized()
package ggthemes
:
library(see)
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
title = "Timeline du Projet",
col.color = "colors",
col.fontcolor = "col_text")+
theme_blackboard() # du package see
library(ggthemes)
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
title = "Timeline du Projet",
col.color = "colors",
col.fontcolor = "col_text")+
theme_solarized()
Pour représenter les timelines de plusieurs objets, il est nécessaire de disposer d’un data frame global, avec une variable catégorielle dont les modalités correspondent aux différents objets. Voici un exemple :
# Deuxième tableau de données
stages <- c("Conception", "Développement", "Tests", "Déploiement", "Maintenance")
start_dates <- ymd(c("2023-08-01", "2024-10-01", "2025-02-01", "2025-08-01", "2026-01-01"))
end_dates <- ymd(c("2024-09-30", "2025-01-31", "2025-07-31", "2025-12-31", "2027-08-31"))
colors <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd")
# Créer le DataFrame pour le second projet
mydata2 <- data.frame( stages, start_dates, end_dates, colors)
mydata <-bind_rows(mydata1, mydata2)
# ajout du projet
mydata$projet <- rep(c("Projet1","Projet2"),each=5)
# Afficher le DataFrame
mydata
stages start_dates end_dates colors col_text projet
1 Conception 2023-01-01 2023-05-31 #1f77b4 orange Projet1
2 Développement 2023-06-01 2023-12-31 #ff7f0e white Projet1
3 Tests 2024-01-01 2024-06-30 #2ca02c magenta Projet1
4 Déploiement 2024-07-01 2024-12-31 #d62728 black Projet1
5 Maintenance 2025-01-01 2025-12-31 #9467bd navyblue Projet1
6 Conception 2023-08-01 2024-09-30 #1f77b4 <NA> Projet2
7 Développement 2024-10-01 2025-01-31 #ff7f0e <NA> Projet2
8 Tests 2025-02-01 2025-07-31 #2ca02c <NA> Projet2
9 Déploiement 2025-08-01 2025-12-31 #d62728 <NA> Projet2
10 Maintenance 2026-01-01 2027-08-31 #9467bd <NA> Projet2
# Time line
gg_vistime(mydata,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
col.color = "colors",
col.group = "projet")
Cela a été un véritable défi pour moi ! J’ai rencontré plusieurs obstacles en raison de problèmes avec le format des données, sans pour autant saisir l’origine exacte de ces difficultés. Cependant, après de multiples tentatives, j’ai finalement trouvé une solution qui fonctionne, même si je ne la saisis pas entièrement…
Dans un premier temps, si on regarde le graph obtenu par défaut, on peut voir que celui-ci affiche une étiquette de date par année, et que seule l’année, avec 4 chiffres, est présente :
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
col.color = "colors")
Pour pouvoir afficher une date à chaque changement d’évènement, il est nécessaire que la variable contienne aussi des éléments d’heure.
Je ne sais pas pourquoi, mais ça fonctionne !
Pour cela, je colle la chaine de caractère “00-00-00” (ça correspond minuit – c’est à dire 00 heure, 00 minutes et 00 secondes). Puis je passe le tout en format POSIXCt avec la fonction ymd_hms()
du lubridate. J’ai bien essayé d’avoir une variable initiale en format POSIXCt, mais ça ne fonctionne pas.
Ensuite, il suffit d’employer la couche scale_x_datetime()
de ggplot2
:
library(ggplot2)
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
col.color = "colors")+
scale_x_datetime(breaks=ymd_hms(paste(mydata1$end_dates, "00-00-00")))
Dans un second temps, nous pouvons spécifier le format de l’étiquette de la date, afin qu’il corresponde à nos besoins. Par exemple, si je veux afficher le jour en chiffre puis le mois abrégé en lettre, et l’année avec 2 chiffres, j’emploie date_labels = "%d-%b %y
.
Mais, attention, pour utiliser cet argument, il est nécessaire, au préalable, d’installer le package scales
:
library(scales)
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
col.color = "colors")+
scale_x_datetime(breaks=ymd_hms(paste(mydata1$end_dates, "00-00-00")),
date_labels = "%d-%b %y")+
theme(axis.text.x=element_text(angle=30, hjust=0.8))
Si on regarde avec attention, on peut voir qu’il manque la première date. On peut alors l’ajouter dans l’argument breaks
avec ce code breaks=c(ymd_hms(paste(min(mydata1$start_dates), "00-00-00")), ymd_hms(paste(mydata1$end_dates, "00-00-00")))
Ça consiste à créer un vecteur avec toutes les dates à afficher.
Pour cela, j’ajoute la première date avec min(mydata1$start_dates)
et je lui colle aussi l’heure de minuit avec la fonction paste()
, et je passe le tout en POSIXCt avec la fonction ymd_hms()
:
gg_vistime(mydata1,
col.event = "stages",
col.start = "start_dates",
col.end = "end_dates",
col.color = "colors",
col.group = "projet")+
scale_x_datetime(breaks=c(
ymd_hms(paste(min(mydata1$start_dates), "00-00-00")),
ymd_hms(paste(mydata1$end_dates, "00-00-00"))),
date_labels = "%d-%b %y")+
theme(axis.text.x=element_text(angle=30, hjust=0.8))
Voici un résumé des formats d’affichage des dates et d’heures :
D’après le R gGraphics Cookbook : https://r-graphics.org/recipe-axes-axis-date
En résumé, les timelines sont des outils de visualisation très intéressants, qui permettent de représenter des séquences temporelles d’événements de manière claire et cohérente.
Comme nous l’avons vu, il est relativement facile de réaliser des timeline sous R, grâce au package vistime
et sa fonction gg_vistime()
. De plus, de par sa compatibilité avec ggplot2, cette fonction permet de créer des chronologies personnalisées, adaptées à une grande variété de besoins.
L’objectif de cet article était de vous fournir les connaissances et techniques nécessaires pour construire vos propres graphiques de timeline avec R.
J’espère qu’il vous permettra non seulement de gagner du temps dans votre travail, mais aussi de transmettre des informations complexes de façon plus accessible et engageante.
Si cet article vous a été utile, ou si vous avez des questions, des suggestions, ou des exemples de vos propres timelines que vous aimeriez partager, n’hésitez pas à laisser un commentaire ci-dessous. Votre feedback est non seulement apprécié, mais il contribue également à enrichir la discussion et l’apprentissage de toute notre communauté.
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.