Animar setas em matplotlib

Sep 16 2020

Eu animei uma linha em matploltib, a saída do código fica assim:

Mas o que eu quero é, em vez desta linha, o código deve representar uma seta (ou seja, uma ponta de seta no final da linha), aqui está o trecho de código:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots(figsize=(12, 8))
ax.set(xlim=(0, 104), ylim=(0, 68))

x_start, y_start = (50, 35)
x_end, y_end = (90, 45)

x = np.linspace(x_start, x_end, 50)
y = np.linspace(y_start, y_end, 50)

line, = ax.plot(x, y)

def animate(i):
    line.set_data(x[:i], y[:i])
    return line,


ani = animation.FuncAnimation(
    fig, animate, interval=20, blit=True, save_count=50)


plt.show()

O que devo adicionar / alterar no código para que possa obter uma seta em vez da linha na saída?

Respostas

3 Konqui Sep 16 2020 at 08:10

Responda

Você pode usar ax.arrowpara traçar a seta.
Observe que você deve limpar o gráfico ax.cla()e ajustar os limites dos eixos ax.set()a cada iteração.

Código

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots(figsize=(12, 8))
ax.set(xlim=(0, 104), ylim=(0, 68))

x_start, y_start = (50, 35)
x_end, y_end = (90, 45)

N = 50
x = np.linspace(x_start, x_end, N)
y = np.linspace(y_start, y_end, N)

def animate(i):
    ax.cla()
    ax.arrow(x_start, y_start,
             x[i] - x_start, y[i] - y_start,
             head_width = 2, head_length = 2, fc = 'black', ec = 'black')
    ax.set(xlim = (0, 104), ylim = (0, 68))

ani = animation.FuncAnimation(fig, animate, interval=20, frames=N, blit=False, save_count=50)

plt.show()

Animação

V.Hunon Sep 16 2020 at 06:41

Talvez dê uma olhada aqui

Você poderia simplesmente alterar a função de linha para função de seta. Mas observe que primeiro você precisa calcular o ponto final da seta, já que de acordo com os documentos, você só pode especificar o comprimento dx, dy. Ao usar Pitágoras, o ponto de partida seria x[0], y[0]e dx, dyé o ponto final traduzido.

Acho que você pode resolver isso agora sozinho.