Adicionar Anotações de Ângulo às Setas do Matplotlib

Beginner

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

Introdução

Neste laboratório, você aprenderá como adicionar anotações de ângulo a estilos de seta de colchete criados usando FancyArrowPatch em Matplotlib. As anotações de ângulo são úteis para indicar a direção e o tamanho dos ângulos em um gráfico. Ao final deste laboratório, você será capaz de criar estilos de seta de colchete com anotações de ângulo e personalizá-los para atender às suas necessidades específicas.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar as bibliotecas necessárias e configurar o gráfico

Primeiramente, precisamos importar as bibliotecas necessárias e configurar o gráfico. Usaremos matplotlib.pyplot e numpy. Também criaremos uma figura e um objeto de eixo para plotar nossos dados.

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("Orientação das setas de colchete em relação a angleA e angleB")

Definir uma função para obter o ponto de uma linha vertical rotacionada

Definiremos uma função que recebe as coordenadas da origem, o comprimento da linha e o ângulo em graus como entradas e retorna as coordenadas xy do final da linha vertical rotacionada pelo â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)]

Criar setas de colchete com anotações de ângulo

Criaremos três estilos de setas de colchete com anotações de ângulo usando FancyArrowPatch. Cada seta de colchete terá um valor de ângulo diferente para angleA e angleB. Também adicionaremos linhas verticais para indicar a posição das anotações 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")

Adicionar setas e texto de anotação de ângulo

Adicionaremos setas e texto de anotação de ângulo a cada estilo de seta de colchete. Primeiro, obteremos as coordenadas superiores para os patches desenhados em angleA e angleB. Em seguida, definiremos as direções de conexão para as setas de anotação. Finalmente, adicionaremos setas e texto de anotação ao gráfico.

    ## 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")

Exibir o gráfico

Exibiremos o gráfico usando plt.show().

plt.show()

Resumo

Neste laboratório, você aprendeu como adicionar anotações de ângulo aos estilos de seta de colchete criados usando FancyArrowPatch em Matplotlib. Você também aprendeu como personalizar os estilos de seta de colchete para atender às suas necessidades específicas. Seguindo as instruções passo a passo e o código de exemplo fornecido, você agora deve ser capaz de criar estilos de seta de colchete com anotações de ângulo em seus próprios gráficos Matplotlib.