jupyter入門之Matplotlib
一. Matplotlib基礎(chǔ)知識(shí)
- Matplotlib中的基本圖表包括的元素
- x軸和y軸 axis 水平和垂直的軸線
- 軸標(biāo)簽 axisLabel 水平和垂直的軸標(biāo)簽
- x軸和y軸刻度 tick 刻度標(biāo)示坐標(biāo)軸的分隔,包括最小刻度和最大刻度
- x軸和y軸刻度標(biāo)簽 tick label 表示特定坐標(biāo)軸的值
- 繪圖區(qū)域(坐標(biāo)系) axes 實(shí)際繪圖的區(qū)域
- 畫布 figure 呈現(xiàn)所有的坐標(biāo)系
可以用下圖來概括
1.子畫布
依賴導(dǎo)入
import numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplot as plt%matplotlib inline
只含單一曲線的圖
1、可以使用多個(gè)plot函數(shù)(推薦),在一個(gè)圖中繪制多個(gè)曲線
2、也可以在一個(gè)plot函數(shù)中傳入多對X,Y值,在一個(gè)圖中繪制多個(gè)曲線
x = np.arange(0,10,step=1)s1 = Series(x,index=list('abcdefghij'))s2 = Series(x**2,index=s1.index)# 索引和值一起設(shè)置plt.plot(x,x*2,x,x*3,x,x)
設(shè)置子畫布
axes = plt.subplot()
# 221的含義是將畫布分為兩行兩列,# axes1在第一個(gè)位置axes1 = plt.subplot(2,2,1)axes1.plot(x,x**2)# axes2在第四個(gè)位置axes2 = plt.subplot(2,2,4)axes2.plot(x,x**3)
# 子畫布可以按照不同的比例進(jìn)行拆分,可以在一個(gè)版面內(nèi)共存,# 但是,如果兩個(gè)子畫布有重疊部分,后繪制的畫布會(huì)覆蓋先繪制的畫布axes2 = plt.subplot(2,2,1)axes2.plot(x,x**2)axes1 = plt.subplot(3,3,1)axes1.plot(x,x*2)
網(wǎng)格線
2. 繪制正弦余弦
x = np.linspace(0,2*np.pi,100)y1 = np.sin(x)y2 = np.cos(x)# 自動(dòng)選擇最近的畫布進(jìn)行開啟plt.grid(True)plt.plot(x,y1,x,y2)
axes1 = plt.subplot(221)# True 開啟網(wǎng)格線# linewidth設(shè)置網(wǎng)格線的粗細(xì)axes1.grid(True,linewidth=2)axes2 = plt.subplot(222)# alpha設(shè)置透明度 0-1之間的數(shù)axes2.grid(True,alpha=0.5)axes3 = plt.subplot(223)axes3.grid(True,color='green')axes4 = plt.subplot(224)# 設(shè)置網(wǎng)格線方向# linestyle/ls設(shè)置虛線axes4.grid(True,axis='x')
使用plt.grid方法可以開啟網(wǎng)格線,使用plt面向?qū)ο蟮姆椒?,?chuàng)建多個(gè)子圖顯示不同網(wǎng)格線
- lw代表linewidth,線的粗細(xì)
- alpha表示線的明暗程度
- color代表顏色
- axis顯示軸向
坐標(biāo)軸界限
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y1)# 注意:必須x,y軸同時(shí)設(shè)置界限plt.axis([-1,7.2,-2,2])
# 畫圓x = np.linspace(-1,1,100)f = lambda x:(1-x**2)**0.5plt.plot(x,f(x),x,-f(x))# 使用axis函數(shù)設(shè)置坐標(biāo)軸的顯示風(fēng)格plt.axis('equal')
axes = plt.subplot(111)axes.plot(x,f(x),x,-f(x))axes.axis('equal')
xlim方法和ylim方法
除了plt.axis方法,還可以通過xlim,ylim方法設(shè)置坐標(biāo)軸范圍
# 分別設(shè)置x軸和y軸界限plt.plot(x,y2)plt.xlim(-2,20)plt.ylim(-2,2)
面向?qū)ο箫L(fēng)格設(shè)置畫布樣式
axes = plt.subplot(111)axes.plot(x,y2)# 使用面向?qū)ο箫L(fēng)格設(shè)置畫布樣式,如果屬性找不到,就使用set_XX函數(shù)設(shè)置# .+Tab鍵,快捷查看對象屬性和方法axes.set_xlim(-5,5)axes.set_ylim(-5,5)
坐標(biāo)軸標(biāo)簽
xlabel方法和ylabel方法
plt.ylabel(‘y = x^2 + 5’,rotation = 60)旋轉(zhuǎn)
- color 標(biāo)簽顏色
- fontsize 字體大小
- rotation 旋轉(zhuǎn)角度
plt.plot(x,y1)plt.xlabel('x_label',fontsize=35)plt.ylabel('y-label',color='pink',fontsize=40)
axes = plt.subplot(111)axes.plot(x,y1)# HTML支持的字體設(shè)置,在這里都可以使用color fontsize linestyle linewidth# fontsize 字體大小# color 字體顏色# rotation 旋轉(zhuǎn)角度axes.set_ylabel('y_label',fontsize=30,color='red',rotation=90)# 使用字典設(shè)置字體axes.set_xlabel('x_label',fontdict={ 'fontsize':40, 'color':'blue'})
標(biāo)題
plt.title()方法
- loc {left,center,right}
- color 標(biāo)簽顏色
- fontsize 字體大小
- rotation 旋轉(zhuǎn)角度
plt.plot(x,y1)# loc設(shè)置標(biāo)題顯示位置(left,right,center)plt.title('SIN(X)',fontsize=60,color='purple',rotation=45,loc='left')
注:matplotlib顯示中文如何處理?
Windows:
from pylab import mpl# 指定默認(rèn)字體mpl.rcParams['font.sans-serif'] = ['FangSong'] # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題mpl.rcParams['axes.unicode_minus'] = False
Mac:
import numpy as npimport matplotlibimport matplotlib.pyplot as pltfrom matplotlib.font_manager import FontProperties# 導(dǎo)入本地字體文件font = FontProperties(fname='/Library/Fonts/Songti.ttc')# Fixing random state for reproducibilitynp.random.seed(19680801)# 設(shè)置為FALSE 解決負(fù)號(hào)顯示為框的問題matplotlib.rcParams['axes.unicode_minus'] = Falsefig, ax = plt.subplots()ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')# 用fontproperties參數(shù)設(shè)置字體為自定義字體ax.set_title(u'散點(diǎn)圖',fontproperties=font,fontsize=30)plt.show()
3.圖例
原始方法
# 相關(guān)依賴導(dǎo)入...df = DataFrame(data=np.random.randint(0,100,size=(5,3)),columns=list('abc'))df.plot()
legend方法
兩種傳參方法:
- 分別在plot函數(shù)中增加label參數(shù),再調(diào)用legend()方法顯示
- 直接在legend方法中傳入字符串列表
x = np.arange(0,10,step=1)plt.plot(x,x,x,x*2,x,x/2)# 傳入一個(gè)列表參數(shù),參數(shù)內(nèi)容就是每一個(gè)data的說明plt.legend(['fast','normal','slow'])
第二種傳參
plt.plot(x,x,label='normal')plt.plot(x,x*2,label='fast')plt.plot(x,x/2,label='slow')plt.legend(loc=10)
loc參數(shù)
loc參數(shù)用于設(shè)置圖例標(biāo)簽的位置,一般在legend函數(shù)內(nèi)
matplotlib已經(jīng)預(yù)定義好幾種數(shù)字表示的位置
loc參數(shù)可以是2元素的元組,表示圖例左下角的坐標(biāo)
[0,0] 左下
[0,1] 左上
[1,0] 右下
[1,1] 右上
圖例也可以超過圖的界限loc = (-0.1,0.9)
plt.plot(x,x,label='normal')plt.plot(x,x*2,label='fast')plt.plot(x,x/2,label='slow')plt.legend(loc=[0.4,1.1],ncol=3)
ncol參數(shù)
ncol控制圖例中有幾列,在legend中設(shè)置ncol,需要設(shè)置loc
linestyle、color、marker
修改線條樣式
4.保存圖片
使用figure對象的savefig的函數(shù)
filename
含有文件路徑的字符串或Python的文件型對象。圖像格式由文件擴(kuò)展名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
dpi
圖像分辨率(每英寸點(diǎn)數(shù)),默認(rèn)為100
facecolor
圖像的背景色,默認(rèn)為“w”(白色)
# 獲取figure對象(畫布對象)# 設(shè)置畫布的背景色figure = plt.figure(facecolor='cyan')# 設(shè)置坐標(biāo)系的背景色axes = plt.subplot(111,facecolor='blue')# 設(shè)置線條的顏色axes.plot(x,x,x,x*2,color='yellow')# dpi設(shè)置像素大小figure.savefig('18011.png',dpi=50)
二. 設(shè)置plot的風(fēng)格和樣式
plot語句中支持除X,Y以外的參數(shù),以字符串形式存在,來控制顏色、線型、點(diǎn)型等要素,語法形式為: plt.plot(X, Y, ‘format’, …)
1.點(diǎn)和線的樣式
顏色
參數(shù)color或c
plt.plot(x,x,color='c')
常用色彩名與別名
透明度
alpha
plt.plot(x,x,alpha=0.3,color='r')
背景色
設(shè)置背景色,通過plt.subplot()方法傳入facecolor參數(shù),來設(shè)置坐標(biāo)系的背景色
# 設(shè)置坐標(biāo)系的背景plt.subplot(facecolor='red')plt.plot(x,np.sin(x))
線型
參數(shù)linestyle或ls
plt.plot(x,x,ls=':')plt.plot(x,x*2,ls='steps')plt.plot(x,x/2,ls='None')
常用線型
線寬
linewidth或lw參數(shù)
不同寬度的破折線
dashes參數(shù) eg.dashes = [20,50,5,2,10,5]
設(shè)置破折號(hào)序列各段的寬度
# dashes自定義破折線的樣式plt.plot(x,x,dashes=[10,2,3,5])
點(diǎn)型
- marker 設(shè)置點(diǎn)形
- markersize 設(shè)置點(diǎn)形大小
x = np.random.randint(0,10,size=6)plt.plot(x,marker='s',markersize=60)
常用點(diǎn)型參數(shù)設(shè)置
plt.plot(x,marker='4',markersize=30)plt.plot(x,x*2,marker='3',markersize=40)
plt.plot(np.random.randint(0,10,size=10),marker='h',markersize=20,label='六邊形1',)plt.plot(np.random.randint(0,10,size=10),marker='H',markersize=20,label='六邊形2')plt.plot(np.random.randint(0,10,size=10),marker='8',markersize=20,label='八邊形')plt.plot(np.random.randint(0,10,size=10),marker='p',markersize=20,label='五邊形')plt.legend()
標(biāo)記參數(shù)
2.多參數(shù)連用
顏色、點(diǎn)型、線型,可以把幾種參數(shù)寫在一個(gè)字符串內(nèi)進(jìn)行設(shè)置 ‘r-.o’
# 參數(shù)連用需要對不同的線進(jìn)行分別設(shè)置plt.plot(x,x,'r:v',x,x*2,'b--h')
更多點(diǎn)和線的設(shè)置
markeredgecolor = ‘green’,markeredgewidth = 2,markerfacecolor = ‘purple’多個(gè)曲線同一設(shè)置
屬性名聲明,不可以多參數(shù)連用
plt.plot(x1, y1, x2, y2, fmt, …)
x = np.arange(0,10,1)# 統(tǒng)一設(shè)置plt.plot(x,x,x,x*2,x,x/2,linewidth=3,color='blue')# 分別設(shè)置plt.plot(x,x,'r-.s',x,x*2,'b--h')
多曲線不同設(shè)置
多個(gè)都進(jìn)行設(shè)置時(shí),多參數(shù)連用 plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)
三種設(shè)置方式
1.向方法傳入關(guān)鍵字參數(shù)
1. import matplotlib as mpl
2.對實(shí)例使用一系列的setter方法
plt.plot()方法返回一個(gè)包含所有線的列表,設(shè)置每一個(gè)線需要獲取該線對象
- eg: lines = plt.plot(); line = lines[0]
- line.set_linewith()
- line.set_linestyle()
- line.set_color()
3.對坐標(biāo)系使用一系列的setter方法
axes = plt.subplot()獲取坐標(biāo)系
- set_title()
- set_facecolor()
- set_xticks、set_yticks 設(shè)置刻度值
- set_xticklabels、set_yticklabels 設(shè)置刻度名稱
例:
lines = plt.plot(x,x,x,x*2,x,x/2)# 根據(jù)line對象設(shè)置line的屬性lines[0].set_linewidth(3)lines[1].set_color('cyan')lines[2].set_linestyle('--')
X、Y軸坐標(biāo)刻度
plt.xticks()和plt.yticks()方法
- 需指定刻度值和刻度名稱 plt.xticks([刻度列表],[名稱列表])
- 支持fontsize、rotation、color等參數(shù)設(shè)置
x = np.linspace(0,2*np.pi,100)plt.plot(x,np.sin(x))# xticks函數(shù)設(shè)置坐標(biāo)軸刻度和標(biāo)簽plt.xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi],['0','π/2','π','3π/2','2π'])
axes = plt.subplot(111)axes.plot(x,np.sin(x))# 使用畫布對象設(shè)置坐標(biāo)軸刻度和坐標(biāo)軸刻度標(biāo)簽axes.set_xticks([0,np.pi/2,np.pi,3*np.pi/2,2*np.pi])axes.set_xticklabels(['0','$\pi$/2','π','3π/2','2π'],fontsize=20)axes.set_yticks([-1,0,1])axes.set_yticklabels(['min',0,'max'],fontsize=20)
三、2D圖形
1.直方圖
【直方圖的參數(shù)只有一個(gè)x!?。〔幌駰l形圖需要傳入x,y】
hist()的參數(shù)
bins
可以是一個(gè)bin數(shù)量的整數(shù)值,也可以是表示bin的一個(gè)序列。默認(rèn)值為10
normed
如果值為True,直方圖的值將進(jìn)行歸一化處理,形成概率密度,默認(rèn)值為False
color
指定直方圖的顏色。可以是單一顏色值或顏色的序列。如果指定了多個(gè)數(shù)據(jù)集合,顏色序列將會(huì)設(shè)置為相同的順序。如果未指定,將會(huì)使用一個(gè)默認(rèn)的線條顏色
orientation
通過設(shè)置orientation為horizontal創(chuàng)建水平直方圖。默認(rèn)值為vertical
x = np.random.randint(0,100,size=100)plt.hist(x,bins=5)
2. 條形圖
【條形圖有兩個(gè)參數(shù)x,y】
width 縱向設(shè)置條形寬度
height 橫向設(shè)置條形高度
bar()、barh()
x = np.array([2,5,7,9,4,3,8])# x 就是底軸刻度標(biāo)簽# height 就是柱形圖的柱高# width 表示柱寬 (0-1取值)plt.bar(x=list('abcdefg'),height=x,width=1)# y 就是底軸刻度標(biāo)簽# width 就是柱形圖的柱高# height 表示柱寬plt.barh(y=list('abcdefg'),width=x,height=1)
3. 餅圖
【餅圖也只有一個(gè)參數(shù)x!】
pie()
餅圖適合展示各部分占總體的比例,條形圖適合比較各部分的大小
普通部分占滿餅圖
x = [45,6]plt.pie(x)
普通未占滿餅圖
x = [0.4,0.3]plt.pie(x)
餅圖陰影、分裂等屬性設(shè)置labels參數(shù)設(shè)置每一塊的標(biāo)簽;labeldistance參數(shù)設(shè)置標(biāo)簽距離圓心的距離(比例值,只能設(shè)置一個(gè)浮點(diǎn)小數(shù))autopct參數(shù)設(shè)置比例值的顯示格式(%1.1f%%);pctdistance參數(shù)設(shè)置比例值文字距離圓心的距離explode參數(shù)設(shè)置每一塊頂點(diǎn)距圓形的長度(比例值,列表);colors參數(shù)設(shè)置每一塊的顏色(列表);shadow參數(shù)為布爾值,設(shè)置是否繪制陰影startangle參數(shù)設(shè)置餅圖起始角度
# labeldistance只能設(shè)置一個(gè)小數(shù)plt.pie(x,labels=['男','女'],labeldistance=0.3, autopct="%1.2f%%",pctdistance=0.8, explode=[0.1,0.0], colors=['blue','yellow'], startangle=90, shadow=True)
4. 散點(diǎn)圖
【 散點(diǎn)圖需要兩個(gè)參數(shù)x,y,但此時(shí)x不是表示x軸的刻度,而是每個(gè)點(diǎn)的橫坐標(biāo)!】
scatter()
x = np.random.normal(size=1000)y = np.random.normal(size=1000)# 生成1000個(gè)隨機(jī)顏色colors = np.random.random(size=(1000,3))# 使用c參數(shù)來設(shè)置顏色plt.scatter(x,y,marker='d',c=colors)
四.3D圖
曲面圖
導(dǎo)包
from mpl_toolkits.mplot3d.axes3d import Axes3D
使用mershgrid函數(shù)切割x,y軸
X,Y = np.meshgrid(x, y)
創(chuàng)建3d坐標(biāo)系
axes = plt.subplot(projection=’3d’)
繪制3d圖形
p = axes.plot_surface(X,Y,Z,color=’red’,cmap=’summer’,rstride=5,cstride=5)
添加colorbar
plt.colorbar(p,shrink=0.5)
例:
def createZ(x,y): return np.sin(x) + np.cos(y)*2 - np.pi/5from mpl_toolkits.mplot3d.axes3d import Axes3Daxes = plt.subplot(projection='3d')x = np.linspace(-np.pi,np.pi,100)y = np.linspace(-np.pi,np.pi,100)# 使用x,y生成一組網(wǎng)格X,Y = np.meshgrid(x,y)Z = createZ(X,Y)p = axes.plot_surface(X,Y,Z,cmap='summer',rstride=5,cstride=5)plt.colorbar(p,shrink=0.5)
五.玫瑰圖/極坐標(biāo)條形圖
創(chuàng)建極坐標(biāo),設(shè)置polar屬性plt.axes(polar = True)繪制極坐標(biāo)條形圖index = np.arange(-np.pi,np.pi,2*np.pi/6)plt.bar(x=index ,height = [1,2,3,4,5,6] ,width = 2*np.pi/6)
# 玫瑰圖x = np.array([2,5,7,9,4,3,8])plt.axes(polar = True)plt.bar(x=list('abcdefg'),height=x)
六.圖形內(nèi)的文字、注釋、箭頭
1.控制文字屬性的方法
Prop
所有的方法會(huì)返回一個(gè)matplotlib.text.Text對象
# 畫布figure = plt.figure()# figure.text(x=1,y=1,s='這是figure對象的注釋')figure.suptitle('figure title')# 等差數(shù)列x = np.linspace(-np.pi,np.pi,100)axes1 = plt.subplot(221)axes1.plot(x,np.sin(x))# x,y是以坐標(biāo)軸刻度為準(zhǔn)的一組數(shù)據(jù),描述了注釋信息的注釋位置axes1.text(x=0.5,y=0.5,s='這是一段注釋')axes2 = plt.subplot(222)axes2.plot(x,np.cos(x),color='red')
2.圖形內(nèi)的文字
text()
3. 注釋
annotate()
xy參數(shù)設(shè)置箭頭指示的位置xytext參數(shù)設(shè)置注釋文字的位置arrowprops參數(shù)以字典的形式設(shè)置箭頭的樣式width參數(shù)設(shè)置箭頭長方形部分的寬度headlength參數(shù)設(shè)置箭頭尖端的長度,headwidth參數(shù)設(shè)置箭頭尖端底部的寬度shrink參數(shù)設(shè)置箭頭頂點(diǎn)、尾部與指示點(diǎn)、注釋文字的距離(比例值),可以理解為控制箭頭的長度
figure = plt.figure(figsize=(8,6))axes = plt.subplot(111)axes.plot(x,np.sin(x))# s 注釋的文字# xy 箭頭指向的位置# xytext 注釋文字放置的位置# arrowprops沒有arrowstyle鍵的設(shè)置方式axes.annotate(s='this is a annotate',xy=(0.5,0.5),xytext=(0.8,0.8), arrowprops = { 'width':10, 'headlength':12, 'headwidth':15, 'shrink':0.2 })# 使用arrowstyle設(shè)置箭頭樣式axes.annotate(s='this is a good text',xy=(-0.2,-0.2),xytext=(-0.4,-0.6), arrowprops = { 'arrowstyle': 'fancy' })