Animar flechas en matplotlib

Sep 16 2020

Animé una línea en matploltib, la salida del código se ve así:

Pero lo que quiero es que en lugar de esta línea, el código debería trazar una flecha (es decir, una punta de flecha al final de la línea), aquí está el fragmento 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()

¿Qué debo agregar / cambiar en el código para que pueda obtener una flecha en lugar de la línea en la salida?

Respuestas

3 Konqui Sep 16 2020 at 08:10

Responder

Puede utilizar ax.arrowpara trazar la flecha.
Tenga en cuenta que debe borrar el gráfico ax.cla()y ajustar los límites de los ejes ax.set()en cada iteración.

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

Animación

V.Hunon Sep 16 2020 at 06:41

Tal vez eche un vistazo aquí

Simplemente puede cambiar la función de línea a la función de flecha. Pero tenga en cuenta que primero deberá calcular el punto final de la flecha, ya que de acuerdo con los documentos, solo puede especificar la longitud dx, dy. Al usar Pitágoras, el punto de partida sería x[0], y[0]y dx, dyes el punto final traducido.

Creo que ahora puedes resolverlo por tu cuenta.