天天看點

Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

等比例縮放坐标軸

預設情況下,Matplotlib對圖形的兩個軸使用不同的比例,在系列教程

自定義坐标軸

中,我們已經看到可以使用 plt.axis('scaled') 來使坐标軸具有相同比例,這裡我們介紹另外一種方法,通過 Axes 對象修改坐标軸比例。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.axes().set_aspect('equal')
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.show()      

等效于:

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.axis('scaled')
plt.show()      
Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

可以看到我們繪制的橢圓,其中長軸的長度是短軸的兩倍,而通過修改坐标軸的比例,Matplotlib渲染的橢圓也具有相同的比例。

Tips:plt.axes() 函數傳回 Axes 對象的一個執行個體,Axes 執行個體有一個 set_aspect 方法,将其設定為"equal"則兩個軸使用相同的比例。

如果我們不進行此設定,則所繪制的橢圓則如下圖所示,看起來長軸的長度并非短軸的兩倍。

import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0, 2 * np.pi, 1024)
plt.plot(2. * np.cos(t), np.sin(t), c = 'c', lw = 1.5)
plt.show()      
Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

設定圖形比例

當我們需要将圖形用于期刊出版物或網站時,可能需要具有特定縱橫比的圖形。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 1000)
y_1, y_2 = np.sinc(x), np.cos(x)
plt.figure(figsize=(10.24, 2.56))
plt.plot(x, y_1, c='c', lw = 1.25)
plt.plot(x, y_2, c='m', lw = 1.25)
plt.show()      
Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

Tips:plt.figure() 函數用于建立一個新的 Figure 執行個體,一個 Figure 對象表示一個圖形整體。通常,此對象是在隐式建立的。但是,通過顯式地建立 Figure 對象,我們可以控制圖形的各個方面,其中 figsize 參數允許我們指定 Figure 對象大小。

設定坐标軸範圍

預設情況下,Matplotlib會在兩個坐标軸方向上查找資料的最小值和最大值,并進行适當的擴充,用作繪制資料的範圍。但是,有時需要手動設定圖形的坐标軸範圍,以便更好地檢視資料的極值。

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-6, 6, 1024)
plt.ylim(-.5, 1.5)
plt.plot(x, np.sinc(x), c = 'c')
plt.show()      
Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

Tips:plt.xlim() 和 plt.ylim() 分别用于控制 x 軸和 y 軸的範圍,其接受參數用于設定坐标軸範圍的最大值和最小值。

插入子圖

在一個圖形中嵌入的小圖形有助于顯示圖形的細節,或者也可以說,有助于強調圖形的特定部分。與使用多個子圖進行的合成有所不同,這種插入子圖,其子圖是圖形的一部分,而多個子圖進行的合成中,子圖間是彼此獨立的,抽象的講解太過複雜,看一個示例就能一目了然了。

import numpy as np
from matplotlib import pyplot as plt
x = np.linspace(-6, 6, 1024)
y = np.sinc(x)
x_detail = np.linspace(-2, 2, 1024)
y_detail = np.sinc(x_detail)
plt.plot(x, y, c = 'c')
sub_axes = plt.axes([.6, .6, .25, .25])
sub_axes.plot(x_detail, y_detail, c = 'm')
plt.setp(sub_axes)
plt.show()      
Matplotlib自定義統計圖比例等比例縮放坐标軸設定圖形比例設定坐标軸範圍插入子圖

為了插入子圖,我們首先在圖上建立一個子區域:

sub_axes = plt.axes([.6, .6, .25, .25])      

在圖形坐标的表示中:(0, 0) 是整個圖形的左下角,(1, 1) 是右上角,子區域由四個值定義——區域左下角的坐标及其尺寸。

一旦定義了子區域,我們就有了一個 Axes 執行個體,然後就可以在其中繪制所需圖形。最後,我們需要在 Axes 執行個體上調用 plt.setp() 顯示子圖:

plt.setp(sub_axes)      

Tips:可以建立的子圖數量并沒有限制。