- 利用Python解決數學問題(原書第2版)
- (英)薩姆·莫利
- 1643字
- 2025-08-07 15:28:36
2.3 添加子圖
有時,將多個相關圖形并排放置在同一圖中但不在相同的軸域(axes)上,這是很有用的。子圖允許我們在同一個圖中生成由獨立圖形組成的圖網格。在本節中,我們將看到如何使用子圖在單個圖中并排創建兩個圖形。
2.3.1 準備工作
你需要準備繪制每個子圖的數據。作為示例,我們將在第一個子圖上繪制對函數f(x)=x2-1進行牛頓法(Newton's method)求解的前五次迭代結果,初始值為x0=2;而在第二個子圖上,我們將繪制迭代的誤差。首先,我們定義一個生成器函數以獲取迭代值:

這個例程會生成兩個列表。第一個列表包含對函數應用牛頓法求解的數值,第二個列表包含近似值的誤差:

2.3.2 實現方法
以下步驟將演示如何創建包含多個子圖的圖形:
1.我們使用subplots例程創建一個新圖形,并引用每個子圖中的所有Axes對象,這些子圖按一行兩列的網格排列。我們還將tight_layout關鍵字參數設置為True,以自動調整生成圖形的布局。這個參數設置并不是嚴格必要的,但在這種情況下它會產生比默認值更好的結果:

2.創建Figure和Axes對象之后,我們可以通過在每個Axes對象上調用相關的繪圖方法來填充圖形。對于第一個圖(顯示在左側),我們在ax1對象上使用plot方法,該方法的簽名與標準的plt.plot例程相同。然后,我們在ax1對象上調用set_title、set_xlabel和set_ylabel方法來分別設置標題以及x軸和y軸標簽。我們還通過提供usetex關鍵字參數,對軸標簽使用TeX格式化,如果你的系統上沒有安裝Te X,可以忽略這一點:

3.現在,我們可以使用ax2對象在第二個繪圖形(顯示在右側)上繪制誤差值。我們使用名為semilogy的另一種畫圖方法,它在y軸上使用對數刻度。這個方法的簽名與標準的plot方法相同。同樣,我們設置了軸標簽和標題。如果你沒有安裝TeX,同樣可以省略對usetex的使用:

這一系列命令的結果如圖2.3所示。

圖2.3 在同一個Figure對象上繪制多個子圖
圖2.3中,左圖繪制了以牛頓法求解對函數的前五次迭代結果,右圖則以對數刻度繪制了結果的近似誤差。
2.3.3 原理解析
在Matplotlib中,Figure對象只是一個包含特定大小繪圖元素(如Axes)的容器。Figure對象通常只包含一個Axes對象,該對象占據整個圖形區域,但它也可以在同一區域內包含任意數量的Axes對象。subplots例程執行了以下幾個操作。首先,它創建一個新圖形,然后在圖形區域內創建了具有指定形狀的網格。其次,在網格的每個位置添加新的Axes對象。再次,將新的Figure對象和一個或多個Axes對象返回給用戶。如果只需要一個子圖(一行一列,沒有其他參數),那么將返回一個普通的Axes對象;如果需要一行或一列(分別有多列或多行)繪圖區域,那么將返回一個Axes對象的列表;如果需要多行多列繪圖區域,則返回一個列表的列表,其中的行是由Axes對象組成的列表。最后,我們可以在每個Axes對象上使用繪圖方法,將圖形填充到所需的圖中。
在這個示例中,我們在左側圖形中使用了標準的plot方法,就像我們在之前的示例中看到的那樣。然而,在右側的圖形中,我們使用了將坐標軸更改為對數刻度的繪圖方式。這意味著軸上的每個單位代表的都是10的冪的變化,而不是一個單位的變化,因此0表示100=1,1表示10,2表示100,以此類推。軸標簽會自動更改以反映這種刻度變化。當數值有數量級的變化時,這種類型的縮放很有用,例如展示隨著迭代次數的增加而得到的近似誤差的情況。我們還可以使用semilogx方法在x軸上使用對數刻度,或使用loglog方法在兩個軸上同時使用對數刻度。
2.3.4 更多內容
在Matplotlib中,有多種創建子圖的方法。如果你已經創建了Figure對象,那么可以使用Figure對象的add_subplot方法添加子圖。另外,你還可以使用matplotlib.pyplot中的subplot例程將子圖添加到當前圖形中。如果尚不存在Figure對象,調用此方法時將先創建一個Figure對象。subplot例程是Figure對象上add_subplot方法的簡便包裝。
在前面的示例中,我們創建了兩個在y軸上具有不同刻度的圖,這演示了子圖的許多可能用途之一。子圖的另一個常見的用途是繪制矩陣中的數據,其中矩陣的列具有共同的x標簽,行具有共同的y標簽,這在多元統計中非常常見,用于研究各組數據之間的相關性。用于創建子圖的plt.subplots例程接受sharex和sharey這兩個關鍵字參數,允許坐標軸在所有子圖或一行、一列中共享。此設置會影響坐標軸的比例和刻度。
2.3.5 另請參閱
Matplotlib通過為subplots例程提供gridspec_kw關鍵字參數來支持更高級的布局。更多信息請參閱matplotlib.gridspec的文檔。
- 測試驅動開發:入門、實戰與進階
- C/C++常用算法手冊(第3版)
- Learn WebAssembly
- 機器學習與R語言實戰
- Getting Started with React Native
- Training Systems Using Python Statistical Modeling
- Visual Basic 程序設計實踐教程
- Android嵌入式系統程序開發(基于Cortex-A8)
- Learning Shiny
- 詩意的邊緣
- Visual C++網絡編程教程(Visual Studio 2010平臺)
- iOS應用逆向工程:分析與實戰
- 亮劍Java Web項目開發案例導航
- 接口自動化測試持續集成:Postman+Newman+Git+Jenkins+釘釘
- Spring Cloud微服務架構開發實戰