10

我想知道是否可以更新用 完成的轮廓、用 完成contour()的矢量场quiver()和用 完成的图像imshow(),而实际上不必再次调用这些函数或创建新的图形、轴等。换句话说,是可能(并且通常人们会这样做)更新图形的这些元素而无需重新调用例程。

我已经尝试过基于但我无法使其适用于矢量场和等高线图的set_array()解决方案。pyplot.draw()

4

1 回答 1

6

好吧,你可以imshow通过调用.set_data()图像来做到这一点,然后fig.canvas.draw()在图上。与仅调用相比,我没有看到任何真正的性能优势- 在下面的基准测试中(用作后端)draw(),两者都给了我大约 25FPS 。WXAgg

import numpy as np
import matplotlib.pyplot as pp
import time

def animate_data(data):

    fig,ax = pp.subplots(1,1)

    # I'm not convinced that animated=True does anything either...
    image = ax.imshow(data[0,:,:],animated=True)

    # pp.draw()
    fig.canvas.draw()

    start = time.time()
    tic = start
    for ii in xrange(1,data.shape[0]):
        if not(ii % 10):
            toc = time.time()
            print "FPS =\t%.6G" %(10./(toc-tic))
            tic = time.time()
        image.set_data(data[ii,:,:])

        # pp.draw()
        fig.canvas.draw()

    print "Average FPS =\t%.6G" %(data.shape[0]/(time.time()-start))

fakedata = np.random.randn(200,512,512)
animate_data(fakedata)

在 的情况下quiver,您可以使用.set_UVC()更新绘图:

fig,ax = subplots(1,1)

u1 = np.random.rand(10,10)
v1 = np.random.rand(10,10)
c1 = np.random.rand(10,10)

q = ax.quiver(u1,v1,c1)
fig.canvas.draw()

u2 = np.random.rand(10,10)
v2 = np.random.rand(10,10)
c2 = np.random.rand(10,10)

q.set_UVC(u2,v2,c2)
fig.canvas.draw()

据我所知,您不能contour以相同的方式更新绘图。我不确定无论如何都会获得这么多,因为任何解决方案仍然需要重新计算给定数组输入的轮廓线应该去哪里。如果我是你,我只会打电话ax.contour()fig.canvas.draw()

于 2012-09-03T20:52:05.500 回答