Diagramme circulaire en R (ggpubr) : ggpie & ggdonutchart
Tracez un diagramme circulaire ou en anneau étiqueté avec ggpie() et ggdonutchart() — sans la tuyauterie de coord_polar()
Tracez un diagramme circulaire ou en anneau prêt à publier en R en un seul appel avec ggpubr — ggpie() et ggdonutchart(). Ajoutez des étiquettes de pourcentage à l’intérieur ou à l’extérieur des tranches, colorez avec les palettes de revues (jco, npg) et obtenez un thème épuré sans la tuyauterie de coord_polar().
Date de publication
10 juillet 2026
Modifié
11 juillet 2026
AstucePoints clés
ggpie() trace un diagramme circulaire prêt à publier en un seul appel : passez le data frame, la colonne de valeurs, une colonne label, et colorez les tranches avec fill + une palette nommée ("jco", "npg", …).
ggdonutchart() prend les mêmes arguments et trace un anneau — un diagramme circulaire avec un trou — qui atténue le centre et est souvent plus reposant pour l’œil.
Calculez les étiquettes de pourcentage en R de base avec paste0(round(100 * value / sum(value)), "%"), puis placez-les à l’intérieur des tranches avec lab.pos = "in" ou à l’extérieur (par défaut) avec lab.pos = "out".
Les palettes de revues — "jco", "npg", "lancet", "aaas" — sont adaptées au daltonisme et prêtes à publier. palette = accepte un nom de journal ou un vecteur hex, mais pas"viridis".
ggpubr applique un thème épuré automatiquement, si bien qu’un diagramme circulaire étiqueté tient en une fonction — pas de tuyauterie coord_polar() ou theme_void().
Vous préférez la grammaire couche par couche ? Consultez la leçon ggplot2 diagramme circulaire pour la recette coord_polar().
Vous avez une répartition en parties d’un tout — part de marché, réponses à une enquête, ventilation d’un budget — et vous voulez un diagramme circulaire ou en anneau épuré pour un rapport ou une diapositive. Dans ggplot2 de base, il n’existe pas de geom_pie() : vous construisez une barre empilée et vous la courbez avec coord_polar(), puis vous calculez les positions des étiquettes à la main (la leçon diagramme circulaire ggplot2 détaille cette recette).
ggpubr — le package de graphiques de publication écrit par le fondateur de Datanovia, Alboukadel Kassambara — réduit tout cela à un seul appel. ggpie() et sa fonction sœur ggdonutchart() prennent un data frame plus des noms de colonnes sous forme de chaînes, colorent les tranches avec une palette de revue, appliquent un thème épuré et placent les étiquettes pour vous. Cette leçon couvre les deux : un diagramme circulaire de base, les étiquettes de pourcentage à l’intérieur ou à l’extérieur des tranches, les palettes de couleurs de journaux et la variante en anneau.
Deux fonctions portent toute la leçon :
ggpie() — un diagramme circulaire prêt à publier. Colorez par groupe avec fill + palette, étiquetez les tranches, et choisissez où placer les étiquettes (lab.pos).
ggdonutchart() — la même interface, tracée comme un anneau avec un trou au milieu.
Nous utilisons partout une petite table d’enquête autonome — des comptages illustratifs de l’outil principal qu’un groupe d’analystes privilégie — si bien que chaque bloc s’exécute par lui-même.
Un diagramme circulaire en un seul appel
Voici la figure phare. Commencez par les données : une table de comptages bruts, une ligne par catégorie. Ajoutez une colonne label, puis appelez ggpie() avec la colonne de valeurs ("users"), colorez les tranches par fill = "tool", et passez une palette de journal. Ce seul appel constitue toute la recette — pas de coord_polar(), pas de theme_void().
library(ggpubr)survey <-data.frame(tool =c("R", "Python", "SQL", "Other"),users =c(410, 350, 180, 60))# percentage labels, computed in base Rsurvey$lab <-paste0(round(100* survey$users /sum(survey$users)), "%")ggpie(survey, "users", label ="lab",fill ="tool", color ="white", palette ="jco")
Les arguments se lisent de gauche à droite : "users" est la valeur qui fixe l’angle de chaque tranche, label = "lab" affiche le pourcentage que nous avons calculé, fill = "tool" colore les tranches par catégorie, color = "white" trace la fine bordure blanche entre elles, et palette = "jco" applique le schéma de couleurs du Journal of Clinical Oncology. ggpubr ajoute la légende et un thème épuré automatiquement.
Vous préférez construire le diagramme circulaire à partir de la grammaire — geom_col() + coord_polar(), couche par couche ? Consultez la leçon ggplot2 diagramme circulaire. ggpie() est le raccourci de publication en un seul appel pour cette même idée.
Étiquettes de pourcentage, à l’intérieur ou à l’extérieur
Un diagramme circulaire est bien plus facile à lire quand chaque tranche porte sa valeur. Nous avons déjà construit l’étiquette en R de base — paste0(round(100 * users / sum(users)), "%") transforme des comptages bruts en une chaîne de pourcentage. Le choix qu’il reste à faire est où l’étiquette se place : lab.pos = "out" (par défaut) l’affiche juste à l’extérieur de la tranche, lab.pos = "in" la centre à l’intérieur.
library(ggpubr)survey <-data.frame(tool =c("R", "Python", "SQL", "Other"),users =c(410, 350, 180, 60))survey$lab <-paste0(round(100* survey$users /sum(survey$users)), "%")ggpie(survey, "users", label ="lab",lab.pos ="in", # centre the label inside each slicefill ="tool", color ="white", palette ="jco")
Placez les étiquettes à l’intérieur quand les tranches sont assez grandes pour contenir le texte ; gardez-les à l’extérieur (par défaut) quand une tranche fine tronquerait l’étiquette. Si une tranche très fine gêne encore sa voisine, un anneau (ci-dessous) donne plus de place aux étiquettes.
Palettes de couleurs de journaux
L’argument palette = est la source du fini de publication de ggpubr. Il accepte les palettes de revues prêtes à l’emploi — des schémas adaptés au daltonisme nommés d’après les journaux qui les utilisent :
palette
Schéma
"jco"
Journal of Clinical Oncology (azur, or, gris, rouge)
"npg"
Nature Publishing Group
"lancet"
The Lancet
"aaas"
Science / AAAS
Remplacez "jco" par "npg" pour recolorer le même diagramme circulaire avec les teintes cliniques feutrées de Nature :
Vous pouvez aussi passer votre propre vecteur hex — palette = c("#3a86d4", "#2a9d8f", "#f4a261", "#adb5bd") — une couleur par groupe dans l’ordre de la légende, pour une palette de marque ou maison.
AvertissementLe piège "viridis"
palette = n’accepte pas"viridis". Passer palette = "viridis" échoue silencieusement — ggpubr revient à l’échelle de teintes par défaut de ggplot2 (les teintes par défaut régulièrement espacées), qui n’est pas adaptée au daltonisme. Pour une véritable échelle viridis, ajoutez une couche ggplot2 au graphique renvoyé : ggpie(...) + scale_fill_viridis_d(). Pour la plupart des figures de publication, un nom de journal ("jco", "npg") est le choix le plus simple et le plus sûr.
Un diagramme en anneau en un seul appel
Un anneau est un diagramme circulaire avec un trou percé au milieu. Le trou atténue le centre et donne un peu plus d’air aux tranches fines et à leurs étiquettes. ggdonutchart() prend les mêmes arguments que ggpie() — seul le nom de la fonction change.
Tout ce que vous avez appris pour le diagramme circulaire — lab.pos, les palettes de revues, un vecteur hex personnalisé — fonctionne à l’identique ici. Optez pour un anneau quand le centre du cercle est un bruit visuel dont vous préféreriez vous débarrasser, ou quand vous voulez placer un titre ou un total au milieu de la figure.
Ordonner les tranches
Par défaut, les tranches suivent l’ordre des lignes de votre data frame. Pour fixer un ordre précis — la plus grande d’abord, ou une séquence pertinente — faites de la catégorie un facteur avec les niveaux dans l’ordre voulu. ggpubr trace alors les tranches dans cet ordre.
library(ggpubr)survey <-data.frame(tool =c("R", "Python", "SQL", "Other"),users =c(410, 350, 180, 60))survey$lab <-paste0(round(100* survey$users /sum(survey$users)), "%")# order the slices largest → smallestsurvey$tool <-factor(survey$tool, levels =c("R", "Python", "SQL", "Other"))ggpie(survey, "users", label ="lab",fill ="tool", color ="white", palette ="jco")
Ordonner par taille (ou par toute séquence naturelle) rend le graphique plus facile à parcourir et garde la légende dans le même ordre que les tranches.
Une note sur les diagrammes circulaires vs les barres
Les diagrammes circulaires et les anneaux sont parfaits pour une impression rapide de parties d’un tout avec une poignée de catégories. Mais l’œil humain compare les longueurs bien plus précisément que les angles ou les aires — deux tranches de 22 % et 25 % semblent presque identiques. Quand votre lecteur doit classer les catégories ou lire les valeurs avec précision, un diagramme en barres trié est le choix le plus clair ; consultez la leçon diagrammes en barres pour la voie ggpubr ggbarplot(). Gardez le diagramme circulaire pour le moment « voici les parties du tout » avec seulement quelques tranches.
Essayez en direct
Les graphiques ci-dessus ont été rendus au moment de la construction. Vous voulez expérimenter ? Modifiez le code et appuyez sur Run — il s’exécute dans votre navigateur via webR (pas de serveur, pas d’installation). Essayez de remplacer palette par "npg", de déplacer les étiquettes avec lab.pos = "in", ou de changer les comptages.
Maintenant la version en anneau — le seul changement est le nom de la fonction. Remettez ggdonutchart en ggpie pour les comparer côte à côte.
Vous travaillez en Python ? Un guide de diagramme circulaire matplotlib/plotly arrive dans la série Python.
🟢 Avec un agent IA
Demandez à Prova« transforme mon data frame de comptages par catégorie en un diagramme circulaire ggpubr étiqueté avec des pourcentages » — elle répond avec du code que vous pouvez exécuter sur vos propres données, ce qui rend la recette reproductible. The runtime is the judge.Demander à Prova →
Problèmes fréquents
Les tranches ne sont pas étiquetées.ggpie() étiquette à partir d’une colonne, pas d’une expression calculée — construisez d’abord une colonne d’étiquettes (df$lab <- paste0(round(100 * df$value / sum(df$value)), "%")) et passez son nom : label = "lab".
La palette est ignorée / les couleurs semblent erronées. Une palette nommée ne prend effet que lorsque vous mappez une variable à fill (par exemple fill = "tool"). Et palette = "viridis" revient silencieusement à la teinte par défaut non adaptée au daltonisme — utilisez "jco"/"npg", un vecteur hex, ou ajoutez scale_fill_viridis_d().
Les tranches sont dans le mauvais ordre. L’ordre des tranches suit les données. Définissez la catégorie comme un facteur avec levels = dans l’ordre voulu (df$tool <- factor(df$tool, levels = c(...))).
Les étiquettes des tranches fines se chevauchent. Gardez lab.pos = "out" (par défaut) pour que les petites tranches ne tronquent pas leur texte, ou passez à ggdonutchart(), qui donne un peu plus de place aux étiquettes.
Questions fréquentes
NoteComment créer un diagramme circulaire en R avec ggpubr ?
Utilisez ggpie() : ggpie(df, "value", label = "lab", fill = "group", palette = "jco") trace un diagramme circulaire prêt à publier en un seul appel. Passez la colonne de valeurs comme deuxième argument, une colonne label pour le texte des tranches, mappez fill à votre catégorie, et ajoutez une palette de journal. ggpubr applique un thème épuré automatiquement — pas besoin de coord_polar().
NoteComment créer un diagramme en anneau en R ?
Utilisez ggdonutchart() — il prend les mêmes arguments que ggpie() et trace un anneau (un diagramme circulaire avec un trou) : ggdonutchart(df, "value", label = "lab", fill = "group", palette = "jco"). Passer d’un diagramme circulaire à un anneau est un changement d’un seul mot, de ggpie à ggdonutchart.
NoteComment ajouter des étiquettes de pourcentage à un diagramme circulaire ggpubr ?
Calculez les pourcentages en R de base et stockez-les dans une colonne : df$lab <- paste0(round(100 * df$value / sum(df$value)), "%"). Passez ensuite cette colonne à ggpie() avec label = "lab". Utilisez lab.pos = "in" pour centrer les étiquettes à l’intérieur des tranches ou lab.pos = "out" (par défaut) pour les placer juste à l’extérieur.
NoteQuelles palettes de couleurs puis-je utiliser avec ggpubr ?
palette = accepte les palettes de revues adaptées au daltonisme — "jco", "npg", "lancet", "aaas" — ou votre propre vecteur hex (une couleur par groupe, dans l’ordre de la légende). Elle n’accepte pas"viridis" ; pour une échelle viridis, ajoutez plutôt scale_fill_viridis_d() au graphique renvoyé.
NoteDiagramme circulaire ou diagramme en barres : lequel utiliser ?
Utilisez un diagramme circulaire (ou un anneau) pour une impression rapide de parties d’un tout avec seulement quelques catégories. Quand les lecteurs doivent classer des catégories ou comparer des valeurs avec précision, un diagramme en barres trié est plus clair — l’œil lit les longueurs bien plus précisément que les angles.
Testez vos connaissances
ImportantExercice : un diagramme en anneau étiqueté
Complétez le code pour que l’enquête soit tracée sous forme d’anneau (ggdonutchart), avec l’étiquette de pourcentage label affichée, colorée par tool avec la palette "npg" et des bordures de tranches blanches.
# The donut function is ggdonutchart (same arguments as ggpie).# White borders: color = "white".# Nature palette: palette = "npg".
Vérification rapide. Vous appelez ggpie(df, "value", fill = "group", palette = "viridis") et les tranches ressortent en rouge/vert/bleu au lieu des couleurs viridis. Pourquoi ?
AstuceAfficher la réponse
palette = n’accepte pas "viridis" — elle revient silencieusement à l’échelle de teintes par défaut de ggplot2 (rouge/vert/bleu), qui n’est pas adaptée au daltonisme. Utilisez un nom de journal comme "jco" ou "npg", passez votre propre vecteur hex, ou ajoutez scale_fill_viridis_d() au graphique pour une véritable échelle viridis.
Conclusion
Vous avez tracé un diagramme circulaire et un anneau prêts à publier à la façon ggpubr — ggpie() et ggdonutchart(), chacun un seul appel avec fill + une palette de journal, des étiquettes de pourcentage calculées en R de base et placées à l’intérieur ou à l’extérieur des tranches, et des tranches ordonnées avec un facteur. Comme ggpubr applique un thème épuré automatiquement, il n’y a pas de tuyauterie coord_polar() ou theme_void() à écrire.
Pour la grammaire couche par couche derrière un diagramme circulaire, consultez la leçon ggplot2 diagramme circulaire. Et rappelez-vous le compromis : les diagrammes circulaires conviennent à une vue rapide de parties d’un tout avec quelques catégories — pour un classement précis, optez pour un diagramme en barres.
Cette leçon est reproductible : les figures sont exécutées au moment de la construction (si elles s’affichent, le code fonctionne), et le bac à sable et le quiz se réexécutent en direct dans votre navigateur. The runtime is the judge.