更新 Matplotlib 动画的轮廓线

6
我正在寻找一种在动画中更新轮廓线的方法,而不需要每次重新绘制图形。
大多数对于这个问题的回答都建议重新调用ax.contour,但是由于我的等高线叠加在另一幅图像上,这样做速度非常慢。
我发现的唯一看起来接近回答这个问题的回答是一个死链接:Animating a contour plot in matplotlib using 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
也许您现在已经明白了,但不幸的是,似乎您必须在每个时间步骤重新声明整个轮廓/轮廓填充艺术家集并删除旧实例。以下是从this link复制的一些信息:

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

这个答案可能是你正在寻找的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接