gpt4 book ai didi

animation - matplotlib FuncAnimation 清晰地绘制每个重复周期

转载 作者:行者123 更新时间:2023-12-04 12:14:27 24 4
gpt4 key购买 nike

下面的代码有效,但我认为每个重复周期都会过度绘制原始点。我希望它从原点开始,每个重复循环,有一个清晰的情节。在解决此问题的许多方法中,我尝试在 init 和 update 函数中插入 ax.clear();没有效果。我在代码中留下了我认为会重置 ln,艺术家的内容;同样,这不是我正在寻找的解决方案。我很感激在这个玩具示例中重新启动每个循环的正确方法是什么的一些指导,以便在应用于我更复杂的问题时,我不会招致累积处罚。如果传递数组,这在刷新方面效果很好......感谢您的帮助。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, writers
#from basic_units import radians
# # Set up formatting for the movie files
# Writer = writers['ffmpeg']
# writer = Writer(fps=20, metadata=dict(artist='Llew'), bitrate=1800)

#Polar stuff
fig = plt.figure(figsize=(10,8))
ax = plt.subplot(111,polar=True)
ax.set_title("A line plot on a polar axis", va='bottom')
ax.set_rticks([0.5, 1, 1.5, 2]) # fewer radial ticks
ax.set_facecolor(plt.cm.gray(.95))
ax.grid(True)
xT=plt.xticks()[0]
xL=['0',r'$\frac{\pi}{4}$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',\
r'$\pi$',r'$\frac{5\pi}{4}$',r'$\frac{3\pi}{2}$',r'$\frac{7\pi}{4}$']
plt.xticks(xT, xL)
r = []
theta = []
# Animation requirements.
ln, = plt.plot([], [], 'r:',
markersize=1.5,
alpha=1,
animated=True)

def init():
ax.set_xlim(0, 2)
ax.set_ylim(0, 2)
return ln,

def update(frame):
r.append(frame)
theta.append(5*np.pi*frame)
ln.set_data(theta, r)
return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0,2,400),
init_func=init, interval=10, blit=True,repeat=True)

plt.show()

我尝试使用这种有点粗糙的方法来重置列表(以及数组),这会删除列表,但没有重新启动循环。
def update(frame,r,theta):
r.append(frame)
theta.append(5*np.pi*frame)
if len(r)>=400:
r = [0]
theta=[0]
ln.set_data(theta, r)
return ln,

相比之下,这确实按预期工作......
for i in range(25):
r.append(i)
print('len(r)',len(r), r)
if len(r) >=10:
r = []
print('if r>=10:',r)
print('Post conditional clause r',len(r),r)

这导致我尝试以下操作,并注意到在 update() 外部传递内部 (r,theta) 需要将其声明为全局变量。使用以下代码,绘图现在重置每个循环而不是过度绘图。我的感觉是,这对于一个简单的程序来说还有很长的路要走——任何改进都值得感激地接受。
#This solution also works
def update(frame):
r.append(frame)
theta.append(5*np.pi*frame)
if len(r)>=400:
global r
r = []
global theta
theta=[]
ln.set_data(theta, r)
return ln,

最佳答案

如果我理解你的代码和你的问题,你想在动画的每一帧只显示一个点,对吗?

如果是这样,那么您的问题只是将每个新点附加到函数 update() 中的所有先前点之后。 .相反,只需更新数据坐标,如下所示:

def update(frame):
r = frame
theta = 2*np.pi*frame
ln.set_data(theta, r)
return ln,

enter image description here

编辑 让我们看看这次我是否做对了。

您可以选择只显示最后一个 N点像这样:
N=10
def update(frame):
r.append(frame)
theta.append(2*np.pi*frame)
ln.set_data(theta[-N:], r[-N:])
return ln,

enter image description here

或者您可以附加 N指向您的数组,然后重置为空数组。我想这可能是你想要做的。在这里,你必须小心。如果你只是做 r = []然后您更改哪个对象 r引用,这会破坏动画。您需要做的是使用语法 r[:] = [] 更改数组的内容。 .
def update(frame):
r_ = frame
theta_ = 2*np.pi*frame
if len(r)>N:
r[:] = [r_]
theta[:] = [theta_]
else:
r.append(r_)
theta.append(theta_)
ln.set_data(theta, r)
return ln,

enter image description here

关于animation - matplotlib FuncAnimation 清晰地绘制每个重复周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47192614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com