library(ggplot2)
tg <- aggregate(len ~ supp + dose, data = ToothGrowth, FUN = mean)
tg$dose <- factor(tg$dose)
tg supp dose len
1 OJ 0.5 13.23
2 VC 0.5 7.98
3 OJ 1 22.70
4 VC 1 16.77
5 OJ 2 26.06
6 VC 2 26.14
opts_tooltip(), opts_hover(), opts_hover_inv()onclickInfo-bulles HTML enrichies, mise en évidence de groupe au survol et actions au clic avec opts_tooltip() et opts_hover()
Explorez en profondeur les trois attributs esthétiques interactifs de ggiraph — tooltip (texte brut et HTML enrichi), data_id (mise en évidence au survol et mise en évidence de groupe) et onclick (une action ou un lien) — et mettez-les en forme avec opts_tooltip() et opts_hover() dans girafe().
9 juillet 2026
9 juillet 2026
tooltip porte le texte de survol — et il accepte le HTML, ce qui permet d’afficher une étiquette formatée sur plusieurs lignes.data_id relie les éléments entre eux : associez-le à un groupe et survoler un élément met en évidence tout le groupe.onclick exécute un extrait de JavaScript au clic — ouvrir un lien, ou transmettre une sélection à Shiny.girafe(options = list(...)) : opts_tooltip() pour la boîte d’info-bulle, opts_hover() pour l’élément mis en évidence et opts_hover_inv() pour estomper tout le reste.Vous avez un diagramme en barres groupées et vous voulez que le lecteur lise les chiffres — la moyenne exacte derrière chaque barre — sans afficher d’étiquette sur chaque colonne. Et lorsqu’il survole la barre d’un supplément, vous voulez que tout le groupe du supplément s’illumine pour que la comparaison entre les doses soit évidente.
C’est exactement ce que font les trois attributs esthétiques interactifs de ggiraph. Cette leçon est une exploration approfondie et ciblée des trois : tooltip (texte brut et HTML enrichi), data_id (mise en évidence au survol, y compris la mise en évidence de tout un groupe) et onclick (une action au clic). Si vous débutez avec ggiraph, commencez par Premiers pas avec ggiraph — ici, nous supposons que vous connaissez le motif geom_*_interactive() + girafe() et nous approfondissons sa mise en forme.
Nous utilisons le jeu de données intégré ToothGrowth — la longueur des dents de cochons d’Inde selon la dose de vitamine C et le supplément d’administration (OJ = jus d’orange, VC = acide ascorbique). Agrégez-le à la longueur moyenne par supplément × dose pour que chaque barre représente une valeur résumée.
supp dose len
1 OJ 0.5 13.23
2 VC 0.5 7.98
3 OJ 1 22.70
4 VC 1 16.77
5 OJ 2 26.06
6 VC 2 26.14
Six lignes — deux suppléments à trois doses — les six barres que nous allons dessiner.
Voici le graphique ggplot2 ordinaire : la longueur moyenne des dents en ordonnée, la dose en abscisse, deux barres par dose colorées par supplément avec une palette viridis adaptée au daltonisme. Rien d’interactif pour l’instant — c’est le graphique que vous savez déjà réaliser.
library(ggplot2)
tg <- aggregate(len ~ supp + dose, data = ToothGrowth, FUN = mean)
tg$dose <- factor(tg$dose)
ggplot(tg, aes(x = dose, y = len, fill = supp)) +
geom_col(position = position_dodge(0.8), width = 0.7) +
scale_fill_viridis_d(begin = 0.2, end = 0.7) +
labs(
x = "Dose (mg/day)", y = "Mean tooth length",
fill = "Supplement", title = "Tooth growth by dose and supplement"
) +
theme_minimal()
Le graphique est clair, mais statique : le lecteur peut estimer les hauteurs à l’œil, sans lire les moyennes exactes, et comparer un supplément sur les trois doses demande de plisser les yeux. Les trois attributs esthétiques interactifs corrigent ces deux points.
Chaque geom_*_interactive() comprend les trois mêmes attributs esthétiques, associés dans aes() comme tout autre :
| Attribut esthétique | Ce qu’il fait | Dans cette leçon |
|---|---|---|
tooltip |
Texte ou HTML affiché au survol. | Une étiquette HTML enrichie sur plusieurs lignes. |
data_id |
Un identifiant pour l’élément ; le survoler le met en évidence, et les éléments partageant un identifiant se mettent en évidence ensemble. | L’associer au groupe pour mettre en évidence tout le supplément. |
onclick |
JavaScript exécuté quand l’élément est cliqué. | Ouvrir un lien (ou piloter une sélection Shiny). |
Nous allons intégrer l’info-bulle et data_id dans un vrai widget, puis traiter onclick séparément.
La valeur de tooltip n’est qu’un vecteur de caractères de la longueur de vos données — et ggiraph le rend en HTML. Ainsi, au lieu d’un simple nombre, vous pouvez assembler une étiquette formatée sur plusieurs lignes avec paste0() : un nom de supplément en gras, la dose et la longueur moyenne. Associez data_id = supp en même temps pour que chaque barre porte l’identifiant de son groupe de supplément (nous l’utilisons pour la mise en évidence juste après).
library(ggplot2)
library(ggiraph)
tg <- aggregate(len ~ supp + dose, data = ToothGrowth, FUN = mean)
tg$dose <- factor(tg$dose)
p <- ggplot(tg, aes(x = dose, y = len, fill = supp)) +
geom_col_interactive(
aes(
tooltip = paste0(
"<b>", supp, "</b><br>",
"dose = ", dose, " mg<br>",
"mean length = ", round(len, 1)
),
data_id = supp
),
position = position_dodge(0.8), width = 0.7
) +
scale_fill_viridis_d(begin = 0.2, end = 0.7) +
labs(
x = "Dose (mg/day)", y = "Mean tooth length",
fill = "Supplement", title = "Tooth growth by dose and supplement"
) +
theme_minimal()
p
Rendu sous forme d’image statique, p est identique au premier graphique — les balises <b>/<br> ne sont pas dessinées sur le graphique, elles sont stockées comme métadonnées cachées sur chaque barre. Le HTML ne prend vie que lorsque girafe() affiche l’info-bulle. Notez le data_id = supp : les deux barres OJ partagent l’identifiant "OJ", les deux barres VC partagent "VC" — c’est cet identifiant partagé qui fait qu’un groupe entier se met en évidence ensemble.
opts_tooltip(), opts_hover(), opts_hover_inv()girafe() rend le graphique sous forme de widget SVG interactif, et son argument options contrôle l’apparence des interactions :
opts_tooltip(css = ...) met en forme la boîte d’info-bulle — arrière-plan, couleur, marge intérieure, coins arrondis.opts_hover(css = ...) met en forme le ou les éléments partageant le data_id survolé — ici, les deux barres du supplément que vous pointez. Nous ajoutons un contour foncé pour faire ressortir le groupe.opts_hover_inv(css = ...) met en forme l’inverse — chaque élément hors du groupe survolé. Définir opacity:0.3 estompe l’autre supplément pour que celui que vous inspectez ressorte.Définissez explicitement width_svg/height_svg pour que le widget réserve son espace et que la page ne se décale pas pendant son chargement.
library(ggplot2)
library(ggiraph)
tg <- aggregate(len ~ supp + dose, data = ToothGrowth, FUN = mean)
tg$dose <- factor(tg$dose)
p <- ggplot(tg, aes(x = dose, y = len, fill = supp)) +
geom_col_interactive(
aes(
tooltip = paste0(
"<b>", supp, "</b><br>",
"dose = ", dose, " mg<br>",
"mean length = ", round(len, 1)
),
data_id = supp
),
position = position_dodge(0.8), width = 0.7
) +
scale_fill_viridis_d(begin = 0.2, end = 0.7) +
labs(
x = "Dose (mg/day)", y = "Mean tooth length",
fill = "Supplement", title = "Tooth growth by dose and supplement"
) +
theme_minimal()
girafe(
ggobj = p,
width_svg = 7,
height_svg = 4.5,
options = list(
opts_tooltip(
css = "background:#1b2b40;color:#ffffff;padding:6px 10px;border-radius:6px;font-family:sans-serif;font-size:13px;"
),
opts_hover(css = "stroke:#1b2b40;stroke-width:1.5px;"),
opts_hover_inv(css = "opacity:0.3;")
)
)Survolez n’importe quelle barre : une info-bulle formatée affiche le supplément, la dose et la longueur moyenne ; les deux barres de ce supplément se mettent en évidence avec un contour foncé ; et l’autre supplément passe à 30 % d’opacité. C’est tout l’intérêt — le lecteur lit les chiffres exacts à la demande et compare un supplément entre les doses d’un coup d’œil, à partir du même graphique que vous aviez déjà.
Un SVG interactif est opaque pour les lecteurs d’écran, voici donc les données derrière le widget — la longueur moyenne des dents pour chaque supplément et chaque dose.
| Supplement | Dose (mg/day) | Mean length |
|---|---|---|
| OJ | 0.5 | 13.2 |
| VC | 0.5 | 8.0 |
| OJ | 1 | 22.7 |
| VC | 1 | 16.8 |
| OJ | 2 | 26.1 |
| VC | 2 | 26.1 |
onclickLe troisième attribut esthétique, onclick, prend un extrait de JavaScript qui s’exécute quand l’élément est cliqué. L’usage le plus courant est d’ouvrir un lien — par exemple, envoyer le lecteur vers une page de référence. Vous l’associez dans aes() aux côtés des autres :
Comme onclick est du JavaScript brut, échappez soigneusement les guillemets et gardez-le court ; la logique complexe doit résider dans une fonction appelée par la chaîne, pas en ligne.
Dans Shiny, vous n’avez généralement pas besoin de onclick du tout : donnez un identifiant à la sortie de girafe() et ajoutez opts_selection(), et un clic définit une entrée réactive (input$<id>_selected) contenant le data_id cliqué — le serveur peut ainsi répondre au clic en R. Consultez la série Shiny pour créer des applications réactives autour d’un graphique.
Demandez à Prova « comment mettre un petit ggplot dans une info-bulle ggiraph ? » — elle répond avec du code que vous pouvez exécuter, l’explication est donc reproductible. The runtime is the judge. Demander à Prova →
Les balises HTML apparaissent comme du texte littéral (<b> s’affiche dans l’info-bulle). Cela se produit lorsque l’info-bulle est échappée. ggiraph rend par défaut la chaîne tooltip en HTML, donc <b>…</b> et <br> devraient s’afficher — vérifiez que vous passez la chaîne brute (et non quelque chose qui l’a échappée en HTML en amont) et que votre appel à girafe() ne surcharge pas l’échappement de l’info-bulle.
Survoler une barre ne met pas en évidence son groupe. La mise en évidence du groupe repose entièrement sur data_id. Si chaque barre a un identifiant unique (par ex. data_id = interaction(supp, dose)), seule la barre survolée se met en évidence. Pour mettre en évidence tout un groupe, associez data_id à la variable de groupe (data_id = supp) afin que les membres partagent un même identifiant.
L’estompage (opts_hover_inv) ne se déclenche pas. opts_hover_inv() n’a des éléments à estomper que lorsque certains éléments partagent le data_id survolé et d’autres non. Cela fonctionne ici parce que data_id = supp répartit les barres en deux groupes ; avec un identifiant unique par élément, il n’y a pas de groupe « inverse » à estomper.
Associez l’attribut esthétique tooltip à une chaîne contenant du HTML, par ex. tooltip = paste0("<b>", supp, "</b><br>value = ", round(len, 1)). ggiraph rend la valeur de tooltip en HTML, donc des balises comme <b> et <br> mettent en forme l’étiquette. La valeur doit être un vecteur de caractères de la même longueur que vos données.
Associez data_id à la variable de regroupement (par exemple data_id = supp). Les éléments qui partagent un data_id se mettent en évidence ensemble, donc survoler n’importe quelle barre d’un groupe met en évidence le groupe entier. Mettez en forme la mise en évidence avec opts_hover() et estompez le reste avec opts_hover_inv() dans girafe(options = list(...)).
opts_hover() met en forme l’élément (ou le groupe) qui partage le data_id survolé — ce que vous pointez. opts_hover_inv() met en forme l’inverse : tout ce qui ne partage pas l’identifiant survolé. Un motif courant consiste à souligner ou éclaircir avec opts_hover() et à estomper le reste avec opts_hover_inv(css = "opacity:0.3;").
Associez l’attribut esthétique onclick à un extrait de JavaScript, par ex. onclick = "window.open('https://example.com')". Il s’exécute quand l’élément est cliqué. Dans une application Shiny, utilisez plutôt opts_selection() pour qu’un clic définisse une entrée réactive contenant le data_id cliqué.
Passez du CSS à opts_tooltip() dans girafe(options = list(...)), par ex. opts_tooltip(css = "background:#1b2b40;color:#fff;padding:6px 10px;border-radius:6px;"). Cela contrôle l’arrière-plan, la couleur du texte, la marge intérieure et les coins de l’info-bulle indépendamment de son contenu.
Partez de ce diagramme en barres groupées statique de la moyenne de len par dose et supp :
Tâche : rendez-le interactif pour que (1) survoler une barre affiche une info-bulle sur deux lignes avec le supplément en gras et sa longueur moyenne, et (2) le survol mette en évidence le groupe entier du supplément tout en estompant l’autre supplément. De quel geom, de quels deux attributs esthétiques et de quelles options de girafe() avez-vous besoin ?
Remplacez geom_col() par geom_col_interactive(). Construisez l’info-bulle avec paste0() en utilisant <b> et <br>. Associez data_id = supp pour que le groupe partage un identifiant, puis dans girafe() ajoutez opts_hover() et opts_hover_inv(css = "opacity:0.3;").
library(ggplot2)
library(ggiraph)
tg <- aggregate(len ~ supp + dose, data = ToothGrowth, FUN = mean)
tg$dose <- factor(tg$dose)
p <- ggplot(tg, aes(x = dose, y = len, fill = supp)) +
geom_col_interactive(
aes(
tooltip = paste0("<b>", supp, "</b><br>mean = ", round(len, 1)),
data_id = supp
),
position = position_dodge(0.8), width = 0.7
) +
theme_minimal()
girafe(
ggobj = p, width_svg = 7, height_svg = 4.5,
options = list(
opts_hover(css = "stroke:#1b2b40;stroke-width:1.5px;"),
opts_hover_inv(css = "opacity:0.3;")
)
)geom_col_interactive() lit les attributs esthétiques interactifs ; tooltip (construit avec paste0() + HTML) fournit l’étiquette sur deux lignes ; data_id = supp regroupe les barres ; opts_hover() souligne le groupe et opts_hover_inv() estompe le reste.
Vous voulez que survoler une barre mette en évidence toutes les barres partageant son supplément. Quel attribut esthétique contrôle cela ?
data_id. Les éléments qui partagent une valeur de data_id se mettent en évidence ensemble, donc l’associer à la variable de groupe (data_id = supp) met en évidence tout le groupe au survol. tooltip ne fait que définir le texte de survol et onclick n’exécute du code qu’au clic.
Les trois attributs esthétiques interactifs font tout le travail : tooltip affiche le détail à la demande (en texte brut ou en HTML enrichi), data_id lie les éléments en groupes qui se mettent en évidence ensemble, et onclick transforme un clic en action. Vous les mettez en forme là où ils sont rendus — opts_tooltip(), opts_hover() et opts_hover_inv() dans girafe() — et le graphique reste le ggplot2 prêt à publier dont vous êtes parti.
geom_*_interactive() + girafe() sur lesquelles cette leçon s’appuie. · Graphiques ggpubr et factoextra interactifs — les mêmes attributs esthétiques sur des graphiques statistiques et multivariés. · Diagramme en barres en R avec ggplot2 — le diagramme en barres groupées statique sous-jacent.Prêt à passer à la vitesse supérieure ?
Recevez les nouvelles leçons R & Python par e-mail
Pratique, reproductible, sans spam. Désinscription à tout moment.
Double opt-in. Nous ne partageons jamais votre e-mail.
Cette leçon est reproductible : les figures sont exécutées au moment du build (si elles s’affichent, le code fonctionne). Copiez n’importe quel bloc et exécutez-le pour reproduire ces graphiques. The runtime is the judge.
@online{2026,
author = {},
title = {Info-bulles, effets de survol et clic avec ggiraph en R},
date = {2026-07-09},
url = {https://www.datanovia.com/learn/data-visualization/ggiraph/tooltips-hover-click},
langid = {fr}
}