下面以matplotlib gallery为例,我想绘制一条离散的Lévy路径(应扩展为2D或3D设置)。因此,我从一个简单的(时间,布朗路径)图开始,希望通过“粘合”不同的路径来模拟跳跃。这是一个最小的工作示例:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
np.random.seed(19680801)
def generateRandomLines(dt, T, N):
t = np.linspace(0,T,N)
dX = np.sqrt(dt) * np.random.randn(1, N)
X = np.cumsum(dX, axis=1)
lineData = np.vstack((t,X))
return lineData
# Returns Line2D objects
def updateLines(num, dataLines, lines):
for u, v in zip(lines, dataLines):
u.set_data(v[:2, :num])
return lines
N = 500 # Number of points
T = .5
dt = T/(N-1)
fig, ax = plt.subplots()
data = [
[generateRandomLines(dt, T, N),'violet'],
[.5+generateRandomLines(dt, T, N),'violet'],
[1+generateRandomLines(dt, T, N),'violet'],
[1.5+generateRandomLines(dt, T, N),'violet'],
]
ax = plt.axes(xlim=(-.5, 2.5), ylim=(-2.5, 2.5))
ax.set_xlabel('t')
ax.set_ylabel('B(t)')
ax.set_title('2D Brownian Paths')
## Create a list of line2D objects
dataLines = [dat[0] for dat in data]
lines = [ax.plot(dat[0][0, 0:1], dat[0][1, 0:1], color=dat[1])[0] for dat in data]
## Create the animation object
anim = animation.FuncAnimation(fig, updateLines, N+1, fargs=(dataLines, lines),
interval=20, repeat=False, blit=False)
plt.tight_layout()
plt.show()
目前,在data
中生成的四个路径是同时绘制/动画化的。但我希望动画对象在同一图中一个接一个地显示。
显然,我不太了解如何处理函数中的lines和dataLines对象
def updateLines(num, dataLines, lines):
for u, v in zip(lines, dataLines):
u.set_data(v[:2, :num])
return lines
类似于question ("Consecutive matplotlib animation in same figure"),我尝试遍历lines
对象,该对象会产生zip错误(“参数1必须支持迭代”)。
谢谢。
答案 0 :(得分:0)
通过以下方式重新定义updateLines
解决了我的问题
# Returns Line2D objects
def updateLines(num, dataLines, lines):
if num < N:
lines[0].set_data(dataLines[0][:2, :num])
elif num < N * 2:
lines[1].set_data(dataLines[1][:2, :num-N])
elif num < N * 3:
lines[2].set_data(dataLines[2][:2, :num-2*N])
else:
lines[3].set_data(dataLines[3][:2, :num-3*N])
return lines
并将点数适当增加到N * 4 + 1
## Create the animation object
anim = animation.FuncAnimation(fig, updateLines, N * 4 + 1, fargs=(dataLines, lines),
interval=20, repeat=False, blit=False)