Matplotlib 詳細繪圖

Galois發表於2020-03-15

pyplot

Matplotlib 庫由各種視覺化類構成,內部結構複雜,受 Matlab 啟發,matplotlib.pyplot 是繪製各類視覺化圖形的命令子庫,相當於快捷方式。

plt.plot() 只有一個輸入列表或陣列時,引數被當作Y軸,X軸以索引自動生成。

當有兩個以上引數時,按照 X 軸和 Y 軸順序繪製資料點。

plt.figure() 設定圖片大小。

plt.savefig() 將輸出圖形儲存為檔案,預設 PNG 格式,可以通過 dpi 修改輸出質量。

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4),dpi=80)
plt.plot([0,2,4,6,8],[3,1,4,5,2])
plt.ylabel('Grade')
plt.axis([-1,10,0,6]) #確定x,y軸的範圍
plt.savefig('test',dpi=600)
plt.show()

pFiCyoWkRa.png!large

pyplot的繪圖區域

plt.subplot(nrows, ncols, plot_number)

在全域性繪圖區域中建立一個分割槽體系,並定位到一個子繪圖區域
plt.subplot(3,2,4) 簡寫形式:plt.subplot(324) 劃分3\times2個區,位於第4個繪圖區。

b1yRO4OqKR.png!large

例:

f(t_1)=e^{t_1}\cos(2\pi t_1)\\{}\\ f(t_2)=\cos(2\pi t_2)

import matplotlib.pyplot as plt
import numpy as np
def f(t):
    return np.exp(-t)*np.cos(2*np.pi*t)
a = np.arange(0,5,0.02)
plt.subplot(211)
plt.plot(a,f(a))
plt.subplot(212)
plt.plot(a,np.cos(2*np.pi*a),color='r', linestyle='--', marker='.') #等價於plt.plot(a,np.cos(2*np.pi*a),'r--.') 
plt.savefig('例1')
plt.show()

BoJBXi46Ev.png!large

pyplot 中的 plt.plot() 函式

plt.plot(x, y, format_string, **kwargs)
x: X軸資料,列表或陣列,可選。
y: Y軸資料,列表或陣列。
format_string: 控制曲線的格式字串,可選。
**kwargs: 第二組或更多(x, y, format_string)。

注意:當繪製多條曲線時,各條曲線的x不能省略。

a = np.arange(10)
plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)
plt.show()

gEIqeWTaux.png!large

format_string: 控制曲線的格式字串,由顏色字元、風格字元和標記字元組成,可選。

顏色字元 說明
‘b’ 藍色
‘g’ 綠色
‘r’ 紅色
‘c’ 青綠色 cyan
‘m’ 洋紅色 magenta
‘y’ 黃色
‘k’ 黑色
‘w’ 白色
‘#008000’ RGB 顏色的 16 進位制碼
‘0.8’ 灰度值字串
線風格字元 說明
‘-‘ 實線
‘–’ 破折線
‘-.’ 點劃線
‘:’ 虛線
‘ ‘ 無線
標記字元 說明
‘.’ 點標記
‘,’ 畫素標記(極小點)
‘o’ 實心圈標記
‘v’ 倒三角標記
‘^’ 上三角標記
‘>’ 右三角標記
‘<’ 左三角標記
‘1’ 下花三角標記
‘2’ 上花三角標記
‘3’ 左花三角標記
‘4’ 右花三角標記
‘s’ 實心方形標記
‘p’ 實心五角標記
‘*‘ 星形標記
‘h’ 豎六邊形標記
‘H’ 橫六邊形標記
‘+’ 十字標記
‘x’ 叉標記
‘D’ 菱形標記
‘d’ 瘦菱形標記
‘|’ 垂直線標記
a = np.arange(10)
plt.plot(a,a*1.5,'go:',a,a*2.5,'rx',a,a*3.5,'^',a,a*4.5,'bd-.')
plt.show()

YtopVbZFK8.png!large

空心圓標記 color 設定為’’

pyplot的中文顯示

pyplot 預設不支援中文顯示,需要 rcParams 修改字型實現

import matplotlib
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('縱軸(值)')
plt.savefig('test',dpi=600)
plt.show()

rcParams 的屬性

屬性 說明
‘font.family’ 用於顯示字型的名字
‘font.style’ 字型風格,正常’normal’或斜體’italic’
‘font.size’ 字型大小,整數字號或者’large’、’x‐small’

rcParams[‘font.family’]

中文字型 說明
‘SimHei’ 中文黑體
‘Kaiti’ 中文楷體
‘LiSu’ 中文隸書
‘FangSong’ 中文仿宋
‘YouYuan’ 中文幼院
‘STSong’ 華文宋體
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['font.size']=20
plt.rcParams['axes.unicode_minus']=False # 解決負號不顯示亂碼問題
a = np.arange(-2*np.pi,2*np.pi,0.02)
plt.xlabel('x軸')
plt.ylabel('y軸')
plt.subplot(111)
plt.plot(a,np.sin(4*a),'--',a,2*np.cos(4*a),'-.',a,3*np.sin(4*a),':',a,4*np.cos(4*a),'-')
plt.show()

1ijVZDmdmn.png!large

方法二:
在有中文輸出的地方,增加一個屬性:fontproperties。

a = np.arange(0,5,0.02)
plt.figure(figsize=(20,8),dpi=80) # 設定圖形大小
plt.xlabel('橫軸:時間',fontproperties='SimHei',fontsize=20)
plt.ylabel('縱軸:振幅',fontproperties='SimHei',fontsize=20)
plt.title('$f(a)=cos(2\pi a)$')
plt.plot(a,np.cos(2*np.pi*a))
plt.savefig('例5',dpi=600)
plt.show()

V4RCyei2Pe.png!large

刻度,標籤,圖例

  • 設定刻度範圍
plt.axis()
plt.xlim(), plt.ylim()
ax.set_xlim(), ax.set_ylim()
  • 設定顯示的刻度
plt.xticks(), plt.yticks()
ax.set_xticks(), ax.set_yticks()
  • 設定刻度標籤
plt.xticklabels(), plt.yticklabels()
ax.set_xticklabels(), ax.set_yticklabels()
  • 設定座標軸標籤
plt.xlabel(), plt.ylabel()
ax.set_xlabel(), ax.set_ylabel()
  • 設定標題
plt.title()
ax.set_title()
  • 圖例
ax.plot(label= '圖例')
ax.legend(), plt.legend()
LOC = 'best' # 自動選擇放置圖例最佳位置
# 'upper right': 1, 'upper left': 2, 'lower left': 3, 'lower right': 4
#劃分子區域並例項化
fig, ax = plt.subplots(1)
#繪圖
ax.plot(np.random.randn(1000).cumsum(), label='line0')
ax.plot(np.random.randn(1000).cumsum(), label='line1')
ax.plot(np.random.randn(1000).cumsum(), label='line2')
# 設定刻度
#plt.xlim([0,500])
ax.set_xlim([0, 600])

# 設定顯示的刻度
#plt.xticks([0,500])
ax.set_xticks(range(0,500,100))

# 設定刻度標籤
ax.set_yticklabels(['Jan', 'Feb', 'Mar'])

# 設定座標軸標籤
ax.set_xlabel('Number')
ax.set_ylabel('Month')

# 設定標題
ax.set_title('Example')

# 圖例

ax.legend()
ax.legend(loc='best')
#plt.legend()

YtrwQiQEHB.png!large

pyplot的文字顯示

函式 說明
plt.xlabel() 對X軸增加文字標籤
plt.ylabel() 對Y軸增加文字標籤
plt.title() 對圖形整體增加文字標籤
plt.text() 在任意位置增加文字
plt.annotate() 在圖形中增加帶箭頭的註解
a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a))
#plt.axis([-1,6,-2,2]) #設定x和y刻度範圍
plt.xlim([-1,6]) #設定x刻度範圍
plt.ylim([-2,2]) #設定y刻度範圍
plt.xticks(np.arange(-1,6,1)) #設定顯示的刻度
plt.yticks(np.arange(-2,2,1))
plt.xlabel('橫軸:時間',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('縱軸:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波例項 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.text(2,1.2,'$\mu=100$',fontsize=15)
plt.grid(alpha=0.6,linestyle='--',color='yellow') #調整網格透明度
plt.savefig('例6')
plt.show()

Db1f475aOW.png!large

a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a),color='c',linestyle='--',linewidth=1.5)
plt.axis([-1,6,-2,2])
plt.xticks(np.arange(-1,6,1))
plt.yticks(np.arange(-2,2,1))
plt.xlabel('橫軸:時間',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('縱軸:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波例項 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.annotate('$\mu=100$',xy=(2,1),xytext=(3,1.5),fontsize=15
             ,arrowprops=dict(facecolor='black',shrink=0.1,width=1))
plt.grid(alpha=0.6,linestyle='--',color='yellow')
plt.savefig('例6-1')
plt.show()

zcQDZqJiUw.png!large

pyplot的基本圖表函式

函式 說明
plt.plot(x, y, fmt, …) 繪製一個座標圖
plt.boxplot(data, notch, position) 繪製一個箱形圖
plt.bar(left, height, width, bottom) 繪製一個條形圖
plt.barh(width, bottom,left, height) 繪製一個橫向條形圖
plt.polar(theta, r) 繪製極座標圖
plt.pie(data, explode) 繪製餅圖
plt.psd(x, NFFT=256, pad_to, Fs) 繪製功率譜密度圖
plt.specgram(x, NFFT=256, pad_to, F) 繪製譜圖
plt.cohere(x, y, NFFT=256, Fs) 繪製 X‐Y 的相關性函式
plt.scatter(x, y) 繪製散點圖,其中,x 和 y 長度相同
plt.step(x, y, where) 繪製步階圖
plt.hist(x, bins, normed) 繪製直方圖
plt.contour(X, Y, Z, N) 繪製等值圖
plt.vlines() 繪製垂直圖
plt.stem(x, y, linefmt, markerfmt) 繪製柴火圖
plt.plot_date() 繪製資料日期

常見的幾種圖表:

  • 餅圖
  • 直方圖
  • 條形圖
  • 散點圖
  • 折線圖

餅圖

# 設定中文字型和負號正常顯示
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['axes.unicode_minus']=False
matplotlib.rcParams['font.size']=13
"""
繪製餅圖
explode:設定各部分突出
labels:設定各部分標籤
labeldistance:設定標籤文字距圓心位置,1.1表示1.1倍半徑
autopct:設定圓裡面文字
shadow:設定是否有陰影
startangle:起始角度,預設從0開始逆時針轉
pctdistance:設定圓內文字距圓心距離
"""
labels = ['衣', '食', '住', '行']
sizes = [14.55,30.45,45,10]
colors = ['red', 'yellow', 'lightskyblue', 'green']
explode = (0, 0.1, 0, 0)
# 設定圖片大小
plt.figure(figsize=(7, 4), dpi=80)
# 繪製餅狀圖圖
plt.pie(sizes, labels=labels, colors=colors, explode=explode,labeldistance = 1.1, pctdistance = 0.6,autopct='%.2f%%', shadow=False, startangle=90)
plt.axis('equal') #使餅狀圖的xy軸長度相等
plt.legend(loc='best')
plt.savefig('餅狀圖')
plt.show()

nuc0TQVdC3.png!large

直方圖

np.random.seed(0)
mu,sigma = 100,20
data = np.random.normal(mu,sigma,size=100)
"""
繪製直方圖
data:必選引數,繪圖資料
bins:直方圖的長條形數目,可選項,預設為10
normed:是否將得到的直方圖向量歸一化,可選項,預設為0,代表不歸一化,顯示頻數。normed=1,表示歸一化,顯示頻率。
facecolor:長條形的顏色
edgecolor:長條形邊框的顏色
alpha:透明度
histtype:直方圖型別:'bar', 'barstacked','step', 'stepfilled'
"""
plt.hist(data, bins=20, normed=0, histtype='bar', facecolor='g',edgecolor="black", alpha=0.6)
# 顯示橫軸標籤
plt.xlabel("區間", fontproperties='SimHei', fontsize=12)
# 顯示縱軸標籤
plt.ylabel("頻數/頻率", fontproperties='SimHei', fontsize=12)
# 顯示圖示題
plt.title('頻數/頻率分佈直方圖', fontproperties='SimHei')
plt.savefig('直方圖')
plt.show()

QFo4io6Ikr.png!large

條形圖的繪製

matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015', '2016', '2017', '2018'] #橫座標刻度顯示值
num_list1=[20,30,15,35] # 縱軸座標值1
num_list2=[15,30,40,20] #縱軸座標值2
x = range(len(num_list1))
"""
繪製條形圖
x:長條形中點橫座標
height:長條形高度
width:長條形寬度,預設值0.8
label:為後面設定legend準備
"""
plt.figure(figsize=(8, 5), dpi=80)
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.7, color='red', label='測量部')
rects2 = plt.bar([i+0.4 for i in x], height=num_list2, width=0.4, alpha=0.7, color='blue', label='人事部')
plt.ylim(0, 50)
plt.ylabel('人數')
"""
設定x軸刻度顯示值
引數一:中點座標
引數二:顯示值
"""
plt.xticks([index+0.2 for index in x], label_list)
plt.xlabel('年份')
plt.title('某測繪公司')
#編輯文字
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2, height+1, str(height), ha='center', va='bottom')
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2, height+1, str(height), ha='center', va='bottom')
plt.legend()
plt.savefig('條形圖')
plt.show()

9av8C2e0HJ.png!large

水平條形圖的繪製
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

price = [39.5,44.2,36.7,38.9,33.33]
"""
繪製水平條形圖方法barh
引數一:y軸
引數二:x軸
"""
plt.figure(figsize=(8, 5), dpi=80)
_price = plt.barh(range(5),price, height=0.6, color='cyan', alpha=0.7)
plt.yticks(range(5), ['亞馬遜','噹噹網','中國圖書網','京東','天貓圖書'])
plt.xlim(30, 47)
plt.xlabel('價格')
plt.title('不同平臺的圖書價格')
plt.grid(alpha=0.2)
#編輯文字
for x in _price:
    width = x.get_width()
    plt.text(width+1, x.get_y()+x.get_height()/2, str(width), ha='center', va='center')
plt.savefig('水平條形圖')
plt.show()

cqNvwkZry4.png!large

堆疊條形圖的繪製

matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015', '2016', '2017', '2018'] #橫座標刻度顯示值
num_list1=[20,30,15,35] # 縱座標值1
num_list2=[15,30,40,20] #軸座標值2
x = range(len(num_list1))
"""
繪製條形圖
x:長條形中點橫座標
height:長條形高度
width:長條形寬度,預設值0.8
label:為後面設定legend準備
"""
plt.figure(figsize=(8, 6), dpi=80)
rects1 = plt.bar(x, height=num_list1, width=0.6, alpha=0.7, color='red', label='測量部')
rects2 = plt.bar([i for i in x], height=num_list2, width=0.6, alpha=0.7, color='blue', label='人事部', bottom=num_list1)
plt.ylim(0, 90)
plt.yticks(np.arange(0, 90, 15))
plt.ylabel('人數')
"""
設定x軸刻度顯示值
引數一:中點座標
引數二:顯示值
"""
plt.xticks([index for index in x],label_list)
plt.xlabel('年份')
plt.title('某測繪公司')
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('堆疊條形圖')
plt.show()

JJFpgNbB7V.png!large

散點圖的繪製

方法一:使用plt.scatter()函式

plt.figure(figsize=(10, 4),dpi=80)
np.random.seed(1)
a=10 * np.random.randn(100)
b=10 * np.random.randn(100)
plt.scatter(a, b, c='red', marker='o', alpha=0.8)
plt.scatter(0.8*a, 2*b, c='cyan', marker='^')
plt.title('scatter1')
plt.savefig('scatter1')
plt.show()

Fq5z4CrTjz.png!large

方法二:使用plt.plot()函式

plt.figure(figsize=(10, 4),dpi=80)
np.random.seed(1)
a=10 * np.random.randn(100)
b=10 * np.random.randn(100)
c=10 * np.random.randn(100)
d=10 * np.random.randn(100)
plt.plot(a, b, 'go', c, d, 'b^')
plt.title('scatter2')
plt.savefig('scatter2')
plt.show()

hKGVFoSoBw.png!large

折線圖的繪製

注意:使用plt.plot()函式,若離散的 y 與 x 的長度相同;若 y 為連續函式則可以與 x 長度不同。

matplotlib.rcParams['font.family']='SimHei'
a=np.arange(0, 30, 1)
print(a)
data=np.random.uniform(0, 30, 30).reshape(30)
print(data)
data0=np.random.uniform(0, 30, 30).reshape(30)
print(data0)
plt.plot(a, data, 'g--*', a, data0,'r:.')
plt.ylabel('y')
plt.savefig('plot', dpi=600)
plt.show()

uqyGLyTPpt.png!large

本作品採用《CC 協議》,轉載必須註明作者和本文連結

不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章