更新matplotlib动画的轮廓

6 投票
1 回答
5667 浏览
提问于 2025-04-18 03:57

我想找一种方法,可以在动画中更新我的轮廓线,而不需要每次都重新绘制整个图。

我找到的大多数回答都建议重新调用 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() 

这个答案可能正是你需要的。

撰写回答