Noter
Cliquez ici pour télécharger l'exemple de code complet
Étiqueter une tarte et un beignet #
Bienvenue dans la boulangerie Matplotlib. Nous allons créer un camembert et un graphique en anneau à travers le et montrer comment les étiqueter avec un
ainsi qu'avec .pie method
legend
annotations
Comme d'habitude, nous commencerions par définir les importations et créerions une figure avec des sous-parcelles. C'est maintenant l'heure de la tarte. En partant d'une recette de tarte, nous créons les données et une liste d'étiquettes à partir de celle-ci.
Nous pouvons fournir une fonction à l' autopct
argument, qui étendra l'étiquetage automatique en pourcentage en affichant des valeurs absolues ; nous calculons ce dernier à partir de données relatives et de la somme connue de toutes les valeurs.
Nous créons ensuite le camembert et stockons les objets retournés pour plus tard. Le premier élément retourné du tuple retourné est une liste des coins. Ce sont des
matplotlib.patches.Wedge
patchs, qui peuvent directement être utilisés comme poignées pour une légende. Nous pouvons utiliser l' bbox_to_anchor
argument de la légende pour positionner la légende en dehors du secteur. Ici, nous utilisons les coordonnées des axes avec l'emplacement ; c'est-à-dire que le point central gauche de la légende sera au point central gauche de la boîte englobante, s'étendant de à dans les coordonnées des axes.(1, 0, 0.5,
1)
"center left"
(1, 0)
(1.5, 1)
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
recipe = ["375 g flour",
"75 g sugar",
"250 g butter",
"300 g berries"]
data = [float(x.split()[0]) for x in recipe]
ingredients = [x.split()[-1] for x in recipe]
def func(pct, allvals):
absolute = int(np.round(pct/100.*np.sum(allvals)))
return "{:.1f}%\n({:d} g)".format(pct, absolute)
wedges, texts, autotexts = ax.pie(data, autopct=lambda pct: func(pct, data),
textprops=dict(color="w"))
ax.legend(wedges, ingredients,
title="Ingredients",
loc="center left",
bbox_to_anchor=(1, 0, 0.5, 1))
plt.setp(autotexts, size=8, weight="bold")
ax.set_title("Matplotlib bakery: A pie")
plt.show()
Il est maintenant temps pour le beignet. En partant d'une recette de beignet, nous transcrivons les données en nombres (convertissant 1 œuf en 50 g), et traçons directement la tarte. La tarte? Attendez... ça va être un beignet, n'est-ce pas ? Eh bien, comme nous le voyons ici, le beignet est une tarte, ayant un certain width
jeu sur les coins, qui est différent de son rayon. C'est aussi simple que possible. Cela se fait via l' wedgeprops
argument.
Nous voulons ensuite étiqueter les coins via
annotations
. Nous créons d'abord des dictionnaires de propriétés communes, que nous pouvons ensuite passer comme argument de mot-clé. Nous parcourons ensuite tous les coins et pour chaque
calculer l'angle du centre du coin,
à partir de cela obtenir les coordonnées du point à cet angle sur la circonférence,
déterminer l'alignement horizontal du texte, en fonction de quel côté du cercle se trouve le point,
mettre à jour le style de connexion avec l'angle obtenu pour que la flèche d'annotation pointe vers l'extérieur du beignet,
enfin, créez l'annotation avec tous les paramètres précédemment déterminés.
fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
recipe = ["225 g flour",
"90 g sugar",
"1 egg",
"60 g butter",
"100 ml milk",
"1/2 package of yeast"]
data = [225, 90, 50, 60, 100, 5]
wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),
bbox=bbox_props, zorder=0, va="center")
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1)/2. + p.theta1
y = np.sin(np.deg2rad(ang))
x = np.cos(np.deg2rad(ang))
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
kw["arrowprops"].update({"connectionstyle": connectionstyle})
ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
horizontalalignment=horizontalalignment, **kw)
ax.set_title("Matplotlib bakery: A donut")
plt.show()
Et le voici, le beignet. Notez cependant que si nous devions utiliser cette recette, les ingrédients suffiraient pour environ 6 beignets - la production d'un énorme beignet n'a pas été testée et pourrait entraîner des erreurs de cuisine.
Références
L'utilisation des fonctions, méthodes, classes et modules suivants est illustrée dans cet exemple :