互動式圖表#
在探索繪圖時,互動性非常寶貴。Matplotlib GUI 視窗內建的平移/縮放和滑鼠位置工具通常就足夠了,但您也可以使用事件系統來建立自訂的資料探索工具。
另請參閱
圖表簡介.
Matplotlib 附帶與多個 GUI 工具組(Qt、Tk、Wx、GTK、macOS、JavaScript)綁定的後端,並且第三方套件提供與 kivy 和 Jupyter Lab 的綁定。為了使圖表能夠回應滑鼠、鍵盤和繪圖事件,GUI 事件迴圈需要與互動式提示整合。我們建議使用 IPython(請參閱下方)。
pyplot
模組提供函數,用於明確建立包含互動式工具、工具列、工具提示和按鍵綁定的圖表
pyplot.figure
建立新的空白
Figure
或選擇現有的圖表pyplot.subplots
pyplot.gcf
取得目前的
Figure
。如果 pyplot 圖表堆疊上目前沒有圖表,則會建立新的圖表pyplot.gca
取得目前的
Axes
。如果圖表上目前沒有 Axes,則會建立一個新的
pyplot
中的幾乎所有函數都會適當地通過目前的Figure
/ Axes
(或建立一個)傳遞。
Matplotlib 會保留透過pyplot.figure
或 pyplot.subplots
建立的所有開啟圖表的參考,以確保圖表不會被垃圾回收。Figure
可以透過pyplot.close
單獨關閉並取消從pyplot
註冊;所有開啟的Figure
可以透過plt.close('all')
關閉。
另請參閱
有關 Matplotlib 事件系統和整合式事件迴圈的更多討論:- 互動式圖表與非同步程式設計- 事件處理與選取
IPython 整合#
我們建議使用 IPython 作為互動式 shell。除了它的所有功能(改進的 Tab 補全、魔術命令、多行編輯等)之外,它還可以確保 GUI 工具組事件迴圈與命令列正確整合(請參閱命令提示字元整合)。
在此範例中,我們透過 IPython 提示建立和修改圖表。該圖表會顯示在 QtAgg GUI 視窗中。若要設定整合並啟用互動模式,請使用 %matplotlib
魔術命令
In [1]: %matplotlib
Using matplotlib backend: QtAgg
In [2]: import matplotlib.pyplot as plt
建立新的圖表視窗
In [3]: fig, ax = plt.subplots()
將資料的折線圖新增至視窗
In [4]: ln, = ax.plot(range(5))
將線條的顏色從藍色變更為橘色
In [5]: ln.set_color('orange')
如果您想要停用繪圖的自動重繪
In [6]: plt.ioff()
如果您想要重新啟用繪圖的自動重繪
In [7]: plt.ion()
在最新版本的 Matplotlib
和 IPython
中,導入matplotlib.pyplot
並呼叫 pyplot.ion
就足夠了。在所有版本的 Matplotlib 和 IPython 中,保證使用 %
魔術命令都有效。
互動模式#
啟用互動模式。 |
|
停用互動模式。 |
|
傳回是否在每個繪圖命令後更新繪圖。 |
顯示所有開啟的圖表。 |
|
執行 GUI 事件迴圈 interval 秒。 |
互動模式控制
是否自動顯示建立的圖表
對藝術家的變更是否自動觸發重新繪製現有的圖表
如果沒有給定引數,
pyplot.show()
何時傳回:立即,或在所有圖表都已關閉之後
如果在互動模式中
新建立的圖表會立即顯示
當元素變更時,圖表會自動重新繪製
pyplot.show()
顯示圖表並立即傳回
如果不在互動模式中
新建立的圖表和對圖表的變更不會顯示,直到
pyplot.show()
會執行 GUI 事件迴圈,並在所有繪圖視窗關閉後才會返回。
如果您處於非互動模式(或在非互動模式下建立圖表),您可能需要明確呼叫 pyplot.show
以在螢幕上顯示視窗。如果您只想在固定的時間內執行 GUI 事件迴圈,您可以使用 pyplot.pause
。這將會像您呼叫 time.sleep
一樣,阻擋您的程式碼進度,確保顯示目前的視窗並在需要時重新繪製,並在指定的時間段內執行 GUI 事件迴圈。
GUI 事件迴圈與您的命令提示字元整合,以及圖表處於互動模式,這兩者是彼此獨立的。如果您在沒有安排事件迴圈整合的情況下嘗試使用 pyplot.ion
,您的圖表將會出現,但在提示字元等待輸入時將不會是互動式的。您將無法平移/縮放,且圖表甚至可能不會渲染(視窗可能會顯示黑色、透明或作為其下方桌面快照)。相反地,如果您設定事件迴圈整合,則在提示字元等待輸入時,顯示的圖表將會回應,而與 pyplot 的「互動模式」無關。
無論互動模式設定和事件迴圈整合的組合如何,如果您使用 pyplot.show(block=True)
、pyplot.pause
,或以其他方式執行 GUI 主迴圈,圖表都會有回應。
警告
使用 Figure.show
,可以在不啟動事件迴圈且不處於互動模式的情況下,於螢幕上顯示圖表。這可能會有效(取決於 GUI 工具組),但很可能會導致圖表沒有回應。
預設使用者介面#
由 pyplot
建立的視窗會有一個互動式工具列,其中包含導覽按鈕和游標所指資料值的讀數。
其他 Python 提示符號#
互動模式在預設的 Python 提示符號中運作
>>> import matplotlib.pyplot as plt
>>> plt.ion()
>>>
然而,這無法確保事件掛鉤已正確安裝,您的圖形可能無法回應。請查閱您的 GUI 工具組文件以取得詳細資訊。
Jupyter Notebooks / JupyterLab#
若要在「經典」筆記本或 Jupyter Lab 中取得互動式圖形,請使用 ipympl 後端 (必須單獨安裝),此後端使用 ipywidget 框架。如果已安裝 ipympl
,請使用以下魔法指令
%matplotlib widget
來選擇並啟用它。
如果您只需要使用經典筆記本 (例如 notebook<7
),您可以使用
%matplotlib notebook
它使用 Matplotlib 提供的 backend_nbagg
後端;然而,nbagg 無法在 Jupyter Lab 中運作。
注意
若要取得此處描述的互動功能,您必須使用互動式後端。筆記本中的預設後端 inline 後端並非互動式。backend_inline
會在執行儲存格時,轉譯圖形一次,並將靜態影像插入筆記本中。由於影像為靜態,因此無法平移/縮放、接收使用者輸入,或從其他儲存格更新。
GUI + Jupyter#
您也可以在 Jupyter Notebook 中使用非 ipympl
的 GUI 後端之一。如果您在本機執行 Jupyter 核心,GUI 視窗將會在您的桌面,與您的網頁瀏覽器相鄰的位置產生。如果您在遠端伺服器上執行您的筆記本,核心將會嘗試在遠端電腦上開啟 GUI 視窗。除非您已安排將 xserver 轉送到您的桌面,否則您將無法看到或與該視窗互動。這也可能會引發例外狀況。
PyCharm、Spyder 和 VSCode#
許多 IDE 都有內建與 Matplotlib 的整合,請查閱其文件以取得設定詳細資訊。