Анимировать вертикальную линию с помощью разброса и круга — matplotlib

#python #matplotlib #animation

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

Вопрос:

Я пытаюсь анимировать вертикальную линию вместе с разбросом и кругом. Я могу заставить работать scatter и circle, но не вертикальную линию. Если возможно, я бы также хотел, чтобы вертикальная линия не отображалась за пределами радиуса круга. Я могу следить за этим, хотя.

Я закомментирую функцию animate в отношении строки, чтобы она выполнялась. Но при применении анимированной линии это не работает.

 import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation

fig, ax = plt.subplots(figsize = (8,8))
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.grid(False)

df = pd.DataFrame({   
    'Time' : [1,1,1,1,2,2,2,2,3,3,3,3],             
    'X2' : [0,0,0,0,-1,-1,-1,-1,0,0,0,0],
    'Y2' : [0,0,0,0,1,1,1,1,1,1,1,1],                    
    })

moving_x = np.array(df.groupby(['Time'])['X2'].apply(list))
moving_y = np.array(df.groupby(['Time'])['Y2'].apply(list))

# scatter moving
moving_point = ax.scatter(moving_x[0], moving_y[0], c = 'black', marker = 'x')

# Array of immediate congestion radius coordinates
radius = df.drop_duplicates(subset = ['Time','X2', 'Y2'])[['X2', 'Y2']].values

# Plot immediate congestion radius
circle = plt.Circle(radius[0], 10, color = 'black', fill = False)

# Add radius to plot
ax.add_patch(circle)

t = df.drop_duplicates(subset = ['Time','X2'])[['X2']].values

line1 = ax.axvline(t[0], ls = '--', color = 'black', lw = 1, zorder = 10)

def animate(i) :

    circle.center = (radius[i,0], radius[i,1])

    # Animate vertical line
    #line1.set_data([i, i],[0,t])
    
    moving_point.set_offsets(np.c_[moving_x[0 i], moving_y[0 i]])


ani = animation.FuncAnimation(fig, animate,  np.arange(0,2), blit = False)
  

Ответ №1:

Вы хотите установить blit=True так, чтобы вам не приходилось перерисовывать объекты, поскольку оси не изменились. Я также избегал использования axvline , как показано ниже:

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

 import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation

fig, ax = plt.subplots(figsize = (8,8))
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.grid(False)

df = pd.DataFrame({   
    'Time' : [1,1,1,1,2,2,2,2,3,3,3,3],             
    'X2' : [0,0,0,0,-1,-1,-1,-1,0,0,0,0],
    'Y2' : [0,0,0,0,1,1,1,1,1,1,1,1],                    
    })

moving_x = np.array(df.groupby(['Time'])['X2'].apply(list))
moving_y = np.array(df.groupby(['Time'])['Y2'].apply(list))

# scatter moving
moving_point = ax.scatter(moving_x[0], moving_y[0], c = 'black', marker = 'x')

# Array of immediate congestion radius coordinates
radius = df.drop_duplicates(subset = ['Time','X2', 'Y2'])[['X2', 'Y2']].values

# Plot immediate congestion radius
circle = plt.Circle(radius[0], 10, color = 'black', fill = False)

# Add radius to plot
ax.add_patch(circle)

t = df.drop_duplicates(subset = ['Time','X2'])[['X2']].values

#line1 = ax.axvline(t[0], ls = '--', color = 'black', lw = 1, zorder = 10)
line1, = ax.plot([], [], ls='--', color='black',lw=1, zorder=10,animated=True)
def animate(i) :
    circle.center = (radius[i,0], radius[i,1])

    # Animate vertical line
    line1.set_data([radius[i,0], radius[i,0]],[radius[i,1]-10,radius[i,1] 10])
    
    moving_point.set_offsets(np.c_[moving_x[0 i], moving_y[0 i]])
    return circle, line1, moving_point

ani = animation.FuncAnimation(fig, animate,  np.arange(0,2), blit = True)
plt.show()
  

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

1. Спасибо. Я нахожусь на Mac, и это становится забавным с blit. Однако этот код работает. Просто удалена анимированная функция в линейном графике.