文章目錄
- 一. 改變 x 軸顯示内容 xticks 方法再次說明
-
- 1. x 軸是數值型資料
- 2. 将 x 軸更改為字元串
- 3. 總結
- 二. 其他元素可視性
-
- 1. 顯示網格:plt.grid()
- 2. plt.gca( ) 對坐标軸的操作
- 三. plt.rcParams 設定畫圖的分辨率,大小等資訊
- 四. 圖表的樣式參數設定
-
- 1. 線條樣式
- 2. 線條樣式縮寫
- 五. 建立圖形對象
- 六. 繪制多子圖
-
- 1. add_axes():添加區域
- 2. subplot() 函數,它可以均等地劃分畫布
- 3. 設定多圖的基本資訊方式
-
- 3.1 在建立的時候直接設定
- 3.2 使用 pyplot 子產品中的方法設定後再繪制
- 3.3 使用傳回的區域對象設定
- 4. subplots() 函數詳解
- 在最開始,我們先引入 Matplotlib 庫,便于後續的操作。
from matplotlib import pyplot as plt
import numpy as np
一. 改變 x 軸顯示内容 xticks 方法再次說明
- 第一個參數,需要一個數字清單,訓示 x 軸上的記号應該指向哪裡,我們向這個函數傳遞了一個字元串,但它并不知道如何将其轉換為 x 軸上的位置。
1. x 軸是數值型資料
- 例如,我們使用 np.arange() 生成從 1991 年到 2020 年,30 年的日期資料。
dates = np.arange(1991,2021)
dates
#array([1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
# 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020])
- 随後,我們再使用 np.random.randint() 随機生成這 30 年的銷量資料。
sales = np.random.randint(50,500,size=30)
sales
#array([150, 115, 52, 247, 113, 54, 204, 405, 245, 438, 251, 392, 222,
# 416, 388, 112, 250, 473, 444, 195, 147, 123, 136, 294, 240, 129,
# 290, 255, 381, 149])
- 最後,我們将日期作為橫坐标,銷量作為縱坐标繪制銷量圖。

- 通過上述步驟我們可以發現,對于數值型數組,繪圖會自動分割。
- 但是,如果想按照自己的邏輯分割,注意數值型對應軸上面的數值,比如,我們可以将 x 軸的刻度進行修改,并繪制銷量圖。
%matplotlib inline
plt.xticks([1980,1982,1993])
plt.plot(dates,sales)
- 目前會看到 x 軸上面沒有資料,其實是有資料,隻不過,預設目前圖形的 x 軸區間是 [1991,2021],對此,我們可以借助設定 %matplotlib notebook 移動圖像來檢視。
- %matplotlib notebook
plt.xticks([1980,1982,1993])
plt.plot(dates,sales)
- 如果我們想按照自己的邏輯分割,注意數值型使用的是元素本身,而不是元素的索引。
- 如果我們直接使用元素本身就會産生如下現象。
plt.xticks([1990,2005,2010,2020])
plt.plot(dates,sales)
- 是以,如果我們想 x 軸刻度每兩年顯示一次的話,就需要使用元素的索引進行銷量圖的繪制。
plt.xticks(np.arange(dates.min(),dates.max()+2,2),rotation=45)
plt.plot(dates,sales)
那麼,對于上述的邏輯分割,我們也是可以使用元素本身的,隻不過需要一些計算。
plt.xticks([dates[i] for i in range(0,len(dates),2)]+[2020],rotation=45) # 元素本身
plt.plot(dates,sales)
2. 将 x 軸更改為字元串
- 我們将從 1991 年到 2020 年,30 年的日期修改為字元串。
- 這裡需要注意的是 xticks 第一個參數中元素不能我字元串 。
dates = np.arange(1991,2021).astype(np.str_)
plt.xticks(range(1,len(dates),2),rotation=45) # 元素本身
plt.plot(dates,sales)
3. 總結
- (1) 當 x 軸是數值型,會按照數值型本身作為 x 軸的坐标。
- (2) 當 x 軸為字元串類型,會按照索引作為 x 軸的坐标。
- 具體可見如下例子:
time=np.arange(2000,2020).astype(np.str_)
sales = [109, 150, 172, 260, 273, 333, 347, 393, 402, 446, 466, 481, 499,504, 513, 563, 815, 900, 930, 961]
plt.xticks(range(0,len(time),2))##,labels=['year%s'%i for i in time],rotation=45,color="red")
plt.yticks(color="blue")
plt.plot(time,sales)
二. 其他元素可視性
1. 顯示網格:plt.grid()
- 顯示網格 plt.grid() 的參數有如下含義:
- linestyle:線型。
- color:顔色。
- linewidth:寬度。
- axis:x,y,both,顯示x/y/兩者的格網。
- 例如,我們可以使用 np.linspace 生成從 -Π 到 Π 并且包含終止值的 256 個資料,并分别生成一個 cos 和 sin 函數。
x = np.linspace(-np.pi,np.pi,256,endpoint = True)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)
plt.plot(x, s)
plt.grid(True,linestyle="--")
2. plt.gca( ) 對坐标軸的操作
- 首先觀察畫布上面的坐标軸,如下圖。
- 上圖中,用紅色辨別出的黑色邊界框線在 Matplotlib 中被稱為 spines,中文翻譯為脊柱。
- 在我的了解看來,意思是這些邊界框線是坐标軸區域的支柱,那麼,我們最終要挪動的其實就是這四個支柱,且所有的操作均在 plt.gca( ) 中完成,gca 就是 get current axes 的意思。
- 接下來需要繪制圖如下:
- 首先,我們建立 x 軸資料,使用 np.arange( ) 生成從 -50 到 50 的 x 軸資料,再建立 y 軸的資料,y 是 x 的平方,并繪制圖形。
x = np.arange(-50,51)
y = x ** 2
plt.plot(x, y)
- 然後,我們擷取目前坐标軸,通過坐标軸 spines ,确定 top,bottom,left,right(分别表示上,下,左,右)。
- 此時,我們需要的是坐标軸,是以,不需要右側和上側線條,将其顔色設定為 none。
x = np.arange(-50,51)
y = x ** 2
ax = plt.gca()
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")
plt.plot(x, y)
- 随後,我們在上述的基礎上,分别定義 x,y,擷取目前坐标軸移動下軸到指定位置,在這裡,position 位置參數有三種,data , outward(向外),axes。
- axes 是 0.0 - 1.0 之間的值,按軸上的比例劃分。
- data 表示按數值挪動,其後數字代表挪動到 Y 軸的刻度值。
- 最後,在設定 y 的取值範圍,将兩個 0 點移動到一起。
x = np.arange(-50,51)
y = x ** 2
ax = plt.gca()
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")
ax.spines['left'].set_position(('axes',0.5))
plt.ylim(0, y.max())
plt.plot(x, y)
三. plt.rcParams 設定畫圖的分辨率,大小等資訊
- plt.rcParams[‘figure.figsize’] = (8.0, 4.0) 是設定 figure_size 英寸。
- plt.rcParams[‘figure.dpi’] = 300 是設定分辨率。
- 預設的像素:[6.0,4.0],分辨率為 72,圖檔尺寸為 432x288。
- 如果指定 dpi=100,則圖檔尺寸為 600*400。
- 如果指定 dpi=300,則圖檔尺寸為 1800*1200。
- 針對上述,我們進行如下的樣例示範。
- (1) 分辨率為 72,圖檔尺寸為 432x288(預設值)。
- (2) 将大小設定為 (6.0,4.0) 英寸。
plt.rcParams['figure.figsize'] = (6.0, 4.0)
plt.plot()
- (3) 指定 dpi=100,圖檔尺寸為 600*400。
plt.rcParams['figure.dpi'] = 100
plt.plot()
- 将大小設定為 (3,2) 英寸(注意橫縱坐标的刻度也發生了變化)。
plt.rcParams['figure.figsize']=(3,2)
plt.plot()
四. 圖表的樣式參數設定
1. 線條樣式
- 傳入 x,y,通過 plot 畫圖,并設定折線顔色、透明度、折線樣式和折線寬度,标記點、标記點大小、标記點邊顔色、标記點邊寬,網格等。
- (1) color:可以使用顔色的 16 進制,也可以使用線條顔色的英文,還可是使用之前的縮寫。
字元 | 顔色 | 英文全稱 |
---|---|---|
‘b’ | 藍色 | blue |
‘g’ | 綠色 | green |
’ r ’ | 紅色 | red |
’ c ’ | 青色 | cyan |
’ m ’ | 品紅 | magenta |
’ y ’ | 黃色 | yellow |
’ k ’ | 黑色 | black |
’ w ’ | 白色 | white |
- (2) alpha:0-1,透明度。
- (3) linestyle:折線樣式。
字元 | 描述 |
---|---|
‘-’ | 實線 |
‘–’ | 虛線 |
‘-.’ | 點劃線 |
‘:’ | 虛線 |
- (4) marker 标記點:。
标記符号 | 描述 |
---|---|
‘.’ | 點标記 |
‘o’ | 圓圈标記 |
‘x’ | 'X’标記 |
‘D’ | 鑽石标記 |
‘H’ | 六角标記 |
‘s’ | 正方形标記 |
‘+’ | 加号标記 |
- 例如如下應用:
x= np.arange(0, 100,10)
y= x ** 2
"""linewidth 設定線條粗細
label 設定線條标簽
color 設定線條顔色
linestyle 設定線條形狀
marker 設定線條樣點标記
"""
plt.plot(x, y, linewidth = '2', label = "test", color='b', linestyle='--', marker='H')
plt.legend(loc='upper left')
2. 線條樣式縮寫
- 我們可以設定兩條曲線,第一個是紅色,點劃線;第二個是品紅,虛線。
- 将他們的線條樣式進行縮寫。
plt.plot([1,2,3],[4,7,6],'r*-.')
plt.plot([2,4,5],[3,8,7],'m+--')
- 除此之外,我們也可以多設定幾種線條樣式的組合,并将他們添加到圖例當中。
plt.rcParams['figure.figsize']=(8,4)
x=np.linspace(0,10,100)
plt.plot(x,x+0, '-g', label='-g')
plt.plot(x,x+1, '--c', label='--c')
plt.plot(x,x+2, '-.k', label='-.k')
plt.plot(x,x+3, '-r', label='-r')
plt.plot(x,x+4, 'o', label='o')
plt.plot(x,x+5, 'x', label='x')
plt.plot(x,x+6, 'dr', label='dr')
plt.legend(loc='lower right',framealpha=0.5,shadow=True, borderpad=0.5)
五. 建立圖形對象
- 在 Matplotlib 中,面向對象程式設計的核心思想是建立圖形對象(figure object)。
- 通過圖形對象來調用其它的方法和屬性,這樣有助于我們更好地處理多個畫布。
- 在這個過程中,pyplot 負責生成圖形對象,并通過該對象來添加一個或多個 axes 對象(即繪圖區域)。
- Matplotlib 提供了 matplotlib.figure 圖形類子產品,它包含了建立圖形對象的方法。通過調用 pyplot 子產品中 figure() 函數來執行個體化 figure 對象。
- 其參數具有如下含義:
- num 表示圖像編号或名稱,數字為編号,字元串為名稱。
- figsize 表示指定 figure 的寬和高,機關為英寸。
- dpi 表示定繪圖對象的分辨率,即每英寸多少個像素,預設值為 72。
- facecolor 表示背景顔色。
- edgecolor 表示邊框顔色。
- frameon 表示是否顯示邊框。
- 具體可見如下例子。
- 建立圖形對象,就相當于我們建立一個畫布。
- 之前通過配置更改圖形的分辨率和寬高.。現在可以在建立圖像對象的時候建立。
from matplotlib import pyplot as plt
fig = plt.figure()
fig = plt.figure('f1',figsize=(3,2),dpi=100)
x = np.arange(0,50)
y = x ** 2
plt.plot(x,y)
- 然後,我們建立圖形對象,圖形對象的分辨率為 100,背景顔色為:灰色,并擷取軸。
x = np.arange(0,50)
y = x ** 2
fig = plt.figure('f1',figsize=(4,2), dpi=100,facecolor='gray')
ax = plt.gca()
ax.plot(x,y)
plt.plot(x,y)
六. 繪制多子圖
- figure 是繪制對象(可了解為一個空白的畫布),一個 figure 對象可以包含多個 Axes 子圖,一個 Axes 是一個繪圖區域,不加設定時,Axes 值預設為 1,且每次繪圖其實都是在 figure 上的 Axes 上繪圖。
- 我們是在圖形對象上面的 Axes 區域進行作畫。
- 接下來我們将學習繪制子圖的幾種方式:
- (1) add_axes():添加區域。
- (2) subplot():均等地劃分畫布,隻是建立一個包含子圖區域的畫布,(傳回區域對象)。
- (3) subplots():既建立了一個包含子圖區域的畫布,又建立了一個 figure 圖形對象(傳回圖形對象和區域對象)。
1. add_axes():添加區域
- Matplotlib 定義了一個 axes 類(軸域類),該類的對象被稱為 axes 對象(即軸域對象),它指定了一個有數值範圍限制的繪圖區域。在一個給定的畫布(figure)中可以包含多個 axes 對象,但是同一個 axes 對象隻能在一個畫布中使用。
- 2D 繪圖區域(axes)包含兩個軸(axis)對象
- 其文法如下:
- 該方法用來生成一個 axes 軸域對象,對象的位置由參數 rect 決定。
- rect 是位置參數,接受一個由 4 個元素組成的浮點數清單,形如 [left, bottom, width, height] ,它表示添加到畫布中的矩形區域的左下角坐标 (x, y),以及寬度和高度。
- 如下所示:
- ax1 從畫布起始位置繪制,寬高和畫布一緻;ax2 從畫布 20% 的位置開始繪制, 寬高是畫布的 50%。
fig = plt.figure(figsize=(4,2),facecolor='g')
ax1=fig.add_axes([0,0,1,1])
ax2=fig.add_axes([0.1,0.6,0.3,0.3])
ax3=fig.add_axes([0.5,0.6,0.2,0.3])
ax1.plot(x, y)
ax2.plot(x, y)
ax3.plot(x, y)
- 注意:每個元素的值是畫布寬度和高度的分數。即将畫布的寬、高作為 1 個機關。比如,[ 0.2, 0.2, 0.5, 0.5],它代表着從畫布 20% 的位置開始繪制, 寬高是畫布的 50%
- 我們建立 ax1,和畫布位置一緻;ax2 從畫布 40% 的位置開始繪制, 寬高是畫布的 50%
fig = plt.figure(figsize=(4,2),facecolor='g')
x = np.arange(0,50,2)
y = x ** 2
ax1 = fig.add_axes([0.0,0.0,1,1])
ax1.plot(x,y)
ax2=fig.add_axes([0.4,0.4,0.3,0.3])
ax2.plot(x,y)
- 其中區域中基本方法的使用如下:
- 區域圖表名稱:set_title。
- 區域中 x 軸和 y 軸名稱:set_xlabel() 和 set_ylabel()。
- 刻度設定:set_xticks()。
- 區域圖表圖例:legend()。
2. subplot() 函數,它可以均等地劃分畫布
- 其參數格式如下:
- nrows 表示行。
- ncols 表示列。
- index 表示索引。
- kwargs 表示 title/xlabel/ylabel 等。
- 也可以直接将幾個值寫到一起,例如:subplot(233)。
- 傳回:區域對象。
- nrows 與 ncols 表示要劃分幾行幾列的子區域(nrows*nclos表示子圖數量),index 的初始值為1,用來標明具體的某個子區域。
- 例如: subplot(233) 表示在目前畫布的右上角建立一個兩行三列的繪圖區域(如下圖所示),同時,選擇在第 3 個位置繪制子圖。
- 如果建立的子圖與現有的子圖重疊,那麼重疊部分的子圖将會被自動删除,因為它們不可以共享繪圖區域。
- 現在建立一個子圖,它表示一個有 1 行 2 列的網格的頂部圖。引為這個子圖将與第一個重疊,是以之前建立的圖将被删除,x 可省略,預設 [0,1…,N-1] 遞增。
plt.plot([1,2,3])
plt.subplot(211)
plt.plot(range(50,70))
plt.subplot(212)
plt.plot(np.arange(12)**2)
- 如果不想覆寫之前的圖,需要先建立畫布。還可以先設定畫布的大小,再通過畫布建立區域。
fig = plt.figure(figsize=(4,2))
fig.add_subplot(111)
plt.plot(range(20))
fig.add_subplot(221)
plt.plot(range(12))
3. 設定多圖的基本資訊方式
3.1 在建立的時候直接設定
- 對于 subplot 關鍵詞指派參數的了解,可以将光标移動到 subplot 方法上,使用快捷鍵 shift+tab 檢視具體内容。
- 現在建立一個子圖,它表示一個有 2 行 1 列的網格的頂部圖。x 可省略,預設 [0,1…,N-1] 遞增。
plt.subplot(211,title="pic1", xlabel="x axis")
plt.plot(range(50,70))
plt.subplot(212, title="pic2", xlabel="x axis")
plt.plot(np.arange(12)**2)
- 發現子圖示題重疊,在最後使用 plt.tight_layout()。
plt.subplot(211,title="pic1", xlabel="x axis")
plt.plot(range(50,70))
plt.subplot(212, title="pic2", xlabel="x axis")
plt.plot(np.arange(12)**2)
plt.tight_layout()
3.2 使用 pyplot 子產品中的方法設定後再繪制
plt.subplot(211)
plt.title("ax1")
plt.plot(range(50,70))
plt.subplot(212)
plt.title("ax2")
plt.plot(np.arange(12)**2)
plt.tight_layout()
3.3 使用傳回的區域對象設定
- 注意區域對象的方法很多都是 set_ 開頭。
ax1 = plt.subplot(211)
ax1.set_title("ax1")
ax1.plot(range(50,70))
ax2 = plt.subplot(212)
ax2.set_title("ax2")
ax2.plot(np.arange(12)**2)
plt.tight_layout()
4. subplots() 函數詳解
- matplotlib.pyplot 子產品提供了一個 subplots() 函數,它的使用方法和 subplot() 函數類似。其不同之處在于,subplots() 既建立了一個包含子圖區域的畫布,又建立了一個 figure 圖形對象,而 subplot() 隻是建立一個包含子圖區域的畫布。
- subplots 的函數格式如下:
- nrows 與 ncols 表示兩個整數參數,它們指定子圖所占的行數、列。
- 函數的傳回值是一個元組,包括一個圖形對象和所有的 axes 對象。其中 axes 對象的數量等于 nrows * ncols,且每個 axes 對象均可通過索引值通路(從 0 開始)。
- 下面我們建立了一個 2 行 2 列的子圖,并在每個子圖中顯示 4 個不同的圖像。
-
第一幅圖像就是 (0,0),顯示的是 x 2 x^{2} x2;第二幅圖像就是 (0,1),顯示的是 x \sqrt{x} x
;第三幅圖像就是 (1,0),顯示的是 e x e^{x} ex;第四幅圖像就是 (1,1),顯示的是 log 10 x \log_{10}{x} log10x。
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2,2)
x = np.arange(1,5)
axes[0][0].plot(x, x*x)
axes[0][0].set_title('square')
axes[0][1].plot(x, np.sqrt(x))
axes[0][1].set_title('square root')
axes[1][0].plot(x, np.exp(x))
axes[1][0].set_title('exp')
axes[1][1].plot(x,np.log10(x))
axes[1][1].set_title('log')
plt.tight_layout()
plt.show()