#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. Однако этот код работает. Просто удалена анимированная функция в линейном графике.