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()
pyplot的繪圖區域
plt.subplot(nrows, ncols, plot_number)
在全域性繪圖區域中建立一個分割槽體系,並定位到一個子繪圖區域plt.subplot(3,2,4)
簡寫形式:plt.subplot(324)
劃分3\times2個區,位於第4個繪圖區。
例:
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()
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()
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()
空心圓標記 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()
方法二:
在有中文輸出的地方,增加一個屬性: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()
刻度,標籤,圖例
- 設定刻度範圍
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()
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()
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()
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()
直方圖
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()
條形圖的繪製
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()
水平條形圖的繪製
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()
堆疊條形圖的繪製
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()
散點圖的繪製
方法一:使用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()
方法二:使用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()
折線圖的繪製
注意:使用
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()
本作品採用《CC 協議》,轉載必須註明作者和本文連結