互動式圖表#

在探索繪圖時,互動性非常寶貴。Matplotlib GUI 視窗內建的平移/縮放和滑鼠位置工具通常就足夠了,但您也可以使用事件系統來建立自訂的資料探索工具。

另請參閱

圖表簡介.

Matplotlib 附帶與多個 GUI 工具組(Qt、Tk、Wx、GTK、macOS、JavaScript)綁定的後端,並且第三方套件提供與 kivyJupyter Lab 的綁定。為了使圖表能夠回應滑鼠、鍵盤和繪圖事件,GUI 事件迴圈需要與互動式提示整合。我們建議使用 IPython(請參閱下方)。

pyplot 模組提供函數,用於明確建立包含互動式工具、工具列、工具提示和按鍵綁定的圖表

pyplot.figure

建立新的空白Figure或選擇現有的圖表

pyplot.subplots

建立新的Figure,並用Axes的網格填滿它

pyplot.gcf

取得目前的Figure。如果 pyplot 圖表堆疊上目前沒有圖表,則會建立新的圖表

pyplot.gca

取得目前的Axes。如果圖表上目前沒有 Axes,則會建立一個新的

pyplot中的幾乎所有函數都會適當地通過目前的Figure / Axes(或建立一個)傳遞。

Matplotlib 會保留透過pyplot.figurepyplot.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()

在最新版本的 MatplotlibIPython 中,導入matplotlib.pyplot 並呼叫 pyplot.ion 就足夠了。在所有版本的 Matplotlib 和 IPython 中,保證使用 % 魔術命令都有效。

互動模式#

pyplot.ion

啟用互動模式。

pyplot.ioff

停用互動模式。

pyplot.isinteractive

傳回是否在每個繪圖命令後更新繪圖。

pyplot.show

顯示所有開啟的圖表。

pyplot.pause

執行 GUI 事件迴圈 interval 秒。

互動模式控制

  • 是否自動顯示建立的圖表

  • 對藝術家的變更是否自動觸發重新繪製現有的圖表

  • 如果沒有給定引數,pyplot.show() 何時傳回:立即,或在所有圖表都已關閉之後

如果在互動模式中

  • 新建立的圖表會立即顯示

  • 當元素變更時,圖表會自動重新繪製

  • pyplot.show() 顯示圖表並立即傳回

如果不在互動模式中

如果您處於非互動模式(或在非互動模式下建立圖表),您可能需要明確呼叫 pyplot.show 以在螢幕上顯示視窗。如果您只想在固定的時間內執行 GUI 事件迴圈,您可以使用 pyplot.pause。這將會像您呼叫 time.sleep 一樣,阻擋您的程式碼進度,確保顯示目前的視窗並在需要時重新繪製,並在指定的時間段內執行 GUI 事件迴圈。

GUI 事件迴圈與您的命令提示字元整合,以及圖表處於互動模式,這兩者是彼此獨立的。如果您在沒有安排事件迴圈整合的情況下嘗試使用 pyplot.ion,您的圖表將會出現,但在提示字元等待輸入時將不會是互動式的。您將無法平移/縮放,且圖表甚至可能不會渲染(視窗可能會顯示黑色、透明或作為其下方桌面快照)。相反地,如果您設定事件迴圈整合,則在提示字元等待輸入時,顯示的圖表將會回應,而與 pyplot 的「互動模式」無關。

無論互動模式設定和事件迴圈整合的組合如何,如果您使用 pyplot.show(block=True)pyplot.pause,或以其他方式執行 GUI 主迴圈,圖表都會有回應。

警告

使用 Figure.show,可以在不啟動事件迴圈且不處於互動模式的情況下,於螢幕上顯示圖表。這可能會有效(取決於 GUI 工具組),但很可能會導致圖表沒有回應。

預設使用者介面#

pyplot 建立的視窗會有一個互動式工具列,其中包含導覽按鈕和游標所指資料值的讀數。

互動式導覽#

../../../_images/toolbar.png

所有圖表視窗都帶有導覽工具列,可用於瀏覽資料集。

../../../_images/home_large.png ../../../_images/back_large.png ../../../_images/forward_large.png
首頁向前向後 按鈕

這些按鈕類似於網頁瀏覽器的首頁、向前和向後控制項。向前向後 用於在先前定義的視圖之間來回導覽。除非您已經使用平移和縮放按鈕導覽到其他位置,否則它們沒有意義。這類似於在造訪新頁面之前嘗試按一下網頁瀏覽器上的 向後,或在您回到某個頁面之前嘗試按一下 向前 - 不會有任何反應。首頁 會將您帶到資料的初始預設視圖。

../../../_images/move_large.png
平移/縮放 按鈕

此按鈕有兩種模式:平移和縮放。按一下 平移/縮放 按鈕以啟動平移和縮放,然後將滑鼠指標放在軸上的某個位置。按住滑鼠左鍵,將圖表拖曳到新位置即可平移。當您放開滑鼠時,您按下滑鼠時該點下的資料將會移動到您放開滑鼠的點。如果在平移時按下 'x' 或 'y',則移動將會分別限制在 x 或 y 軸上。按下滑鼠右鍵以進行縮放,將滑鼠拖曳到新位置。x 軸會與向右的移動成比例放大,並與向左的移動成比例縮小。y 軸和向上/向下移動也是如此(向上放大,向下縮小)。當您開始縮放時,滑鼠下方的點會保持靜止,讓您可以隨意放大或縮小該點周圍。您可以使用修飾鍵 'x'、'y' 或 'CONTROL' 分別將縮放限制在 x 軸、y 軸或保持長寬比。

對於極座標圖,平移和縮放功能的行為有所不同。可以使用滑鼠左鍵拖曳半徑軸標籤。可以使用滑鼠右鍵放大和縮小半徑刻度。

../../../_images/zoom_to_rect_large.png
縮放至矩形 按鈕

將滑鼠指標放在軸上的某個位置,然後按下滑鼠按鈕。在按住按鈕的同時拖曳滑鼠到新位置,以定義矩形區域。當使用滑鼠左鍵時,軸的視圖限制將會縮放到定義的區域。當使用滑鼠右鍵時,軸的視圖限制將會縮小,將原始軸放置在定義的區域中。

../../../_images/subplots_large.png
子圖設定 按鈕

使用此按鈕來設定子圖的外觀。您可以拉伸或壓縮子圖的左側、右側、頂部或底部,或是列之間的空間或欄之間的空間。

../../../_images/filesave_large.png
儲存 按鈕

按一下此按鈕以啟動檔案儲存對話方塊。您可以儲存具有以下副檔名的檔案:pngpsepssvgpdf

其他 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 的整合,請查閱其文件以取得設定詳細資訊。