更新matplotlib动画的轮廓
我想找一种方法,可以在动画中更新我的轮廓线,而不需要每次都重新绘制整个图。
我找到的大多数回答都建议重新调用 ax.contour
,但是因为我的轮廓线是叠加在另一张图像上的,这样做会非常慢。
我找到的唯一一个看起来接近回答这个问题的回复,结果却是一个失效的链接:在matplotlib中使用FuncAnimation动画化轮廓图
编辑:这个可能是正确的链接。
示例代码:
#!/usr/bin/env python
import matplotlib.pylab as plt
import matplotlib.animation as anim
from matplotlib.colors import LinearSegmentedColormap as lsc
import numpy
#fig = 0; ax = 0; im = 0; co = 0
image_data = numpy.random.random((100,50,50))
contour_data = numpy.random.random((100,50,50))
def init():
global fig, ax, im, co
fig = plt.figure()
ax = plt.axes()
im = ax.imshow(image_data[0,:,:])
co = ax.contour(contour_data[0,:,:])
def func(n):
im.set_data(image_data[n,:,:])
co.set_array(contour_data[n,:,:])
init()
ani = anim.FuncAnimation(fig, func, frames=100)
plt.show()
谢谢。
1 个回答
2
也许你现在已经明白了;不幸的是,看来你必须在每个时间点重新声明整个轮廓图(contour)和填充轮廓图(contourf)的所有元素,并且要删除旧的实例。这里有一些从这个链接复制过来的信息:
set_array()这个方法(我想)只会影响填充轮廓图的颜色映射信息,而且即使这样也似乎没有更新。你需要做的是创建一个新的轮廓图,并删除旧的,特别是当你需要更改底层的轮廓数据时。这应该和C.remove()一样简单,但出于某种原因,这个方法并不存在(我会在一会儿加上它)。所以你需要做的是:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2 * np.pi, 0.1)
X,Y = np.meshgrid(x,x)
f1 = np.sin(X) + np.sin(Y)
f2 = np.cos(X) + np.cos(Y)
plt.figure()
C = plt.contourf(f1)
plt.show()
for coll in C.collections:
plt.gca().collections.remove(coll)
C = plt.contourf(f2)
plt.draw()