2017-04-27 31 views
1

我有一個腳本,應該在for循環的每次迭代中更新25個圖像的網格。該代碼基本上是這樣(我留出多餘的東西,以保持它的簡單):高效地更新幾個pyplots

from matplotlib import pyplot as plt 
plt.ion() 
fig, ax = plt.subplots(5,5,figsize=(3,3)) 

for i in range(100): 
    updateImages() 
    for j in range(5): 
     for k in range(5): 
       ax[j,k].imshow(image[j,k]) 
    plt.draw() 
    plt.pause(0.01) 

的問題是,它運行得非常,非常緩慢[不,它不是updateImages()是緩慢的。我相信有一個更有效的方法來做到這一點,但到目前爲止,我一直無法找到任何例子。建議將非常感謝!

+1

問題_might_可能是因爲在總是調用'imshow'而不是_replacing/updating_ them時,您只是_adding_數據指向圖表,因此在處理很多循環之後,您必須處理大量數據。您可以將'imshow'的第一個輸出存儲在像'ax'這樣的列表中,然後只更新數據:'list_of_images [j,k] = imshow(...)',然後在循環list_of_images [j,k] .set_data(圖像[J,K])'。 – Michael

+0

@邁克爾這似乎更像是一個答案,而不是評論。 – ImportanceOfBeingErnest

回答

2

程序爲何一段時間後,運行速度慢可能是你只添加數據點的情節時,總是調用imshow代替更換原因/更新他們。儘管你總是隻能看到最近繪製的點,但Python必須在很多循環之後處理大量數據,這就是爲什麼它變得緩慢。

取而代之,您可以將第一個輸出imshow存儲在列表中,並且只需更新的數據。首先,創建一個列表list_of_images與像ax相同的「形狀」,並存儲在第一次迭代出現的圖像:

list_of_images[j,k] = imshow(...) 

然後在遍歷迭代,只需更新數據:

list_of_images[j,k].set_data(image[j,k]) 

這樣,Python必須處理的數據量不會隨着迭代次數的增加而增加,並且程序應該穩定。


EDIT(由OP):基於這個答案,我試過如下:

from matplotlib import pyplot as plt 
plt.ion() 
fig, ax = plt.subplots(5,5,figsize=(3,3)) 
image_grid = ax.copy() # Maybe there is a less awkward way to do this 

for i in range(100): 
    updateImages() 
    for j in range(5): 
     for k in range(5): 
       image_grid[j,k].set_data(image[j,k]) 
    plt.draw() 
    plt.pause(0.01) 

它運行速度非常流暢(一樣快用單個圖像)。謝謝!

+0

這工作得很好!謝謝! –