É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 methodlegendannotations

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' autopctargument, 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.Wedgepatchs, qui peuvent directement être utilisés comme poignées pour une légende. Nous pouvons utiliser l' bbox_to_anchorargument 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()
Boulangerie Matplotlib : Une tarte

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 widthjeu sur les coins, qui est différent de son rayon. C'est aussi simple que possible. Cela se fait via l' wedgepropsargument.

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()
Boulangerie Matplotlib : Un beignet

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 :

Galerie générée par Sphinx-Gallery