Анимация точек рассеяния с помощью matplotlib

#python #matplotlib #animation

#python #matplotlib #Анимация

Вопрос:

Я создал скрипт, который анимирует линию и рассеивает точки, вот сценарий:

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

fig, ax = plt.subplots(figsize=(16,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, 20)
y = np.linspace(y_start, y_end, 20)

## the first scatter point
sc_1 = ax.scatter([], [], color="crimson", zorder=4, s=150, alpha=0.7, edgecolor="w")

## the line
line, = ax.plot([], [], color="black", zorder=4)

## the last scatter point
sc_2 = ax.scatter([], [], color="crimson", zorder=4, s=150, alpha=0.7, edgecolor="w")

## titles
title = ax.text(50, 65, "", bbox={'facecolor':'w', 'alpha':0.5, 'pad':5}, ha="center")

## scatter point which will follow the line
sc_3 = ax.scatter([], [], color="crimson", zorder=4, s=150, edgecolor="w")

def animate(i):
    if i == 1:
       sc_1.set_offsets([x_start, y_start])
       title.set_text("Action 001")

    if i == 2:
        plt.pause(0.5)
        title.set_text("Action 002")

    ## plot line
    line.set_data(x[:i], y[:i])

    ## plot scatter point that will follow the line
    sc_3.set_offsets(np.c_[x[:i], y[:i]])
    
    ## plot scatter point
    if i > len(x):

        plt.pause(0.2)
        title.set_text("Action 003")
        sc_2.set_offsets([x_end, y_end])

    return sc_1, line, sc_2, title, sc_3

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

ani.save("a.gif", writer="imagemagick")

plt.show()
  

Он выдает следующий результат:

введите описание изображения здесь

Но я хочу, чтобы при анимации точки рассеяния с помощью sc_3 программы удалялась последняя итерация точки рассеяния, созданная sc_3 , т. Е. Точка рассеяния не должна наноситься по всей строке, просто точка рассеяния, которая будет следовать за линией от начала до конца.

Конечный результат выглядит следующим образом: точка рассеяния в начале строки, а затем точка рассеяния будет следовать за линией (удаляя ее последнюю позицию состояния) и конечную точку рассеяния в конце строки

Что следует добавить в программу, чтобы получить желаемый результат?

Ответ №1:

Я немного отредактировал ваш код следующим образом:

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

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

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

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

## the first scatter point
sc_1 = ax.scatter([], [], color = "crimson", zorder = 4, s = 150, alpha = 0.7, edgecolor = "w")

## the line
line, = ax.plot([], [], color = "black", zorder = 4)

## the last scatter point
sc_2 = ax.scatter([], [], color = "crimson", zorder = 4, s = 150, alpha = 0.7, edgecolor = "w")

## titles
title = ax.text(50, 65, "", bbox = {'facecolor': 'w', 'alpha': 0.5, 'pad': 5}, ha = "center")

## scatter point which will follow the line
sc_3 = ax.scatter([], [], color = "crimson", zorder = 4, s = 150, edgecolor = "w")

def animate(i):

    if i == 1:
        sc_1.set_offsets([x_start, y_start])
        title.set_text("Action 001")

    if i == 2:
        plt.pause(0.5)
        title.set_text("Action 002")

    ## plot line and scatter point that will follow the line
    if i >= 2:
        line.set_data(x[:i   1], y[:i   1])
        sc_3.set_offsets([x[i], y[i]])

    # plot scatter point
    if i == N - 1:
        plt.pause(0.2)
        title.set_text("Action 003")
        sc_2.set_offsets([x_end, y_end])

    return sc_1, line, sc_2, title, sc_3,


ani = animation.FuncAnimation(fig = fig, func = animate, frames = N, interval = 50, blit = True, repeat = False)
ani.save("a.gif", writer = "imagemagick")

plt.show()
  

Анимация на выходе:

1

Ответ №2:

Я пробовал это:

     ## plot scatter point that will follow the line
    sc_3.set_offsets(np.c_[x[i], y[i]])
  

Конечным результатом является то, что он сохраняет одну красную точку, но анимирует одну точку, движущуюся вместе с линией.

Редактировать: первая красная точка задается sc_1, которую, я полагаю, вы хотите сохранить.

Комментарии:

1. Только с помощью этого редактирования вы получите эту анимацию (один кадр): символ разброса отсоединяется от движущейся линии