2016-02-16 138 views
1

我有兩種方法:顯示圖像的generate_window()和顯示圖像的窗口上點擊的on_click()。他們是這樣的:Pyplot:刷新imshow()窗口

def generate_panel(img): 
    plt.figure() 
    ax = plt.gca() 
    fig = plt.gcf() 
    implot = ax.imshow(img) 
    # When a colour is clicked on the image an event occurs 
    cid = fig.canvas.mpl_connect('button_press_event', onclick) 
    plt.show() 

def onclick(event): 
    if event.xdata != None and event.ydata != None: 
    # Change the contents of the plt window here 

在我希望能夠改變在PLT窗口中顯示的圖像的代碼的最後一行,但我似乎無法得到它的工作。我在不同的地方嘗試過set_data()和draw(),但那沒有奏效。有什麼建議麼?提前致謝。

回答

1

您還可以使用plt.ion() 啓用交互模式,然後在您的修改應該工作後調用plt.draw()

注意:使用交互模式時,您必須在plt.show()上指定參數block=True以防止它立即關閉窗口。

你的榜樣的這個修改後的版本應該上繪製每次鼠標點擊一個圓圈:

from matplotlib import pyplot as plt 
import matplotlib.image as mpimg 
import numpy as np 


def generate_panel(img): 
    plt.figure() 
    ax = plt.gca() 
    fig = plt.gcf() 
    implot = ax.imshow(img) 
    # When a colour is clicked on the image an event occurs 
    cid = fig.canvas.mpl_connect('button_press_event', onclick) 
    plt.show(block=True) 


def onclick(event): 
    if event.xdata is not None and event.ydata is not None: 
     circle = plt.Circle((event.xdata, 
          event.ydata), 2, color='r') 
     fig = plt.gcf() 
     fig.gca().add_artist(circle) 
     plt.draw() 
     # Change the contents of the plt window here 


if __name__ == "__main__": 
    plt.ion() 
    img = np.ones((600, 800, 3)) 
    generate_panel(img) 
+0

你將如何實現這個的,即要在某個方法被調用來更新特定插曲matplotlib次要情節? – user3396592

+1

我不完全確定這一點,也許它取決於您使用的後端。 我相信matplotlib每次調用'draw()'函數時都會渲染整個畫布。 您可以將不同的座標軸/繪圖放在不同的圖形/腔體中,並用'fig_n.canvas.draw()'選擇性地更新它們。 另一種方法是將所有子圖放在同一個畫布/圖中並選擇性地更新其數據,但始終顯示整個畫布(所有子圖)。 – tmms