Noter
Cliquez ici pour télécharger l'exemple de code complet
Guide fléché #
Ajout de patchs fléchés aux tracés.
Les flèches sont souvent utilisées pour annoter les tracés. Ce didacticiel montre comment tracer des flèches qui se comportent différemment lorsque les limites de données sur un tracé sont modifiées. En général, les points d'un tracé peuvent être soit fixés dans "l'espace de données" soit dans "l'espace d'affichage". Quelque chose tracé dans l'espace de données se déplace lorsque les limites de données sont modifiées - un exemple serait les points dans un nuage de points. Quelque chose tracé dans l'espace d'affichage reste statique lorsque les limites de données sont modifiées - un exemple serait un titre de figure ou les étiquettes d'axe.
Les flèches se composent d'une tête (et éventuellement d'une queue) et d'une tige tracée entre un point de départ et un point d'arrivée, appelés désormais "points d'ancrage". Nous montrons ici trois cas d'utilisation pour tracer des flèches, selon que la tête ou les points d'ancrage doivent être fixés dans les données ou dans l'espace d'affichage :
Forme de la tête fixée dans l'espace d'affichage, points d'ancrage fixés dans l'espace de données
Forme de la tête et points d'ancrage fixés dans l'espace d'affichage
Patch entier corrigé dans l'espace de données
Ci-dessous, chaque cas d'utilisation est présenté tour à tour.
Forme de la tête fixée dans l'espace d'affichage et points d'ancrage fixés dans l'espace de données #
Ceci est utile si vous annotez un tracé et que vous ne souhaitez pas que la flèche change de forme ou de position si vous effectuez un panoramique ou une mise à l'échelle du tracé.
Dans ce cas, nous utilisons patches.FancyArrowPatch
.
Notez que lorsque les limites de l'axe sont modifiées, la forme de la flèche reste la même, mais les points d'ancrage se déplacent.
[(0.0, 2.0), (0.0, 2.0)]
Forme de la tête et points d'ancrage fixés dans l'espace d'affichage #
Ceci est utile si vous annotez un tracé et que vous ne souhaitez pas que la flèche change de forme ou de position si vous effectuez un panoramique ou une mise à l'échelle du tracé.
Dans ce cas, nous utilisons patches.FancyArrowPatch
, et passons l'argument mot-clé
transform=ax.transAxes
où ax
sont les axes auxquels nous ajoutons le patch.
Notez que lorsque les limites de l'axe sont modifiées, la forme et l'emplacement de la flèche restent les mêmes.
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[0].transAxes)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[1].transAxes)
axs[1].add_patch(arrow)
axs[1].set(xlim=(0, 2), ylim=(0, 2))
[(0.0, 2.0), (0.0, 2.0)]
Forme de la tête et points d'ancrage fixés dans l'espace de données #
Dans ce cas, nous utilisons patches.Arrow
, ou patches.FancyArrow
(ce dernier est en orange).
Notez que lorsque les limites de l'axe sont modifiées, la forme et l'emplacement de la flèche changent.
FancyArrow
L'API de est relativement maladroite, et nécessite notamment de passer
length_includes_head=True
pour que la pointe de la flèche soit éloignée du début de la flèche. Il n'est inclus dans cette référence que parce qu'il s'agit de la classe de flèche renvoyée par (en vert).(dx, dy)
Axes.arrow
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[0].add_patch(arrow)
axs[0].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[1].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[1].add_patch(arrow)
axs[1].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
axs[1].set(xlim=(0, 2), ylim=(0, 2))
[(0.0, 2.0), (0.0, 2.0)]
plt.show()
Durée totale d'exécution du script : (0 minutes 1,191 secondes)