Обновите фигуру, сделанную с imshow(), контуром() и колчаном()

Я хотел бы знать, можно ли обновить контур, сделанный с помощью contour(), векторного поля, сделанного с помощью quiver(), и изображения, выполненного с помощью imshow(), без необходимости снова вызвать эти функции или создать новую фигуру, оси и т.д. Другими словами, возможно ли это (и обычно это то, что делают люди) обновлять эти элементы фигуры без повторного вызова подпрограмм.

Я пробовал решения на основе set_array() и pyplot.draw(), но я не могу заставить его работать для построения векторного поля и контура.

Ответ 1

Ну, вы можете сделать это для 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().