Python數據可視化神器——Matplotlib

Python數據可視化神器——Matplotlib

來自專欄 大數據轉行學習筆記

1.Matplotlib簡介

Matplotlib庫由各種可視化類構成,內部結構複雜。

matplotlib.pyplot是繪製各種可視化圖形的命令子庫,相當於快捷方式

import matplotlib.pyplot as plt

2.圖形繪製plt.plot

import matplotlib.pyplot as pltplt.plot([3,1,4,5,2]) #輸入一個含5個元素的列表plt.ylabel(grade) #定義y軸為『gread』plt.savefig(test,dpi=600) #輸出文件,文件名為『test』plt.show() #顯示圖形

plt.plot()中輸入一維列表或數組時,其數值為y軸上的數,x軸上的數自動對應其索引

plt.savefig()將輸出圖形存儲為文件,默認PNG格式,通過dpi修改輸出質量

plt.plot([0,2,4,6,8],[1,5,4,6,2])plt.ylabel=(grade)plt.axis([-1,10,0,6]) #x軸為-1到10,y軸為0到6plt.show()

plot.plot(x,y)中x列表為x軸上的數,y列表為對應x軸位置上y軸的數

plot.axis()參數一定為一個四元素列表,前兩個數為x軸左右範圍,後兩個為y軸上下範圍。

3.pyplot的繪圖區域

plt.subplot(nrows,ncols,plot_number)是最簡單的分割繪圖區域的方法

nrows:橫軸數量

ncols:縱軸數量

plot_number:當前繪圖區域

plt.subplot(3,2,4)

import numpy as npimport matplotlib.pyplot as pltdef f(t): #定義一個能量衰減函數 return np.exp(-t)*np.cos(2*np.pi*t) #調用numpy中的exp和cos函數def g(t): return np.cos(2*np.pi*t)a=np.arange(0.0,5.0,0.02) #使用numpy生成一個數組a,0.0到5.0之間每隔0.02生成一個數 plt.subplot(2,1,1) #生成一個2個橫軸的繪圖區域,打開第一個繪圖區域plt.plot(a,f(a)) #橫軸為a,縱軸為f(a)plt.subplot(2,1,2) #打開第二個繪圖區域plt.plot(a,g(a),r--) #橫軸為a,縱軸為g(a),r--表示用虛線畫plt.show()

4.使用plt.plot()繪製多條曲線

import numpy as npimport matplotlib.pyplot as plta=np.arange(10)plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)plt.show()

我們還可以修改下列參數:

import numpy as npimport matplotlib.pyplot as plta=np.arange(10)plt.plot(a,a*1.5,go-,a,a*2.5,rx.,a,a*3.5,*,a,a*4.5,b-)plt.show()

修改後圖線為:

go-:綠色、實心圓標記、實線

rx:紅色、x標記

*:*標記

b-:藍色、實線

此外,我們還可以增加更多的關鍵字參數來修改每一個參數:

5.pyplot中的中文顯示

pyplot並不支持中文顯示,我們可以採取以下方法顯示中文:

方法一、用rcParams修改字體

import matplotlib.pyplot as pltimport matplotlibmatplotlib.rcParams[font.family]=SimHei #使用SimHei字體,即中文的黑體plt.plot([3,1,4,5,2])plt.ylabel(縱軸(值))plt.savefig(test,dpi=600)plt.show()

rcParams的屬性如下:

基本中文字體種類:

我們來畫一段中文標記橫軸和縱軸的cos函數:

import numpy as npimport matplotlib.pyplot as pltimport matplotlibmatplotlib.rcParams[font.family]=SimHei #字體為宋體matplotlib.rcParams[font.size]=20 #字型大小為20a=np.arange(0.0,5.0,0.02)plt.xlabel(橫軸:時間)plt.ylabel(縱軸:振幅)plt.plot(a,np.cos(2*np.pi*a),r--)plt.show()

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

import numpy as npimport matplotlib.pyplot as plta=np.arange(0.0,5.0,0.02)plt.xlabel(橫軸:時間,fontproperties=SimHei,fontsize=20)plt.ylabel(縱軸:振幅,fontproperties=SimHei,fontsize=20)plt.plot(a,np.cos(a*np.pi*2),r--)plt.show()

這種方法只對局部需要中文的地方進行修改,不影響整體。

6.pyplot的文本顯示

pyplot的文本顯示函數如下:

import numpy as npimport matplotlib.pyplot as plta=np.arange(0.0,5.0,0.02)plt.plot(a,np.cos(a*np.pi*2),r--)plt.xlabel(橫軸:時間,fontproperties=SimHei,fontsize=15)plt.ylabel(縱軸:振幅,fontproperties=SimHei,fontsize=15)plt.title(r正弦波實例$y=cos(2pi x)$,fontproperties=SimHei,fontsize=25)plt.text(2,1,r$mu=100$,fontsize=15)plt.axis([-1,6,-2,2])plt.grid(True)plt.show()

文本顯示還有一種函數:plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)

s:要註解的字元串

xy:箭頭所在的位置

xytext:文本顯示的位置

arrowprops:字典類型,定義整個箭頭顯示的一些屬性

import numpy as npimport matplotlib.pyplot as plta=np.arange(0.0,5.0,0.02)plt.plot(a,np.cos(a*np.pi*2),r--)plt.xlabel(橫軸:時間,fontproperties=SimHei,fontsize=15)plt.ylabel(縱軸:振幅,fontproperties=SimHei,fontsize=15)plt.title(r正弦波實例$y=cos(2pi x)$,fontproperties=SimHei,fontsize=25)plt.annotate(r$mu=100$,xy=(2,1),xytext=(3,1.5),arrowprops=dict(facecolor=black,shrink=0.1,width_=2))plt.axis([-1,6,-2,2])plt.grid(True)plt.show()

shrink設置為0.1,使箭頭和(2,1)位置有一些距離。

7.pyplot子繪圖區域的設計方法

我們現在想繪製下圖這種複雜的子繪圖區域:

僅僅使用subplot方法是不行的,需要使用plt.subplot2grid()來輔助完成。

plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)

plt.subplot2grid((3,3),(0,0),colspan=3) #對應ax1plt.subplot2grid((3,3),(1,0),colspan=2) #對應ax2plt.subplot2grid((3,3),(1,2),rowspan=2) #對應ax3plt.subplot2grid((3,3),(2,0)) #對應ax4plt.subplot2grid((3,3),(2,1)) #對應ax5

我們拿ax2區域來舉例:(3,3)意味著將整塊區域分為三行三列共九個區域,(1,0)意味著選縱向第二橫向第1個區域(ax2的左半邊),colspan=2意味著長度為2。

我們也可以寫成這樣:

gs=gridspec.GridSpec(3,3)ax1=plt.subplot(gs[0,:])ax2=plt.subplot(gs[1,:-1])ax3=plt.subplot(gs[1:,-1])ax4=plt.subplot(gs[2,0])ax5=plt.subplot(gs[2,1])

使用gridspec.sGridSpec()和plt.subplot()也能達到上述效果。

8.常用的pyplot圖標函數

使用matplotlib庫我們最重要的是找到最合適的可視化方法(例如衰減圖用坐標軸表示)

在這裡現介紹幾種常用的圖形。

餅圖:

import matplotlib.pyplot as pltlabels=Frogs,Hogs,Dogs,Logs #設置每個標籤的名稱sizes=[15,30,45,10] #設置每個標籤的比例explode=(0,0.1,0,0) #將第二塊突出出來,突出程度為0.1plt.pie(sizes,explode=explode,labels=labels,autopct=%1.1f%%, shadow=False,startangle=90) plt.show()

autopct表示百分數的表示方法

shadow為False時為無陰影二維餅圖,為True時是有陰影的

startangle表示餅圖起始的角度

我們現在修改下,將圖片繪製為標準的圓形:

plt.axis(equal)

直方圖:

import numpy as npimport matplotlib.pyplot as pltnp.random.seed(0) #設置一個隨機種子0mu,sigma=100,20 #均值為100,方差為20a=np.random.normal(mu,sigma,size=100) #生成數組aplt.hist(a,20,normed=1,histtype=stepfilled,facecolor=b,alpha=0.75) #生成直方圖plt.title(Histogram) #設置標題名稱plt.show()

plt.hist(a,20,normed=1,histtype=stepfilled,facecolor=b,alpha=0.75):

a為數組a

20為直方的個數,改成10或40的結果如下:

normed=1意味著縱坐標代表出現頻率,normed=0意味著縱坐標代表出現個數:

histtype為直方圖的類型,facecolor為顏色,alpha為透明度。

極坐標圖

極坐標圖是類似於下圖這樣的圖形:

這裡我們採用面向對象的方法繪製

import numpy as npimport matplotlib.pyplot as pltN=20 #極坐標圖中數據的個數為20theta=np.linspace(0.0,2*np.pi,N,endpoint=False) #從0到360°(2*π)等分出N個不同的角度radii=10*np.random.rand(N) #隨機生成每個角度對應的值width_=np.pi/4*np.random.rand(N) #設置每個值的寬度ax=plt.subplot(111,projection=polar) #生成一個繪圖區域,projection設為極坐標圖bars=ax.bar(theta,radii,width_=width,bottom=0.0)for r,bar in zip(radii,bars): bar.set_facecolor(plt.cm.viridis(r/10.)) bar.set_alpha(0.5)plt.show()

np.random.rand(N)意為在[0,1)之間隨機生成N個數。

ax.bar(theta,radii,width_=width,bottom=0.0)中,theta對應left,radii對應hight,width對應width

散點圖

import numpy as npimport matplotlib.pyplot as pltfig,ax=plt.subplots() #生成一個繪圖區域ax.plot(10*np.random.randn(100),10*np.random.randn(100),o)ax.set_title(Simple Scatter)plt.show()

ax為當前繪圖區域繪圖對象

『o』為實心圓點。

以上只是簡單介紹了一些常用的matplotlib方法,數量掌握的話還要自己多敲多用多背,關於numpy,pandas等更詳細的資料建議學習經典的:《利用Python進行數據分析·第2版》第5章 pandas入門


推薦閱讀:

【Python3網路爬蟲開發實戰】1.4.1-MySQL的安裝
Python每日一練0023
不再寫 for 循環
python要學到一個什麼樣的程度能找到個一般的工作?
數據分析基本流程的實例展示

TAG:可視化 | 數據可視化 | Python |