2017-04-14 230 views
2

有沒有辦法一次繪製一組圖形而不關閉前一個圖形,保持UI的控制,並在最後保持圖形打開?也許使用更合適的後端,或者使用OO風格而不是下面使用的pyplot/pylab風格來編寫它?一次繪製一個圖而不關閉舊圖(matplotlib)

例如我知道我可以做

plt.ioff() 
for i in range(10) 
    plt.figure() 
    arr = thisFunctionTakesTenSecondsToGenerateMyArray() 
    plt.plot(arr) 
    plt.show() 

將等待我在每次迭代

關閉數字我還可以做

plt.ion() 
for i in range(10) 
    plt.figure() 
    arr = thisFunctionTakesTenSecondsToGenerateMyArray() 
    plt.plot(arr) 

將盡可能快,因爲它可以生成它們繪製出來(例如10秒),但會阻擋我的整個用戶界面(例如,我甚至無法移動窗口),不會顯示軸(我只能看到數字窗口),並且會自動關閉所有數字的循環。

,我不是在尋找第三個選項是該

plt.ioff() 
for i in range(10) 
    plt.figure() 
    arr = thisFunctionTakesTenSecondsToGenerateMyArray() 
    plt.plot(arr) 
plt.show() 

其中涉及我的屏幕上看到任何東西之前等待100秒。

我在尋找類似Matlab的行爲,我可以做

for i = 1:10 
    figure() 
    arr = thisFunctionTakesTenSecondsToGenerateMyArray() 
    plot(arr) 
    drawnow 

這將得出一個數字,每10秒,也讓我走動例如窗戶如果圖3位於頂部,我想回到圖1,同時生成圖4。

編輯: 使用Python 2.7.13,Matplotlib 2.0.0。在Windows 7 SP1上使用Spyder 3.1.3運行它 - 我嘗試在內置的IPython控制檯,香草Python控制檯以及腳本中運行它,所有結果都相同。

理想情況下,我希望能夠通過腳本和交互方式(即通過執行腳本或通過複製並粘貼到控制檯)來運行它。

+0

你使用的是什麼版本的Python? – Astrom

+0

是否要從交互式Python會話或命令行運行代碼? –

+0

@Astrom Python 2.7.13,Matplotlib 2.0.0(更新了原來的問題) – dkv

回答

1

只需在plt.show(block=False)之後的循環內部添加plt.pause(0.0001),並在最後一個最後的plt.show()處,以防您從操作系統命令行執行腳本。

+0

這幾乎是我正在尋找的東西,但它仍然阻塞(或者可能只是凍結)UI,以便在執行'arr = thisFunctionTakesTenSecondsToGenerateMyArray()'的10秒內我無法做任何事情。例如如果我將第一個窗口移動10秒,它實際上會將第二個窗口放在新位置,並將第一個窗口保留在原來的位置。 此外,它只適用於運行整個腳本(即從命令行)而不是從Python控制檯運行。 – dkv

+0

好吧,現在我有點困惑。你想做動畫嗎,還是你需要繪製腳本來在腳本運行時以交互方式修改它們?如果沒有,那麼就讓腳本完成,你將分開所有的地塊進行調整。如果你只需要所有的繪圖,你可以保存每個圖形,因爲它們是生成的'plt.savefig()',然後你可以在圖像查看器中查看。 當程序運行你不能真正對其進行修改。如果您需要出於某種原因在同一個交互式會話檢查出來的'subprocess'模塊https://docs.python.org/2/library/subprocess.html操作 –

+0

我只想數字,只要他們彈出這樣我就不必等待所有人在我做任何事之前完成繪圖。例如,我可能會意識到的東西是由二號人物出現的時間腳麻可以殺死循環,這樣我就不必浪費時間等待其他8個數據來完成。你的建議讓我有些那裏的方式,但我也想四處移動圖形窗口的能力,而腳本運行。這是Matlab的如何表現出的即裝即用,以及他們可能做一些多進程魔法,你在這種情況下,建議 – dkv

相關問題