Анимировать стрелки в matplotlib

Sep 16 2020

Я анимировал строку в matploltib, вывод кода выглядит так:

Но я хочу, чтобы вместо этой строки код должен был нарисовать стрелку (т.е. стрелку в конце строки), вот фрагмент кода:

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()

Что мне нужно добавить / изменить в коде, чтобы в выводе появилась стрелка вместо строки?

Ответы

3 Konqui Sep 16 2020 at 08:10

Ответ

Вы можете использовать ax.arrowдля построения стрелки.
Обратите внимание, что вы должны очищать график ax.cla()и настраивать пределы осей ax.set()на каждой итерации.

Код

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()

Анимация

V.Hunon Sep 16 2020 at 06:41

Может посмотреть здесь

Вы можете просто изменить функцию линии на функцию стрелки. Но обратите внимание, что сначала вам нужно будет вычислить конечную точку стрелки, поскольку в соответствии с документами вы можете указать только длину dx, dy. Используя Пифагор, начальная точка будет x[0], y[0]и dx, dyэто переводится конечная точка.

Думаю, теперь вы можете решить это самостоятельно.