2016-01-29 218 views
5

我試圖創建生動的情節,其更新爲可用的數據交互。現場matplotlib陰謀

import os,sys 
import matplotlib.pyplot as plt 

import time 
import random 

def live_plot(): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 

    ax.set_xlabel('Time (s)') 
    ax.set_ylabel('Utilization (%)') 
    ax.set_ylim([0, 100]) 
    ax.set_xlim(left=0.0) 

    plt.ion() 
    plt.show() 

    start_time = time.time() 
    traces = [0] 
    timestamps = [0.0] 
    # To infinity and beyond 
    while True: 
     # Because we want to draw a line, we need to give it at least two points 
     # so, we pick the last point from the previous lists and append the 
     # new point to it. This should allow us to create a continuous line. 
     traces = [traces[-1]] + [random.randint(0, 100)] 
     timestamps = [timestamps[-1]] + [time.time() - start_time] 
     ax.set_xlim(right=timestamps[-1]) 
     ax.plot(timestamps, traces, 'b-') 
     plt.draw() 
     time.sleep(0.3) 

def main(argv): 
    live_plot() 

if __name__ == '__main__': 
    main(sys.argv) 

上述代碼有效。然而,我無法與plt.show()

產生窗口交互我如何可以繪製實時的數據,同時還能夠與繪圖窗口進行交互?

回答

1

使用plt.pause()代替time.sleep()

後者簡單地保持主線程的執行和GUI事件循環不運行。相反,plt.pause運行事件循環,並允許您與人物進行交互。

documentation

暫停區間秒。

如果有活動數字將被更新和顯示,並且GUI事件循環將在暫停期間運行。

如果沒有活動數字,或者如果非交互式後端處於 使用中,則執行time.sleep(interval)。

事件循環,使您可以用圖形交互僅在中止期間運行。在計算過程中,您將無法與數字交互。如果計算需要很長的時間(比如0.5秒或更多)的相互作用會覺得「laggy」。在這種情況下,讓計算在專用的工作線程或進程中運行可能是有意義的。

+0

我很困惑..如果循環僅在'plt.pause()'期間運行,那麼我不必指定一個大的暫停時間段來確保它可以接收和處理所有的命令鼠標拖動 - 拉伸/縮放/等)?你能修改我的例子來描述你的意思嗎? –

+0

讓你的例子就像現在一樣,用'plt.pause(0.3)'替換'time.sleep(0.3)'。你不需要很長的停頓時間,因爲你有一個短暫的停頓時間,無休止地繼續。如果你的代碼在暫停命令之間花費的時間很少,那麼一切都應該平穩運行。 – kazemakase