Matplotlib基礎(chǔ)教程

matplotlib

pyplot

Matplotlib庫(kù)由各種可視化類(lèi)構(gòu)成,內(nèi)部結(jié)構(gòu)復(fù)雜,受Matlab啟發(fā)

matplotlib.pyplot是繪制各類(lèi)可視化圖形的命令子庫(kù),相當(dāng)于快捷方式

測(cè)試小實(shí)例

plt.plot() 只有一個(gè)輸入列表或數(shù)組時(shí),參數(shù)被當(dāng)作Y軸,X軸以索引自動(dòng)生成

當(dāng)有兩個(gè)以上參數(shù)時(shí),按照X軸和Y軸順序繪制數(shù)據(jù)點(diǎn)

plt.figure() 設(shè)置圖片大小

plt.savefig() 將輸出圖形存儲(chǔ)為文件,默認(rèn)PNG格式,可以通過(guò)dpi修改輸出質(zhì)量

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()
test.png
pyplot的繪圖區(qū)域

plt.subplot(nrows, ncols, plot_number)

在全局繪圖區(qū)域中創(chuàng)建一個(gè)分區(qū)體系,并定位到一個(gè)子繪圖區(qū)域
plt.subplot(3,2,4) 簡(jiǎn)寫(xiě)形式:plt.subplot(324) 劃分3*2個(gè)區(qū),位于第4個(gè)繪圖區(qū)

繪圖區(qū)域.png

例1
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='.') #等價(jià)于plt.plot(a,np.cos(2*np.pi*a),'r--.') 
plt.savefig('例1')
plt.show()
例1.png
pyplot中的plt.plot()函數(shù)
plt.plot(x, y, format_string, **kwargs)
x : X軸數(shù)據(jù),列表或數(shù)組,可選
y : Y軸數(shù)據(jù),列表或數(shù)組
format_string: 控制曲線(xiàn)的格式字符串,可選
**kwargs : 第二組或更多(x,y,format_string)

注意:當(dāng)繪制多條曲線(xiàn)時(shí),各條曲線(xiàn)的x不能省略。

例2

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

format_string: 控制曲線(xiàn)的格式字符串,由顏色字符、風(fēng)格字符和標(biāo)記字符組成,可選

顏色字符.png

風(fēng)格字符.png

標(biāo)記字符.png
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()
例子2-1.png
pyplot的中文顯示

方法一:

pyplot并不默認(rèn)支持中文顯示,需要rcParams修改字體實(shí)現(xiàn)

例3

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

rcParams的屬性

屬性 說(shuō)明
'font.family' 用于顯示字體的名字
'font.style' 字體風(fēng)格,正常'normal'或 斜體'italic'
'font.size' 字體大小,整數(shù)字號(hào)或者'large'、'x‐small'

rcParams['font.family']

中文字體 說(shuō)明
'SimHei' 中文黑體
'Kaiti' 中文楷體
'LiSu' 中文隸書(shū)
'FangSong' 中文仿宋
'YouYuan' 中文幼圓
'STSong' 華文宋體

例4

matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['font.size']=20
plt.rcParams['axes.unicode_minus']=False # 解決負(fù)號(hào)不顯示亂碼問(wèn)題
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()
例4.png

方法二:

在有中文輸出的地方,增加一個(gè)屬性:fontproperties

例5

a = np.arange(0,5,0.02)
plt.figure(figsize=(20,8),dpi=80) # 設(shè)置圖形大小
plt.xlabel('橫軸:時(shí)間',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()
例5.png
刻度,標(biāo)簽,圖例
  • 設(shè)置刻度范圍

    plt.axis()

    plt.xlim(),plt.ylim()

    ax.set_xlim(),ax.set_ylim()

  • 設(shè)置顯示的刻度

    plt.xticks(),plt.yticks()

    ax.set_xticks(),ax.set_yticks()

  • 設(shè)置刻度標(biāo)簽

    plt.xticklabels(),plt.yticklabels()

    ax.set_xticklabels(),ax.set_yticklabels()

  • 設(shè)置坐標(biāo)軸標(biāo)簽

    plt.xlabel(),plt.ylabel()

    ax.set_xlabel(),ax.set_ylabel()

  • 設(shè)置標(biāo)題

    plt.title()

    ax.set_title()

  • 圖例

    ax.plot(label= '圖例')

    ax.legend(),plt.legend()

    LOC = 'best':自動(dòng)選擇放置圖例最佳位置

    'upper right' : 1,'upper left' : 2,'lower left' : 3,'lower right' :4

#劃分子區(qū)域并實(shí)例化
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')
# 設(shè)置刻度
#plt.xlim([0,500])
ax.set_xlim([0, 600])

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

# 設(shè)置刻度標(biāo)簽
ax.set_yticklabels(['Jan', 'Feb', 'Mar'])

# 設(shè)置坐標(biāo)軸標(biāo)簽
ax.set_xlabel('Number')
ax.set_ylabel('Month')

# 設(shè)置標(biāo)題
ax.set_title('Example')

# 圖例

ax.legend()
ax.legend(loc='best')
#plt.legend()
例6-0.png

pyplot的文本顯示

函數(shù) 說(shuō)明
plt.xlabel() 對(duì)X軸增加文本標(biāo)簽
plt.ylabel() 對(duì)Y軸增加文本標(biāo)簽
plt.title() 對(duì)圖形整體增加文本標(biāo)簽
plt.text() 在任意位置增加文本
plt.annotate() 在圖形中增加帶箭頭的注解

例6

a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a))
#plt.axis([-1,6,-2,2]) #設(shè)置x和y刻度范圍
plt.xlim([-1,6]) #設(shè)置x刻度范圍
plt.ylim([-2,2]) #設(shè)置y刻度范圍
plt.xticks(np.arange(-1,6,1)) #設(shè)置顯示的刻度
plt.yticks(np.arange(-2,2,1))
plt.xlabel('橫軸:時(shí)間',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('縱軸:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波實(shí)例 $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') #調(diào)整網(wǎng)格透明度
plt.savefig('例6')
plt.show()
例6.png

例6-1

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('橫軸:時(shí)間',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('縱軸:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波實(shí)例 $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()
例6-1.png

pyplot的基本圖表函數(shù)

函數(shù) 說(shuō)明
plt.plot(x,y,fmt,…) 繪制一個(gè)坐標(biāo)圖
plt.boxplot(data,notch,position) 繪制一個(gè)箱形圖
plt.bar(left,height,width,bottom) 繪制一個(gè)條形圖
plt.barh(width,bottom,left,height) 繪制一個(gè)橫向條形圖
plt.polar(theta, r) 繪制極坐標(biāo)圖
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的相關(guān)性函數(shù)
plt.scatter(x,y) 繪制散點(diǎn)圖,其中,x和y長(zhǎng)度相同
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() 繪制數(shù)據(jù)日期

常見(jiàn)的幾種圖表:

  • 餅狀圖:用扇形的面積,也就是圓心角的度數(shù)來(lái)表示數(shù)量。

    特點(diǎn):顯示一個(gè)數(shù)據(jù)系列中各項(xiàng)的大小與各項(xiàng)總和的比例。

  • 直方圖:由一系列高度不等的縱向條紋或線(xiàn)段表示數(shù)據(jù)分布的情況。

    一般用橫軸表示數(shù)據(jù)范圍,縱軸表示分布情況。

    特點(diǎn):繪制連續(xù)性的數(shù)據(jù),展示一組或者多組數(shù)據(jù)的分布狀況(統(tǒng)計(jì))

  • 條形圖:排列在工作表的列或行中的數(shù)據(jù)可以繪制到條形圖中。

    特點(diǎn):繪制連離散的數(shù)據(jù),能夠一眼看出各個(gè)數(shù)據(jù)的大小,比較數(shù)據(jù)之間的差別。(統(tǒng)計(jì))

  • 散點(diǎn)圖:用兩組數(shù)據(jù)構(gòu)成多個(gè)坐標(biāo)點(diǎn),考察坐標(biāo)點(diǎn)的分布,判斷兩變量之間是否存在某種關(guān)聯(lián)或總結(jié)坐標(biāo)點(diǎn)的分布模式。

    特點(diǎn):判斷變量之間是否存在數(shù)量關(guān)聯(lián)趨勢(shì),展示離群點(diǎn)(分布規(guī)律)

  • 折線(xiàn)圖:以折線(xiàn)的上升或下降來(lái)表示統(tǒng)計(jì)數(shù)量的增減變化的統(tǒng)計(jì)圖

    特點(diǎn):能夠顯示數(shù)據(jù)的變化趨勢(shì),反映事物的變化情況。(變化)

餅狀圖的繪制
# 設(shè)置中文字體和負(fù)號(hào)正常顯示
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['axes.unicode_minus']=False
matplotlib.rcParams['font.size']=13
"""
繪制餅圖
explode:設(shè)置各部分突出
labels:設(shè)置各部分標(biāo)簽
labeldistance:設(shè)置標(biāo)簽文本距圓心位置,1.1表示1.1倍半徑
autopct:設(shè)置圓里面文本
shadow:設(shè)置是否有陰影
startangle:起始角度,默認(rèn)從0開(kāi)始逆時(shí)針轉(zhuǎn)
pctdistance:設(shè)置圓內(nèi)文本距圓心距離
"""
labels = ['衣','食','住','行']
sizes = [14.55,30.45,45,10]
colors = ['red','yellow','lightskyblue','green']
explode = (0,0.1,0,0)
# 設(shè)置圖片大小
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軸長(zhǎng)度相等
plt.legend(loc='best')
plt.savefig('餅狀圖')
plt.show()

餅狀圖.png
直方圖的繪制
np.random.seed(0)
mu,sigma = 100,20
data = np.random.normal(mu,sigma,size=100)
"""
繪制直方圖
data:必選參數(shù),繪圖數(shù)據(jù)
bins:直方圖的長(zhǎng)條形數(shù)目,可選項(xiàng),默認(rèn)為10
normed:是否將得到的直方圖向量歸一化,可選項(xiàng),默認(rèn)為0,代表不歸一化,顯示頻數(shù)。normed=1,表示歸一化,顯示頻率。
facecolor:長(zhǎng)條形的顏色
edgecolor:長(zhǎng)條形邊框的顏色
alpha:透明度
histtype:直方圖類(lèi)型:'bar', 'barstacked','step', 'stepfilled'
"""
plt.hist(data,bins=20,normed=0,histtype='bar',facecolor='g',edgecolor="black",alpha=0.6)
# 顯示橫軸標(biāo)簽
plt.xlabel("區(qū)間",fontproperties='SimHei',fontsize=12)
# 顯示縱軸標(biāo)簽
plt.ylabel("頻數(shù)/頻率",fontproperties='SimHei',fontsize=12)
# 顯示圖標(biāo)題
plt.title('頻數(shù)/頻率分布直方圖',fontproperties='SimHei')
plt.savefig('直方圖')
plt.show()
直方圖.png
條形圖的繪制
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015','2016','2017','2018'] #橫坐標(biāo)刻度顯示值
num_list1=[20,30,15,35] # 縱軸坐標(biāo)值1
num_list2=[15,30,40,20] #縱軸坐標(biāo)值2
x = range(len(num_list1))
"""
繪制條形圖
x:長(zhǎng)條形中點(diǎn)橫坐標(biāo)
height:長(zhǎng)條形高度
width:長(zhǎng)條形寬度,默認(rèn)值0.8
label:為后面設(shè)置legend準(zhǔn)備
"""
plt.figure(figsize=(8,5),dpi=80)
rects1 = plt.bar(x,height=num_list1,width=0.4,alpha=0.7,color='red',label='測(cè)量部')
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('人數(shù)')
"""
設(shè)置x軸刻度顯示值
參數(shù)一:中點(diǎn)坐標(biāo)
參數(shù)二:顯示值
"""
plt.xticks([index+0.2 for index in x],label_list)
plt.xlabel('年份')
plt.title('某測(cè)繪公司')
#編輯文本
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()
條形圖.png
水平條形圖的繪制
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

price = [39.5,44.2,36.7,38.9,33.33]
"""
繪制水平條形圖方法barh
參數(shù)一:y軸
參數(shù)二: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),['亞馬遜','當(dāng)當(dāng)網(wǎng)','中國(guó)圖書(shū)網(wǎng)','京東','天貓圖書(shū)'])
plt.xlim(30,47)
plt.xlabel('價(jià)格')
plt.title('不同平臺(tái)的圖書(shū)價(jià)格')
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()
水平條形圖.png
堆疊條形圖的繪制
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015','2016','2017','2018'] #橫坐標(biāo)刻度顯示值
num_list1=[20,30,15,35] # 縱坐標(biāo)值1
num_list2=[15,30,40,20] #軸坐標(biāo)值2
x = range(len(num_list1))
"""
繪制條形圖
x:長(zhǎng)條形中點(diǎn)橫坐標(biāo)
height:長(zhǎng)條形高度
width:長(zhǎng)條形寬度,默認(rèn)值0.8
label:為后面設(shè)置legend準(zhǔn)備
"""
plt.figure(figsize=(8,6),dpi=80)
rects1 = plt.bar(x,height=num_list1,width=0.6,alpha=0.7,color='red',label='測(cè)量部')
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('人數(shù)')
"""
設(shè)置x軸刻度顯示值
參數(shù)一:中點(diǎn)坐標(biāo)
參數(shù)二:顯示值
"""
plt.xticks([index for index in x],label_list)
plt.xlabel('年份')
plt.title('某測(cè)繪公司')
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('堆疊條形圖')
plt.show()
堆疊條形圖.png
散點(diǎn)圖的繪制

方法一:使用plt.scatter()函數(shù)

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('散點(diǎn)圖1')
plt.savefig('散點(diǎn)圖1')
plt.show()
散點(diǎn)圖1.png

方法二:使用plt.plot()函數(shù)

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('散點(diǎn)圖2')
plt.savefig('散點(diǎn)圖2')
plt.show()
散點(diǎn)圖2.png
折線(xiàn)圖的繪制

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

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('縱軸(值)')
plt.savefig('折線(xiàn)圖',dpi=600)
plt.show()
折線(xiàn)圖.png

參考資料:

網(wǎng)址:https://blog.csdn.net/hohaizx/article/details/79101322

書(shū)籍:《利用python進(jìn)行數(shù)據(jù)分析》

視頻:《黑馬程序員之?dāng)?shù)據(jù)分析》《python數(shù)據(jù)分析與展示》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容