Introduction
Vous pouvez facilement tracer un diagramme circulaire en Python à l’aide de Matplotlib.
Exemples avec Matplotlib
Voici un exemple simple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import matplotlib.pyplot as plt # Données labels = ['Pommes', 'Bananes', 'Cerises', 'Dattes'] sizes = [30, 20, 35, 15] colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99'] explode = (0.05, 0, 0, 0) # Sépare légèrement la première tranche # Création du diagramme plt.figure(figsize=(6,6)) plt.pie( sizes, labels=labels, colors=colors, explode=explode, autopct='%1.1f%%', # Affiche les pourcentages à 1 décimale startangle=90, # Fait démarrer la première tranche à 90° shadow=True ) plt.title("Répartition des fruits") plt.show() |

Explications :
labels: noms des catégories.sizes: valeurs (elles n’ont pas besoin de totaliser 100, sauf si vous voulez des pourcentages).colors: optionnel — définit les couleurs des tranches.explode: optionnel — sépare visuellement les tranches.autopct: affiche les valeurs en pourcentage à l’intérieur du graphique.startangle: oriente le graphique pour une meilleure lisibilité.
Diagramme circulaire “explosé” avec pourcentage + libellé
Idéal pour bien mettre en valeur la composition :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import matplotlib.pyplot as plt # Données sizes = [40, 25, 20, 10, 5] labels = ['Python', 'JavaScript', 'C++', 'Java', 'Autres'] colors = plt.cm.viridis([0.1, 0.3, 0.5, 0.7, 0.9]) explode = [0.1 if s == max(sizes) else 0 for s in sizes] # Tracé plt.figure(figsize=(7,7)) wedges, texts, autotexts = plt.pie( sizes, labels=labels, autopct=lambda p: f'{p:.1f}%\n({int(p*sum(sizes)/100)})', colors=colors, explode=explode, startangle=140, textprops={'color':"w", 'fontsize':12}, shadow=True ) plt.setp(autotexts, size=10, weight="bold") plt.title("Popularité des langages de programmation", fontsize=14) plt.show() |

Astuce : autopct avec une fonction lambda personnalisée permet d’afficher à la fois le pourcentage et la valeur brute.
Diagramme en anneau (Donut Chart)
Les diagrammes en anneau ont un style moderne et sont parfaits quand l’espace est limité :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import matplotlib.pyplot as plt sizes = [50, 30, 15, 5] labels = ['Amérique du Nord', 'Europe', 'Asie', 'Autres'] fig, ax = plt.subplots(figsize=(6,6)) wedges, texts, autotexts = ax.pie( sizes, labels=labels, autopct='%1.1f%%', startangle=90, wedgeprops={'width':0.4, 'edgecolor':'white'} ) ax.set_title("Part de marché par région") plt.show() |
wedgeprops={'width':0.4} transforme le diagramme circulaire en anneau.

Diagramme en double anneau (Nested Donut Chart)
Parfait pour comparer deux niveaux de données — par exemple, régions et sous-régions :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import matplotlib.pyplot as plt outer_sizes = [50, 30, 20] outer_labels = ['Amériques', 'Europe', 'Asie'] inner_sizes = [25, 15, 10, 10, 8, 12, 5, 3, 12] inner_labels = ['USA', 'Canada', 'Brésil', 'Royaume-Uni', 'France', 'Allemagne', 'Chine', 'Inde', 'Japon'] fig, ax = plt.subplots(figsize=(7,7)) ax.pie(outer_sizes, radius=1, labels=outer_labels, wedgeprops=dict(width=0.3, edgecolor='white')) ax.pie(inner_sizes, radius=0.7, labels=inner_labels, wedgeprops=dict(width=0.3, edgecolor='white')) ax.set(aspect="equal", title='Ventes mondiales par région et par pays') plt.show() |
L’anneau externe montre les régions, l’anneau interne montre les pays à l’intérieur de chaque région.

Diagramme circulaire avec palette de couleurs dynamique
Permet d’ajouter automatiquement de la variété grâce aux colormaps :
1 2 3 4 5 6 7 8 9 10 11 12 | import matplotlib.pyplot as plt import numpy as np categories = ['A','B','C','D','E','F','G'] values = np.random.randint(10, 50, size=len(categories)) plt.figure(figsize=(7,7)) plt.pie(values, labels=categories, colors=plt.cm.plasma(np.linspace(0, 1, len(categories))), autopct='%1.1f%%', startangle=90) plt.title('Couleurs dynamiques avec Colormap') plt.show() |
L’utilisation de
1 | plt.cm.<colormap> |
produit automatiquement des dégradés de couleurs esthétiques.

Exemples avec Pandas
Si vous avez déjà un DataFrame, vous pouvez directement tracer un diagramme circulaire :
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd import matplotlib.pyplot as plt data = {'Fruit': ['Pomme', 'Banane', 'Cerise', 'Datte'], 'Quantité': [30, 20, 35, 15]} df = pd.DataFrame(data) df.set_index('Fruit')['Quantité'].plot(kind='pie', autopct='%1.1f%%', figsize=(6,6)) plt.ylabel('') # Supprime le label de l’axe Y plt.title('Répartition des fruits') plt.show() |

Diagramme circulaire à partir d’un DataFrame Pandas
Très utile pour les pipelines de données réelles :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ 'Catégorie': ['Énergie', 'Transport', 'Agriculture', 'Industrie', 'Résidentiel'], 'Émissions': [35, 25, 20, 15, 5] }) df.set_index('Catégorie')['Émissions'].plot( kind='pie', autopct='%1.1f%%', cmap='coolwarm', figsize=(6,6), title='Émissions mondiales de CO₂ par secteur' ) plt.ylabel('') plt.show() |

Peut-on utiliser Seaborn pour créer des diagrammes circulaires ?
Seaborn n’est pas conçu pour les diagrammes circulaires, et l’utiliser à cette fin n’en vaut pas la peine.
La philosophie de conception de Seaborn
Seaborn est construit sur Matplotlib, mais il se concentre sur les visualisations statistiques, par exemple :
- distributions (
sns.histplot,sns.kdeplot) - comparaisons catégorielles (
sns.barplot,sns.boxplot) - relations (
sns.scatterplot,sns.lineplot) - matrices (
sns.heatmap)
Il n’implémente pas de diagrammes circulaires car :
- Les diagrammes circulaires sont peu précis pour comparer les grandeurs.
- Les diagrammes en barres verticales ou horizontales sont plus efficaces pour représenter des proportions.
Alternative : utiliser le style de Seaborn avec Matplotlib
Vous pouvez néanmoins améliorer l’esthétique d’un diagramme circulaire en appliquant le style de Seaborn :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pyplot as plt import seaborn as sns sns.set_theme(style="whitegrid") # applique le thème Seaborn sizes = [40, 25, 20, 15] labels = ['A', 'B', 'C', 'D'] plt.figure(figsize=(6,6)) plt.pie( sizes, labels=labels, autopct='%1.1f%%', startangle=90, colors=sns.color_palette("pastel") ) plt.title("Diagramme circulaire avec style Seaborn") plt.show() |
Cela combine les palettes de couleurs douces de Seaborn et le rendu de Matplotlib.

Meilleures alternatives aux diagrammes circulaires avec Seaborn
Pour représenter des proportions plus efficacement :
sns.barplot()→ comparer les parts d’un toutsns.histplot()avecmultiple='fill'→ barres empilées en pourcentagesns.countplot()→ compter les occurrences par catégoriesns.violinplot()/sns.boxplot()→ visualiser des distributions
Exemple – une alternative au diagramme circulaire :
1 2 3 4 5 6 7 8 9 10 11 12 | import seaborn as sns import pandas as pd import matplotlib.pyplot as plt data = pd.DataFrame({ "Catégorie": ["A", "B", "C", "D"], "Valeur": [40, 25, 20, 15] }) sns.barplot(data=data, x="Catégorie", y="Valeur", palette="pastel") plt.title("Comparaison des proportions (mieux qu’un diagramme circulaire)") plt.show() |

Résumé
| Question | Réponse |
|---|---|
Seaborn dispose-t-il d’une fonction pieplot() ? |
Non |
| Peut-on améliorer le style d’un diagramme circulaire Matplotlib avec Seaborn ? | Oui (via les palettes et thèmes) |
| Est-il utile d’utiliser Seaborn uniquement pour les diagrammes circulaires ? | Pas vraiment |
| Meilleures alternatives Seaborn ? | barplot, countplot, histplot |
Références
| Liens | Site |
|---|---|
| https://matplotlib.org/stable/gallery/pie_and_polar_charts/pie_features.html | Matplotlib – Galerie des diagrammes circulaires |
| https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html | Matplotlib – Documentation officielle pyplot.pie() |
| https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html | Pandas – Méthode DataFrame.plot() (pour les diagrammes circulaires) |
