圖表簡介#
fig = plt.figure(figsize=(2, 2), facecolor='lightskyblue',
layout='constrained')
fig.suptitle('Figure')
ax = fig.add_subplot()
ax.set_title('Axes', loc='left', fontstyle='oblique', fontsize='medium')

在查看 Matplotlib 可視化時,您幾乎總是看到放置在 Figure
上的藝術家。在上面的範例中,圖表是藍色區域,而 add_subplot
已將 Axes
藝術家新增至 Figure
(請參閱 圖表的部分)。更複雜的可視化可以在圖表中新增多個軸、顏色條、圖例、註釋,而軸本身可以新增多個藝術家(例如,ax.plot
或 ax.imshow
)。
檢視圖表#
我們將在下面更詳細地討論如何建立圖表,但首先了解如何檢視圖表會很有幫助。這會因您使用 Matplotlib 的方式,以及您使用的後端而有所不同。
筆記本與 IDE#

使用預設 內嵌後端產生的圖表的 Jupyter Notebook 螢幕截圖。#
如果您使用筆記本(例如,Jupyter)或轉譯筆記本的 IDE(PyCharm、VSCode 等),則它們會有一個後端,會在執行程式碼儲存格時轉譯 Matplotlib 圖表。預設的 Jupyter 後端(%matplotlib inline
)會建立靜態圖形,預設情況下會修剪或展開圖形大小,以使新增至圖表的藝術家周圍有一個緊密的方塊(請參閱下面的 儲存圖表)。若要在 Jupyter 中使用互動式圖形,您需要使用 ipython「magic」,例如,%matplotlib widget
(適用於 jupyter lab
或 notebook>=7
中的 ipympl 後端)或 %matplotlib notebook
(適用於 notebook<7
或 nbclassic
中的 Matplotlib 筆記本)。

使用 %matplotlib notebook
magic 產生的互動式圖表的 Jupyter Notebook 螢幕截圖。如果使用 JupyterLab,使用者也應該嘗試使用類似的 widget 後端。#
另請參閱
獨立腳本與互動式使用#
如果使用者在具有視窗系統的用戶端上,則可以使用許多 後端將圖表轉譯到螢幕,通常是使用 Python Qt、Tk 或 Wx 工具組,或是原生 MacOS 後端。這些通常是在使用者的 matplotlibrc 中選擇,或是藉由在工作階段或腳本的開頭呼叫,例如,matplotlib.use('QtAgg')
來選擇。

透過 python 腳本產生並使用 QtAgg 後端顯示的圖表的螢幕截圖。#
從腳本執行時,或以互動方式執行時(例如,從 IPython shell 執行),在我們呼叫 plt.show()
之前,不會顯示圖表。圖表會出現在新的 GUI 視窗中,並且通常會有一個工具列,其中包含縮放、平移和其他用於與圖表互動的工具。依預設,plt.show()
會封鎖腳本或 shell 的進一步互動,直到圖表視窗關閉為止,但可以在某些情況下將其關閉。如需更多詳細資訊,請參閱 互動模式。
請注意,如果您在無法存取視窗系統的用戶端上,則圖表會退回使用「Agg」後端繪製,並且無法檢視,但可以儲存。
另請參閱
建立圖表#
到目前為止,最常見的建立圖表方式是使用 pyplot 介面。如 Matplotlib 應用程式介面 (API) 中所述,pyplot 介面有兩個用途。其中一個是啟動後端並追蹤 GUI 視窗。另一個則是軸與藝術家的全域狀態,允許使用簡短的 API 進行繪圖方法。在上面的範例中,我們將 pyplot 用於第一個用途,並建立圖表物件 fig
。作為副作用,fig
也會新增至 pyplot 的全域狀態,並且可以透過 gcf
存取。
使用者在建立 Figure 時,通常會需要一個 Axes 或是一個 Axes 的網格,因此除了 figure
之外,還有一些便利的方法可以同時回傳 Figure 和一些 Axes。一個簡單的 Axes 網格可以使用 pyplot.subplots
來實現(它只是簡單地包裝了 Figure.subplots
)。
fig, axs = plt.subplots(2, 2, figsize=(4, 3), layout='constrained')

更複雜的網格可以使用 pyplot.subplot_mosaic
來實現(它包裝了 Figure.subplot_mosaic
)。
fig, axs = plt.subplot_mosaic([['A', 'right'], ['B', 'right']],
figsize=(4, 3), layout='constrained')
for ax_name, ax in axs.items():
ax.text(0.5, 0.5, ax_name, ha='center', va='center')

有時候我們希望在一個 Figure 中有一個巢狀的佈局,其中有兩組或更多組 Axes 沒有共享相同的子圖網格。我們可以使用 add_subfigure
或 subfigures
來在父 Figure 內建立虛擬的 Figure;有關更多詳細資訊,請參閱 Figure 子圖。
fig = plt.figure(layout='constrained', facecolor='lightskyblue')
fig.suptitle('Figure')
figL, figR = fig.subfigures(1, 2)
figL.set_facecolor('thistle')
axL = figL.subplots(2, 1, sharex=True)
axL[1].set_xlabel('x [m]')
figL.suptitle('Left subfigure')
figR.set_facecolor('paleturquoise')
axR = figR.subplots(1, 2, sharey=True)
axR[0].set_title('Axes 1')
figR.suptitle('Right subfigure')

可以直接實例化一個 Figure
實例,而無需使用 pyplot 介面。如果您想建立自己的 GUI 應用程式或服務,而不想讓它攜帶 pyplot 全域狀態,這通常才是必要的。有關如何執行此操作的範例,請參閱 在圖形使用者介面中嵌入 Matplotlib 中的嵌入範例。
Figure 選項#
建立 Figure 時有一些選項可用。螢幕上的 Figure 大小由 figsize 和 dpi 設定。figsize 是 Figure 的 (寬度, 高度)
,以英寸為單位(如果喜歡,也可以使用 72 印刷點為單位)。dpi 是 Figure 的每英寸像素數。為了使您的 Figure 以您要求的實際大小顯示在螢幕上,您應將 dpi 設定為與您的圖形系統相同的 dpi。請注意,許多圖形系統現在使用「dpi 比率」來指定多少個螢幕像素用於表示一個圖形像素。Matplotlib 將 dpi 比率應用於傳遞給 Figure 的 dpi,使其具有更高的解析度,因此您應該將較小的數字傳遞給 Figure。
facecolor、edgecolor、linewidth 和 frameon 選項都以預期的方式更改 Figure 的外觀,如果將 frameon 設定為 False,則會使 Figure 透明。
最後,使用者可以使用 layout 參數為 Figure 指定佈局引擎。目前 Matplotlib 提供 「constrained」、「compressed」 和 「tight」 佈局引擎。這些會重新縮放 Figure 內的 Axes,以防止刻度標籤重疊,並嘗試對齊 Axes,並且可以為許多常見情況節省大量對 Figure 上的 Artists 進行手動調整的時間。
新增 Artists#
Figure
類別有多種方法可以將 Artists 新增至 Figure
或 SubFigure
。目前最常見的是新增各種配置的 Axes(add_axes
、add_subplot
、subplots
、subplot_mosaic
)和子圖(subfigures
)。Colorbars 會在 Figure 層級新增至 Axes 或 Axes 群組(colorbar
)。也可以有一個 Figure 層級的圖例(legend
)。其他 Artists 包括 Figure 範圍的標籤(suptitle
、supxlabel
、supylabel
)和文字(text
)。最後,可以使用 add_artist
直接新增低層級的 Artists,通常會謹慎地使用適當的轉換。通常這些包括 Figure.transFigure
,其範圍在每個方向上為 0 到 1,表示目前 Figure 大小的分數,或 Figure.dpi_scale_trans
,它將以英寸為單位,從 Figure 的左下角開始(有關更多詳細資訊,請參閱 轉換教學)。
儲存 Figure#
最後,可以使用 savefig
方法將 Figure 儲存到磁碟。 fig.savefig('MyFigure.png', dpi=200)
會將 PNG 格式的 Figure 以每英寸 200 點的解析度儲存到磁碟上目前目錄中的 MyFigure.png
檔案中。請注意,檔案名稱可以包含任何檔案系統位置的相對或絕對路徑。
支援許多類型的輸出,包括像 PNG、GIF、JPEG、TIFF 這樣的點陣圖格式,以及像 PDF、EPS 和 SVG 這樣的向量格式。
預設情況下,已儲存的 Figure 大小由 Figure 大小(以英寸為單位)設定,對於點陣圖格式,則由 dpi 設定。如果未設定 dpi,則會使用 Figure 的 dpi。請注意,如果 Figure 包含已 點陣化 的 Artists,則 dpi 對於像 PDF 這樣的向量格式仍然有意義;指定的 dpi 將是點陣化物件的解析度。
可以使用 bbox_inches 引數來變更 Figure 的大小以進行儲存。這可以手動指定,同樣以英寸為單位。但是,目前最常見的用法是 bbox_inches='tight'
。這個選項會「緊縮包裝」,根據需要修剪或擴展 Figure 的大小,使其緊密環繞 Figure 中的所有 Artists,並帶有一個可以由 pad_inches 指定的小邊距,預設值為 0.1 英寸。下面的圖表中的虛線框顯示如果將 bbox_inches='tight'
用於 savefig,則會儲存 Figure 的哪個部分。
