文章目錄
- 通過figure()函數創建畫布
- 通過subplot()函數創建單個子圖
- 通過subplots()函數創建多個子圖
- 通過add_subplot()方法添加和選中子圖
- 添加各類標簽
- 繪制常見圖表
- 繪制直方圖——hist()函數
- 繪制散點圖——scatter()函數
- 繪制柱狀圖——bar()函數
- 設定線條的相關參數
- 本地保存圖片
通過figure()函數創建畫布
在pyolot模塊中,默認擁有一個Figure對象,該對象可以理解為一張空白的畫布,用于容納圖標的各種組件,比如圖例、坐標軸等。
figure(num=None, # autoincrement if None, else integer from 1-N
figsize=None, # defaults to rc figure.figsize
dpi=None, # defaults to rc figure.dpi
facecolor=None, # defaults to rc figure.facecolor
edgecolor=None, # defaults to rc figure.edgecolor
frameon=True,
FigureClass=Figure,
clear=False,
**kwargs
)
部分參數表示的含義如下:
- num:表示圖形的編號或名稱,數字代表編號,字符串表示名稱。如果沒有提供該參數,則會創建一個新的圖形,并且這個圖形的編號會增加;如果提供該參數,并且具有此id的圖形已經存在,則會將其激活并返回對其的引用,若此圖形不存在,則會創建并返回它。
- figsize:用于設置畫布的尺寸,寬度、高度以英寸為單位。
- dpi:設置圖形的分辨率。
- facecolor:用于設置畫板的背景顏色。
- edgecolor:用于顯示邊框原色。
- frameon:表示是否顯示邊框。
- FigureClass:派生自matplotlib.figure.Figure的類,可以選擇使用自定義的圖形對象。
- clear:若設為True且該圖形已經存在,則它會被清除。
創建新的畫布并返回Figure實例
figure_obj = plt.figure()
print(type(figure_obj))
輸出結果:
<class 'matplotlib.figure.Figure'>
用type()查看figure_obj對象的類型,可以看出其是一個Figure類的對象。
創建的新畫布:
嘗試另創建一個背景顏色為灰色的新畫布,并在畫布上繪制一張折線圖:
import matplotlib.pyplot as plt
import numpy as npdata = np.arange(100, 201)
plt.figure(facecolor='gray')
plt.plot(data)
plt.show()
輸出結果:
從輸出結果可以看出x軸的刻度范圍為0~100,y軸的刻度范圍為指定的數值區間。這是因為在調用plot()函數時,如果傳入了單個列表或數組,則會將其設為y軸序列,且自動生成x軸的序列。x軸的序列從0開始,與y軸序列具有相同的長度。
通過subplot()函數創建單個子圖
在同一個畫布上繪制多個圖形,Figure對象允許劃分為多個繪圖區域,每個繪圖區域都是一個Axes對象,它擁有屬于自己的坐標系統,被稱為子圖。
subplot(nrows, ncols, index, **kwargs)
參數表示的含義如下:
- nrows,ncols:表示子區網格的行數、列數。
- index:表示矩陣區域的索引。
subplot()函數會將整個繪圖區域等分為“nrows(行)× ncols(列)”的矩陣區域,之后按照從左到右、從上到下的順序對每個區域進行編號。從一開始依次遞增。
如果nrows, ncols, index這三個參數的值都小于10,則可以把它們簡寫為一個實數,如subplot(2,2,3)可以寫成subplot(223)。
創建單個子圖并在其上繪制簡單的圖形:
data = np.arange(100, 201)
plt.subplot(221)
plt.plot(data, data)
plt.subplot(2, 2, 2)
plt.plot(data, -data)
plt.subplot(212)
plt.plot(data, data*2)
plt.show()
輸出結果:
通過subplot()函數可以規劃Figure對象劃分為多少個字圖,但每調用一次該函數只會創建單個子圖。
通過subplots()函數創建多個子圖
如果希望一次性創建一組子圖,則可以通過subplots()函數進行實現。
subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True,
subplot_kw=None, gridspec_kw=None, **fig_kw):
上述函數常用的參數含義如下:
- nrows,ncols:表示子區網格的行數、列數,默認為1。
- sharex,sharey:表示控制x或y軸是否共享。若設為“True”或“all”,則表示x或y軸在所有的子圖中共享;若設為“False”或“None”,則每個子圖的x或y軸是獨立的;若設為“row”,則每個子圖沿行方向共享x軸或y軸;若設為“col”,則每個子圖沿列方向共享x軸或y軸。
subplots()函數會返回一個元組,元組的第一個元素為Figure對象(畫布),第二個元素為Axes對象(子圖,包含坐標軸和畫的圖)或Axes對象數。如果創建的是單個子圖,則返回的是一個Axes對象,否則返回的是一個Axes對象數組。
創建4個子圖,并在每個子圖上繪制一些簡單的圖形:
# 生成包括100~200之間所有整數的數組
data = np.arange(100, 201)# 分成2*2的矩陣區域,返回子圖數組axes
fig, axes = plt.subplots(2, 2)
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
# 再選中的子圖上作圖
ax1.plot(data, data)
ax2.plot(data, -data)
ax3.plot(data, data**2)
ax4.plot(data, np.log(data))
plt.show()
輸出結果:
通過add_subplot()方法添加和選中子圖
想要創建子圖,除了使用pyplot模塊的函數之外, 還可以通過Figure類的add_subplot()方法添加和選中子圖。
add_subplot(self, *args, **kwargs)
上述方法中,*args參數表示一個三位數的實數或三個獨立的實數,用于描述子圖的位置。(具體用法類似于subplot()函數中的nrows, ncols, index參數。)
注意: 每調用一次add_subplot()方法會規劃畫布劃分子圖,但只會添加一個子圖。當調用plot()函數繪制圖形時,會畫在最后一次指定子圖的位置上。
創建具有兩行兩列的矩陣區域,且在編號為2的子圖上繪制圖形:
# 通過add_subplot()方法添加和選中子圖
fig = plt.figure()
# 添加子圖
fig.add_subplot(2, 2, 1)
fig.add_subplot(2, 2, 4)
fig.add_subplot(223)
fig.add_subplot(2, 2, 2)
# 在子圖上作圖,randn函數返回一個或一組樣本,具有標準正態分布。
random_arr = np.random.randn(100)
# 默認是在最后一次使用subplot的位置上作圖,即編號為3的位置
plt.plot(random_arr)
plt.show()
輸出結果:
上述示例中,首先創建了Figure類對象fig,然后調用add_subplot()方法將fig對象化分為一個2行2列的矩陣區域,且將圖形繪制在最后選中的編號為2的子區域上,調用plot()函數根據創建的隨機數組繪制折線圖。
添加各類標簽
圖表添加標簽和圖例的常用函數
函 數 名 稱 | 說 明 |
---|---|
title() | 設置當前軸的標題 |
xlabel() | 設置當前圖形x軸的標簽名稱 |
ylabel() | 設置當前圖形y軸的標簽名稱 |
xticks() | 指定x軸刻度的數目與取值 |
yticks() | 指定y軸刻度的數目與取值 |
xlim() | 設置或獲取當前圖形x軸的范圍 |
ylim() | 設置或獲取當前圖形y軸的范圍 |
legend() | 在軸上放置一個圖例 |
表中的函數之間是并列關系,沒有先后順序,既可以先繪制圖形,也可以先添加標簽。當然,添加圖例只能在繪制完成之后。
在使用Matplotlib繪圖時,如果要設置的圖標標題中有中文字符,則會變成方格子而無法正確顯示。
實際上Matplotlib是支持中文編碼的,出現這種情況主要是因為Matplotlib庫的配置信息里面沒有中文字體的相關信息,這是可以采用以下方式進行解決:
在python腳本中動態設置matplotlib,這樣就可以避免由于更改配置文件而造成的麻煩。
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 設置顯示中文字體
另外,由于字體更改以后會導致坐標軸中部分字符無法正常顯示,這是需要更改axes.unicode_minus參數。
mpl.rcParams['axes.unicode_minus'] = False # 設置正常顯示符號
代碼實現:
# 添加各類標簽
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 設置顯示中文字體
mpl.rcParams['axes.unicode_minus'] = False # 設置正常顯示符號
data1 = np.arange(0, 1.8, 0.1)
plt.title("陳丑丑的身高體重數據") # 添加標題
plt.xlabel("length") # x軸名稱
plt.ylabel("weight") # y軸名稱
plt.xticks(np.arange(0, 1.8, step=0.1))
plt.yticks(np.arange(0, 66, step=4))
plt.plot(data1, (data1**2)*20) # 繪制y=(x^2)*20曲線
plt.legend(["y=(x^2)*20"]) # 添加圖例
plt.show()
輸出結果:
繪制常見圖表
繪制直方圖——hist()函數
hist(
x, bins=None, range=None, density=False, weights=None,
cumulative=False, bottom=None, histtype=‘bar’, align=‘mid’,
orientation=‘vertical’, rwidth=None, log=False, color=None,
label=None, stacked=False, *, data=None, **kwargs)
上述函數中常用參數表示的含義如下:
- x:表示輸入值,可以是單個數組,或者是不需要相同長度的數組序列。
- bins:表示繪制條柱的個數,默認為10。
- range:bins的上下范圍(最大和最小值)。
- color:表示條柱的顏色,默認為None。
代碼實現:
arr_random = np.random.randn(100)
plt.hist(arr_random, bins=8, color='m', alpha=0.5) # alpha用于設置顏色深度——透明度
plt.show()
輸出結果:
上述示例中,首先創建了一個包含100個隨機數的數組,用來表示繪制圖形使用的數據,接著調用hist()函數繪制一個直方圖,這個直方圖共有8個條柱,每個條柱的顏色為品紅,透明度alpha為0.5。
繪制散點圖——scatter()函數
scatter(
x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None,
verts=cbook.deprecation._deprecated_parameter,
edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
上述函數中常用參數表示的含義如下:
- x,y:表示x軸和y軸對應的數據。
- s:指定散點的大小。若傳入的是一維數組,則表示每個點的大小。
- c:指定散點的顏色。若傳入的是一維數組,則表示每個點的顏色。
- marker:表示繪制的散點類型。
- alpha:表示點的透明度,取值0~1之間。
代碼實現:
# 繪制散點圖
x = np.arange(21)
y = np.random.rand(21)*10
plt.scatter(x, y, c='g', marker='*')
plt.show()
輸出結果:
上述示例中,首先創建了一個包含整數0 ~ 20的數組,這些數值將作為散點圖中x軸對應的數據。其次創建了含有21個0 ~ 1之間的隨機數的數組,將它們乘以10的結果作為y軸對應的數據。散點的類型為星形。【關于線條的相關參數設置在本篇篇尾】
繪制柱狀圖——bar()函數
bar(
x, height, width=0.8, bottom=None, *, align=‘center’,
data=None, **kwargs)
上述函數中常用參數表示的含義如下:
- x:表示x軸的數據。
- height:表示條形的高度。
- width:表示條形的寬度,默認為0.8。
- color:表示條形的顏色。
- edgecolor:表示條形邊框的顏色。
代碼實現:
# 繪制柱狀圖
x1 = np.arange(5)
# 從上下限范圍內隨機選取整數,創建兩個2行5列的數組
y1, y2 = np.random.randint(1, 91, size=(2, 5))
ax = plt.subplot(222) # 創建一個子圖
width = 0.25 # 條形的寬度
ax.bar(x1, y1, width=width, color='r') # 繪制紅色的柱形圖
ax.bar(x1+width, y2, width=width, color='g') # 繪制另一個綠色的柱形圖
ax.set_xticks(x1+0.1) # 設置x軸的刻度
ax.set_xticklabels(['a', 'b', 'c', 'd', 'e']) # 設置x軸的標簽
plt.show()
輸出結果:
上述示例中,首先創建了包含整數0 ~ 4的數組,將其作為x軸的數據;接著又創建了兩個2行5列的二維數組,它們的數據是從1 ~ 30內隨機選取的整數,然后再指定編號為2的子圖上,調用bar()函數繪制了兩個柱形圖。第一個柱形圖x,y軸的數據設為x1、y1,顏色為紅色。第二個柱形圖x,y軸使用的數據為x+width和y2,顏色為綠色,最后設置了x軸的刻度標簽為“a、b、c、d、e”。
設定線條的相關參數
線條顏色使用color參數控制
顏 色 值 | 說 明 |
---|---|
b(blue) | 藍色 |
g(green) | 綠色 |
r(red) | 紅色 |
c(cyan) | 青色 |
m(magenta) | 品紅 |
y(yellow) | 黃色 |
k(black) | 黑色 |
w(white) | 白色 |
標記風格使用marker參數控制
標記風格值 | 說 明 |
---|---|
o | 實心圓圈 |
D | 菱形 |
h | 六邊形1 |
H | 六邊形2 |
8 | 八邊形 |
p | 五邊形 |
+ | 加號 |
. | 點 |
s | 正方形 |
* | 星形 |
v | 倒三角形 |
^ | 正三角形 |
> | 一角朝右的三角形 |
< | 一角朝左的三角形 |
線型使用linestyle參數控制
線型值 | 說明 |
---|---|
- | 實線 |
– | 長虛線 |
-. | 短點相間線 |
: | 短虛線 |
代碼示例:
data2 = np.arange(1, 3, 0.3)
plt.plot(data2, marker="x", linestyle='--')
plt.plot(data2+1, marker='o', linestyle=':')
plt.plot(data2+2, color='k', marker='s', linestyle='-.')
輸出結果:
代碼示例:
# 等價于
plt.plot(data2, 'x--', data2+1, 'o:', data2+2, 'ks-.')
輸出結果:
本地保存圖片
想要保存當前生成的圖表,可以調用savefig()函數進行保存。
savefig(*args, **kwargs)
上述函數中,有fname參數——一個包含文件名路徑的字符串,或者是一個類似于Python文件的對象。
如果format參數設為None且fname參數是一個字符串,則輸出格式將根據文件名的擴展名推導出來。
使用savefig()函數將圖片保存在指定的目錄下,具體代碼實現如下(在show()函數錢插入):
data2 = np.arange(1, 3, 0.3)
plt.plot(data2, marker="x", linestyle='--')
plt.plot(data2+1, marker='o', linestyle=':')
plt.plot(data2+2, color='k', marker='s', linestyle='-.')
# 等價于
plt.plot(data2, 'x--', data2+1, 'o:', data2+2, 'ks-.')# 本地保存圖片
plt.savefig(r"D:\數據分析\demo.png")
plt.show()
print("over!")
輸出結果:
在操作完成后使用print(“over!”)輸出上圖結果作為執行結束提示。
可以從相應路徑中打開文件以檢查是否成功保存。