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

2024-06-16 10:51:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: importfalsedftimeasnppltax
1条回答
网友
1楼 · 发布于 2024-06-16 10:51:20

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

enter image description here

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

相关问题 更多 >