Agregar anotaciones de ángulo a las flechas de Matplotlib

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá a agregar anotaciones de ángulo a los estilos de flechas con corchetes creados usando FancyArrowPatch en Matplotlib. Las anotaciones de ángulo son útiles para indicar la dirección y el tamaño de los ángulos en una gráfica. Al final de este laboratorio, podrá crear estilos de flechas con corchetes con anotaciones de ángulo y personalizarlos para ajustarse a sus necesidades específicas.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas necesarias y configurar la gráfica

Primero, necesitamos importar las bibliotecas necesarias y configurar la gráfica. Vamos a utilizar matplotlib.pyplot y numpy. También crearemos una figura y un objeto de eje para graficar nuestros datos.

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.patches import FancyArrowPatch

fig, ax = plt.subplots()
ax.set(xlim=(0, 6), ylim=(-1, 5))
ax.set_title("Orientation of the bracket arrows relative to angleA and angleB")

Definir una función para obtener el punto de una línea vertical rotada

Definiremos una función que tome las coordenadas del origen, la longitud de la línea y el ángulo en grados como entradas y devuelva las coordenadas xy del extremo de la línea vertical rotado por el ángulo especificado.

def get_point_of_rotated_vertical(origin, line_length, degrees):
    """Return xy coordinates of the vertical line end rotated by degrees."""
    rad = np.deg2rad(-degrees)
    return [origin[0] + line_length * np.sin(rad),
            origin[1] + line_length * np.cos(rad)]

Crear flechas con corchetes con anotaciones de ángulo

Crearemos tres estilos de flechas con corchetes con anotaciones de ángulo usando FancyArrowPatch. Cada flecha con corchete tendrá un valor de ángulo diferente para angleA y angleB. También agregaremos líneas verticales para indicar la posición de las anotaciones de ángulo.

style = ']-['
for i, angle in enumerate([-40, 0, 60]):
    y = 2*i
    arrow_centers = ((1, y), (5, y))
    vlines = ((1, y + 0.5), (5, y + 0.5))
    anglesAB = (angle, -angle)
    bracketstyle = f"{style}, angleA={anglesAB[0]}, angleB={anglesAB[1]}"
    bracket = FancyArrowPatch(*arrow_centers, arrowstyle=bracketstyle,
                              mutation_scale=42)
    ax.add_patch(bracket)
    ax.text(3, y + 0.05, bracketstyle, ha="center", va="bottom", fontsize=14)
    ax.vlines([line[0] for line in vlines], [y, y], [line[1] for line in vlines],
              linestyles="--", color="C0")

Agregar flechas y texto de anotación de ángulo

Agregaremos flechas y texto de anotación de ángulo a cada estilo de flecha con corchete. Primero, obtendremos las coordenadas superiores de los parches dibujados en angleA y angleB. Luego, definiremos las direcciones de conexión para las flechas de anotación. Finalmente, agregaremos flechas y texto de anotación a la gráfica.

    ## Get the top coordinates for the drawn patches at A and B
    patch_tops = [get_point_of_rotated_vertical(center, 0.5, angle)
                  for center, angle in zip(arrow_centers, anglesAB)]
    ## Define the connection directions for the annotation arrows
    connection_dirs = (1, -1) if angle > 0 else (-1, 1)
    ## Add arrows and annotation text
    arrowstyle = "Simple, tail_width=0.5, head_width=4, head_length=8"
    for vline, dir, patch_top, angle in zip(vlines, connection_dirs,
                                            patch_tops, anglesAB):
        kw = dict(connectionstyle=f"arc3,rad={dir * 0.5}",
                  arrowstyle=arrowstyle, color="C0")
        ax.add_patch(FancyArrowPatch(vline, patch_top, **kw))
        ax.text(vline[0] - dir * 0.15, y + 0.7, f'{angle}°', ha="center",
                va="center")

Mostrar la gráfica

Mostraremos la gráfica usando plt.show().

plt.show()

Resumen

En este laboratorio, aprendiste cómo agregar anotaciones de ángulo a estilos de flechas con corchetes creados usando FancyArrowPatch en Matplotlib. También aprendiste cómo personalizar los estilos de flechas con corchetes para adaptarlos a tus necesidades específicas. Siguiendo las instrucciones detalladas y el código de ejemplo proporcionados, ahora debes ser capaz de crear estilos de flechas con corchetes con anotaciones de ángulo en tus propios gráficos de Matplotlib.