Guia de seta #

Adicionando patches de seta aos gráficos.

As setas são frequentemente usadas para anotar plotagens. Este tutorial mostra como plotar setas que se comportam de maneira diferente quando os limites de dados em um gráfico são alterados. Em geral, os pontos em um gráfico podem ser fixados em "espaço de dados" ou "espaço de exibição". Algo plotado no espaço de dados se move quando os limites de dados são alterados - um exemplo seria os pontos em um gráfico de dispersão. Algo plotado no espaço de exibição permanece estático quando os limites de dados são alterados - um exemplo seria o título de uma figura ou os rótulos dos eixos.

As setas consistem em uma cabeça (e possivelmente uma cauda) e uma haste desenhada entre um ponto inicial e um ponto final, chamados de 'pontos de ancoragem' de agora em diante. Aqui, mostramos três casos de uso para plotar setas, dependendo se a cabeça ou os pontos de ancoragem precisam ser fixados nos dados ou no espaço de exibição:

  1. Forma da cabeça fixada no espaço de exibição, pontos de ancoragem fixados no espaço de dados

  2. Forma da cabeça e pontos de ancoragem fixados no espaço de exibição

  3. Patch inteiro corrigido no espaço de dados

Abaixo, cada caso de uso é apresentado separadamente.

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
x_tail = 0.1
y_tail = 0.5
x_head = 0.9
y_head = 0.8
dx = x_head - x_tail
dy = y_head - y_tail

Forma da cabeça fixada no espaço de exibição e pontos de ancoragem fixados no espaço de dados #

Isso é útil se você estiver anotando um gráfico e não quiser que a seta mude de forma ou posição se você deslocar ou dimensionar o gráfico.

Neste caso usamos patches.FancyArrowPatch.

Observe que quando os limites do eixo são alterados, a forma da seta permanece a mesma, mas os pontos de ancoragem se movem.

fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
                                 mutation_scale=100)
axs[0].add_patch(arrow)

arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
                                 mutation_scale=100)
axs[1].add_patch(arrow)
axs[1].set(xlim=(0, 2), ylim=(0, 2))
guia de seta
[(0.0, 2.0), (0.0, 2.0)]

Formato da cabeça e pontos de ancoragem fixados no espaço de exibição #

Isso é útil se você estiver anotando um gráfico e não quiser que a seta mude de forma ou posição se você aplicar panorâmica ou dimensionar o gráfico.

Neste caso, usamos patches.FancyArrowPatch, e passamos o argumento de palavra-chave transform=ax.transAxesonde axestá os eixos aos quais estamos adicionando o patch.

Observe que quando os limites do eixo são alterados, a forma e a localização da seta permanecem as mesmas.

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))
guia de seta
[(0.0, 2.0), (0.0, 2.0)]

Forma da cabeça e pontos de ancoragem fixados no espaço de dados #

Neste caso usamos patches.Arrow, ou patches.FancyArrow(o último está em laranja).

Observe que quando os limites do eixo são alterados, a forma e a localização da seta mudam.

FancyArrowA API do 's é relativamente desajeitada e requer, em particular, passagem length_includes_head=Truepara que a ponta da seta fique longe do início da seta. Ele só está incluído nesta referência porque é a classe de seta retornada por (em verde).(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))
guia de seta
[(0.0, 2.0), (0.0, 2.0)]

Tempo total de execução do script: ( 0 minutos 1,191 segundos)

Galeria gerada por Sphinx-Gallery