Python 使用“散布”和“圆”设置垂直线动画-matplotlib

Python 使用“散布”和“圆”设置垂直线动画-matplotlib,python,matplotlib,animation,Python,Matplotlib,Animation,我正在尝试设置一条垂直线和一个散点和圆的动画。我可以让散点和圆工作,但垂直线不行。如果可能的话,我也希望垂直线不在圆的半径之外绘制。不过,我可以继续跟进 我将注释掉animate中与该行相关的函数,使其运行。但是当应用动画线条时,它不起作用 import pandas as pd import matplotlib.pyplot as plt import numpy as np from matplotlib import animation fig, ax = plt.subplots(f

我正在尝试设置一条垂直线和一个散点和圆的动画。我可以让散点和圆工作,但垂直线不行。如果可能的话,我也希望垂直线不在圆的半径之外绘制。不过,我可以继续跟进

我将注释掉
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)

您需要设置
blit=True
,这样就不必重新绘制东西,因为轴没有改变。我还避免使用
axvline
,如下所示:


谢谢我在Mac电脑上,用blit很有趣。但这段代码仍然有效。刚刚删除了线条图中的动画功能。
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()