[python][科學計算][matplotlib]使用指南

jiedawang發表於2019-04-20

最後一次更新日期: 2019/4/20

Matplotlib 是一個 Python 的 2D繪相簿,它以各種硬拷貝格式和跨平臺的互動式環境生成出版質量級別的圖形。

按需匯入以下模組:

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

import numpy as np

點選下方連結可前往各小節

簡要使用教程1 - 繪圖結構 (影像,座標軸/子圖,顯示,儲存)

簡要使用教程2 - 繪圖設定 (投影型別,字型,顏色,標題,座標軸,圖例,標記樣式,線條樣式,透明度,旋轉,子圖佈局)

簡要使用教程3 - 常用繪圖型別(散點圖,曲線圖,曲面圖,條形圖,直方圖,餅圖/環圖,箱線圖,等高線圖,極座標圖)

簡要使用教程4 - 其他繪圖元素(註解,填充,圖片,基本圖形,資料表格)

一. 繪圖結構

返回目錄

1. 影像figure

In [71]: fig=plt.figure(1)
<Figure size 432x288 with 0 Axes>

In [72]: fig=plt.figure(2,figsize=(5,3))
<Figure size 360x216 with 0 Axes>

In [73]: fig.suptitle('title')
Out[73]: Text(0.5,0.98,'title')
複製程式碼

Figure是所有繪圖元素的頂級容器,可以認為是一張畫布,第一個引數num設定影像的編號,第二個figsize引數設定影像大小。

Figure.suptitle方法用於設定影像的總標題(也可通過plt.suptitle設定),fontsize引數可以設定字型大小,xy引數設定位置座標,取值為0.~1.的相對於Figure的寬和高的比例。

Figure上無法直接繪圖,需要至少新增一個Axes,在呼叫plt的靜態方法繪圖時,會繪製在最近宣告的一個Figure上,不顯示宣告則會自動按預設配置建立FigureAxesplt.gcf()方法可以獲取當前正在繪製的Figure

Figure.axes可以獲取影像下的所有AxesFigure.clf()方法可以清空影像。

Artist是matplotlib中所有繪圖物件的基類,Figure也是繼承自該類,可在官方文件檢視到完整的繼承關係。

2. 座標軸axes

x=np.arange(0,720,1)
y1=np.sin(x*np.pi/180)
y2=np.cos(x*np.pi/180)

#方法1
fig=plt.figure(figsize=(7.5,3))
fig.suptitle('sin/cos',fontsize=16)
ax=fig.add_axes((0,0,0.5,0.8),title='ax1')
ax.plot(x,y1)
ax=fig.add_axes((0.6,0,0.5,0.8),title='ax2')
ax.plot(x,y2)
plt.show(fig)
複製程式碼

[python][科學計算][matplotlib]使用指南

#方法2
fig=plt.figure(figsize=(10.5,3))
fig.suptitle('sin/cos',fontsize=16)
ax=fig.add_subplot(121,title='ax1', projection='3d')
ax.plot(x,y1)
ax=fig.add_subplot(122,title='ax2', projection='3d')
ax.plot(x,y2)
plt.show(fig)
複製程式碼

[python][科學計算][matplotlib]使用指南

Axes的意思是用於繪圖的座標軸,AxesSubplot是封裝了Axes的子圖,通過不同的方法建立,子圖在佈局上更方便,繪圖時則沒有明顯的區別,下面會將Axes也稱作子圖。

繪製不同影像會使用不同軸型別,最常用的xy座標軸和xyz座標軸分別為AxesAxes3D。如果只需要一個Axes,可以不顯示宣告,直接呼叫plt的靜態方法繪製,Axes會被自動建立(通過add_subplot(111))。當存在多個Axes時,可以呼叫Axes的方法繪圖以保證影像被繪製在正確的子圖上,呼叫靜態方法繪製時實際上是通過plt.gca()獲取了最後宣告的Axes

Axes.plot是繪圖方法,用於繪製曲線圖。 Axes在繪圖時需要提供x,y兩個軸的座標,而Axes3D需要提供x,y,z三個軸的座標,上方的例子中沒有提供z軸座標所以影像被繪製在高度為0的一個平面上。

Axes是繫結在Figure上的,可通過呼叫Figureadd_axesadd_subplot方法建立新的Axes或是將已有Axes新增到Figure上。兩種方法在子圖的大小和位置的設定上有所區別,需要相應的調整引數。 add_axes方法的第一個引數rect通過一個浮點數序列設定Axes的位置和大小,格式為(left,bottom,width,height),值均為0.~1.的相對於Figure的寬和高的比例。 add_subplot方法的前三個引數分別設定區間劃分的行數、列數、以及子圖的索引,例如2,3,5表示將Figure劃分為2行3列,在其中第5個區間上新增子圖;前三個引數可以替換為單個3位整數表示同一含義,但每位的值不得超過10,例如2,3,5對應235title引數用於設定子圖的標題,也可通過Axes.set_titleplt.title方法設定; projection引數設定投影型別,即座標軸型別,其中,'rectilinear'表示直線(xy)座標軸,也是預設值,'3d'表示3D(xyz)座標軸。

除以上兩種方法,還可使用fig,ax_list = plt.subplots(figsize=(10.5,3),ncols=2,nrows=1)快速規劃畫布,只需要指定畫布大小、列劃分數量和行劃分數量,省去寫迴圈的時間。

get_children方法能夠獲取Axes下的所有繪圖元素; collections屬效能夠獲取所有繪圖元素集合; 如想獲取指定型別的元素,可使用get_xlabel等方法; cla方法可以清除當前軸的內容。

3. 顯示show

plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南

plt.plot(x,y1)
plt.show()
plt.plot(x,y2)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南
[python][科學計算][matplotlib]使用指南
plt.show()方法用於顯示已繪製的影像,一般配合plt的靜態繪圖方法使用(即不顯示宣告Figure的情況)。在使用靜態方法繪圖時,如果不呼叫show,則程式碼段的中所有繪圖元素將會繪製在自動建立的同一Figure的同一Axes上。

在ipython中,直接輸入Figure的變數名也可以將其影像顯示出來;在執行一段含繪圖語句的程式碼段後,也會自動顯示影像。

4. 儲存save

fig.savefig('D:\\test.jpg')
複製程式碼

Figuresavefig方法可以儲存圖片至指定路徑,也可呼叫plt的靜態方法儲存,但必須和繪圖的程式碼一起執行,且必須在show方法之前執行。

ipython中直接右鍵顯示出來的圖片也有儲存的選項。

二. 繪圖設定

返回目錄

1. 投影projection

projection引數用於設定生成的Axes型別,在add_axesadd_subplot等方法中可使用。

常用的幾個型別: 'rectilinear':直線座標軸,即2d的xy座標軸,預設值; '3d':3D的xyz座標軸,繪製3d影像會使用這個,注意,使用該型別前必須先匯入Axes3D'polar':極座標軸。

2. 字型font

plt.rcParams['font.sans-serif']屬性用於設定預設字型,當影像中中文顯示存在問題時,可通過該項將字型設定為支援中文的字型,例如['SimHei']黑體; plt.rcParams['font.size']屬性用於設定預設字型大小。

也可以僅在特定文字上應用字型,fontsize引數設定字型大小,fontproperties引數設定字型,在suptitleset_titletext等用於定義文字顯示的方法中可使用。

當負號無法正常顯示時,設定plt.rcParams['axes.unicode_minus']=False

3. 顏色color

多以colorcolors引數設定主體顏色或顏色序列,簡寫形式c,也有單獨設定某個部分顏色的引數:facecolor設定填充顏色,簡寫形式fcedgecolor設定邊緣顏色,簡寫形式ec

支援多種標識顏色的方式: (1). 以tuple表示的RGB或RGBA值,取值範圍在0.~1.,例如(0.1,0.2,0.5); (2). 以str表示的16進位制的RGB或RGBA值,取值範圍00~FF,例如'#0F0F0F'; (3). 以str表示的顏色標籤,可參考下圖(官方示例)。

[python][科學計算][matplotlib]使用指南

除了單個顏色外,matplotlib還提供了colormap,是特定主題的顏色集合,一般通過cmap引數設定,而預定義的colormap在plt.cm下,可用種類詳見官方文件

4. 標題title

Figure.suptitleplt.suptitle方法用於設定總標題; Axes.set_titleplt.title方法以及建立Axes時的title引數用於設定子標題。

5. 座標軸axis

xlabelylabelzlabel等方法用於設定座標軸的標籤; xticksytickszticks等方法用於設定座標軸的刻度,傳入引數為刻度值列表和刻度標籤列表,第二個引數可以省略,會以刻度值作為標籤文字; xlimylimzlim等方法用於設定座標軸的範圍,傳入引數為開始值和結束值;

axis('off')可以關閉座標軸顯示; 以上方法均可通過Axesplt呼叫。

6. 圖例legend

plt.plot(x,y1,label='sin')
plt.plot(x,y2,label='cos')
plt.legend()
plt.show()
複製程式碼

legend方法用於顯示圖例,繪圖元素必須有標籤才能正常生成圖例,可在繪製影像時通過label引數設定標籤,或是呼叫legend方法時傳入標籤列表。 loc引數設定圖例的位置,預設'best'自動選擇。

7. 標記樣式marker

引數marker設定標記樣式,可選的樣式參考官方文件-markers; 引數smarkersize設定標記大小。

標記樣式可在散點圖、曲線圖等中設定。

8. 線條樣式linestyle

引數linestyle設定線條樣式,一般預設'-'實線,可選的樣式見下方表格; 引數linewidth設定線的寬度,簡寫形式lw

linestyle 說明
'-' or 'solid' 實線
'--' or 'dashed' 虛線
'-.' or 'dashdot' 點劃線
':' or 'dotted' 點虛線
'None' or '' 不繪製

線條樣式在所有含線條的繪圖物件中幾乎都可以設定。

9. 透明度alpha

引數alpha設定點的透明度,一般預設1.,值越小透明度越高。

透明度在所有含平面的繪圖物件中幾乎都可以設定。

10. 旋轉rotation

繪圖元素旋轉

fig=plt.figure(figsize=(4.5,3))
ax=fig.add_axes((0,0,1,1))
ax.plot(x,y1)
for tick in ax.get_xticklabels():
    tick.set_rotation(90)
複製程式碼

部分繪圖元素是支援旋轉的,可通過set_rotation方法設定或是建立時通過rotation引數設定,也有通過angle引數控制旋轉的。

3D影像旋轉

fig=plt.figure(figsize=(12,3))
ax=fig.add_subplot(131,title='ax1',projection='3d')
ax.plot(x,y1)
ax=fig.add_subplot(132,title='ax2',projection='3d')
ax.view_init(30,80)
ax.plot(x,y1)
ax=fig.add_subplot(133,title='ax3',projection='3d')
ax.view_init(60,120)
ax.plot(x,y1)
複製程式碼

[python][科學計算][matplotlib]使用指南
Axes3D的旋轉通過view_init方法實現,第一個引數elev控制縱向的旋轉角度,預設值30;第二個引數azim控制橫向的旋轉角度,預設值120。

11. 子圖佈局調整adjust

#自動收縮佈局
fig.tight_layout()
#調整子圖分佈
fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.1, hspace=0.1)
複製程式碼

三. 常用繪圖型別

返回目錄

1. 散點圖

n = 100
x = np.random.randn(n)
y = np.random.randn(n)
z = np.random.randn(n)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='2d scatter')
ax.scatter(x,y,s=100,c=['g','r','y'],marker='*',alpha=0.5,linewidths=1,edgecolor='k')
ax=fig.add_subplot(122,title='3d scatter',projection='3d')
ax.scatter(x,y,z)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南

scatter方法用於繪製散點圖: 引數s設定點的大小(面積),預設20; 引數c設定點的顏色,可以是單個也可以多個,預設'b'藍色; 引數marker設定點的樣式,預設'o'圓; 引數alpha設定點的透明度,預設1.,值越小透明度越高; 引數linewidths設定邊緣線的寬度,預設None; 引數edgecolor設定邊緣線的顏色,預設None

2. 曲線圖

n = 100
x = np.arange(0,8*n,8)
y = np.sin(x*np.pi/180)
z = np.cos(x*np.pi/180)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='2d plot')
ax.plot(x,y,'g<-',alpha=0.5,linewidth=2, markersize=8)
ax=fig.add_subplot(122,title='3d plot',projection='3d')
ax.plot(x,y,z)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南
plot方法用於繪製散點圖: 引數fmt設定整體樣式,緊跟座標引數之後,是cmarkerlinestyle三個引數的整合,用於快速設定,也可選擇單獨設定這三個引數; 引數c設定線和標記的顏色,只能是單個顏色,預設'b'藍色; 引數marker設定標記樣式,預設None; 引數linestyle設定線條樣式,預設'-'實線; 引數alpha設定點的透明度,預設1.,值越小透明度越高; 引數linewidth設定線的寬度; 引數markersize設定標記的大小。

3. 曲面圖

#曲面圖
n = 480
x = np.arange(n)
y = np.arange(n)
x,y = np.meshgrid(x,y)
z = np.cos(x*np.pi/180)+np.sin(y*np.pi/180)

fig=plt.figure()
ax=fig.add_subplot(111,title='3d surface',projection='3d')
ax.plot_surface(x,y,z,rstride=10,cstride=10,cmap=plt.cm.winter)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南
plot_surface方法用於繪製曲面圖: 引數rstridecstride設定x、y軸方向上的取樣步長,被取樣的資料才會用於曲面的繪製,值越小表示取樣精度越高,繪製的影像越精細,繪製時間也更長,與rcountccount引數不相容; 引數rcountccount設定x、y軸方向上的取樣總數,預設50; 引數cmap設定曲面顏色集,需要是colormap,預設藍色單色漸變; 引數alpha設定點的透明度,預設1.,值越小透明度越高。

繪製曲面圖需要構造xy平面上的網格資料以及對應的z值,可使用numpy的mgrid索引器或meshgrid方法實現。

4. 條形圖

x = np.array([1,2,3,4])
y1 = np.array([4,3,3,1])
y2 = np.array([2,5,1,3])
tick_label = ['a','b','c','d']

fig=plt.figure(figsize=(10,3))
ax=fig.add_subplot(131,title='2d bar')
ax.bar(x+0.15,y1,width=0.3,color='y',label='y1',alpha=0.7, tick_label=tick_label)
ax.bar(x-0.15,y2,width=0.3,color='g',label='y2',alpha=0.7, tick_label=tick_label)
ax.legend()

ax=fig.add_subplot(132,title='2d bar in 3d axes',projection='3d')
ax.bar(x,y1,0,'y',label='y1',edgecolor='k',linewidth=1)
ax.bar(x,y2,1,'y',label='y2',edgecolor='k',linewidth=1)
ax.legend(facecolor='none')

ax=fig.add_subplot(133,title='3d bar',projection='3d')
bar3d1=ax.bar3d(x,0,0,0.5,0.25,y1,label='y1')
bar3d2=ax.bar3d(x,1,0,0.5,0.25,y2,label='y2')
bar3d1._facecolors2d=bar3d1._facecolors3d
bar3d1._edgecolors2d=bar3d1._edgecolors3d
bar3d2._facecolors2d=bar3d2._facecolors3d
bar3d2._edgecolors2d=bar3d2._edgecolors3d
ax.legend()
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南

bar方法用於繪製條形圖(水平條形圖請使用barh):

2D

第一個引數x是條形的橫座標,對齊的基準由align引數設定,預設是與中心對齊; 第二個引數height設定條形的高度; 第三個引數width設定條形的寬度; 第四個引數bottom設定條形底部的起始縱座標,預設0; 引數color設定條形的顏色; 引數tick_label設定橫座標刻度標籤; 引數edge_colorlinewidth設定邊緣線的顏色和粗細; 引數label設定此次繪製的類別標籤; 引數alpha設定點的透明度,預設1.,值越小透明度越高。

2d條形圖在繪製時視需要調整x的值,不然多次繪製的條形會重疊在一起。

2D in Axes3D

第一個引數left設定條形的起始橫座標,相當於2d情況下設定align='edge'; 第二個引數height設定條形的高度,與2d情況下一樣; 第三個引數zs設定z軸的取值; 第四個引數zdir設定作為z軸的軸,預設'z'; 其餘擴充引數和2d的一樣。

3D

第1,2,3個引數x,y,z設定條形的位置座標; 第4,5,6個引數dx,dy,dz設定條形的長寬高; 其餘擴充引數和2d的一樣。

3D條形圖需要顯示圖例時必須為_facecolors2d_edgecolors2d賦值,因為生成圖例使用的是2d的色彩設定,這應該是一個bug。

5. 直方圖

x = np.random.randn(1000)
y = np.random.randn(1000)

fig=plt.figure(figsize=(9,3))
ax=fig.add_subplot(121,title='hist')
result1=ax.hist(x,bins=20,color="g",edgecolor="k",alpha=0.5,density=True)
ax=fig.add_subplot(122,title='hist2d')
result2=ax.hist2d(x,y,bins=20)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南
hist方法用於繪製直方圖: 第1個引數x設定需要統計的資料,y軸資料是統計頻次,自動計算不需要自行設定; 第2個引數bins設定分箱數量,即分成多少個等間隔的統計區間,預設10; 引數colorfacecolor設定條形的顏色;引數edgecolor設定邊緣線的顏色; 引數density設定是否歸一化,False時統計頻次,True時統計概率密度,預設False; 引數alpha設定點的透明度,預設1.,值越小透明度越高。

hist2d方法用於繪製二維直方圖: 第1,2個引數x,y設定需要統計的資料,二維直方圖中統計頻次以顏色來體現; 第3個引數bins設定分箱數量,即分成多少個等間隔的統計區間,預設10,x,y可以分別設定; 引數cmap設定顏色集。

呼叫繪圖方法後會得到返回值:頻次和頻率的統計結果。

6. 餅圖/環圖

x1 = np.array([1,2,3,4])
x1_labels = ['a','b','c','d']
x1_explode = [0.2,0,0,0]
x2 = np.array([2,2,1,5])

fig=plt.figure(figsize=(9,4))
ax=fig.add_subplot(121,title='pie')
ax.pie(x1,explode=x1_explode,labels=x1_labels,shadow=True,autopct='%1.1f%%')
ax=fig.add_subplot(122,title='ring')
ax.pie(x1,radius=1,wedgeprops=dict(width=0.3, edgecolor='w'))
ax.pie(x2,radius=0.7,wedgeprops=dict(width=0.3, edgecolor='w'))
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南

pie方法用於繪製餅圖: 第一個引數x設定每個扇形的比重,會自動計算x/sum(x)應用於繪製,但在sum(x)<1時,不會進行該計算; 第二個引數explode設定每個扇形偏離中心的距離,預設None; 第三個引數labels設定每個扇形的標籤; 第四個引數colors設定顏色序列,繪製扇形時會輪流使用該序列中的顏色; 引數shadow設定是否繪製陰影,預設False; 引數labeldistance設定扇形標籤與中心的距離; 引數radius設定扇形的半徑,預設為1; 引數autopct設定扇形上顯示的資訊,可以是一個字串格式或是一個函式; 引數wedgeprops設定扇形的樣式,其中width是寬度,與radius一致時繪製出來的就是餅圖,小於radius則是環圖,edgecolorlinewidth可以設定邊緣線的顏色和寬度; 引數center設定餅圖的中心,預設(0,0)。

7. 箱線圖

def test_data():
    spread = np.random.rand(50)
    center = np.ones(25) * 0.5
    flier_high = np.random.rand(10)+1
    flier_low = np.random.rand(10)-1
    return np.r_[spread,center,flier_high,flier_low]

x1 = test_data()
x2 = test_data()

fig=plt.figure()
ax=fig.add_subplot(111,title='box')
ax.boxplot([x1,x2],labels=['x1','x2'],widths=0.3)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南
boxplot方法用於繪製箱線圖: 第一個引數x設定用於繪圖的資料,當有多組時可以放在一個list中傳入; 引數labels設定每組資料的類別標籤; 引數width設定圖形的寬度。

8. 等高線圖

x = np.arange(-3,3,0.01)
y = np.arange(-3,3,0.01)
x,y = np.meshgrid(x,y)
z = (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)+1

fig=plt.figure(figsize=(13.5,3))
ax=fig.add_subplot(131,title='2d contourf')
c=ax.contour(x,y,z,colors='k',linewidths=0.5)
ax.clabel(c,fontsize=10)
cf=ax.contourf(x,y,z,cmap='YlOrRd')
cbar=fig.colorbar(cf)

ax=fig.add_subplot(132,title='3d contourf',projection='3d')
ax.contourf(x,y,z,cmap='YlOrRd')
ax.contour(x,y,z,colors='k',linewidths=0.2)

ax=fig.add_subplot(133,title='3d surface with contour',projection='3d')
ax.plot_surface(x,y,z,cmap='YlOrRd',alpha=0.7)
ax.contour(x,y,z,colors='k',linewidths=1)
plt.show()
複製程式碼

[python][科學計算][matplotlib]使用指南

contour方法用於繪製等高線圖: 第1,2,3個引數x,y,z設定用於繪圖的資料,z是高度; 第4個引數levels設定等高線的數量; 引數colors設定等高線使用的顏色序列; 引數linewidths設定等高線的寬度序列; 引數linestyles設定等高線的樣式序列。

contourf方法用於填充等高線圖: 第1,2,3個引數x,y,z設定用於繪圖的資料,z是高度; 第4個引數levels設定等高線的數量; 引數cmap設定用於填充的顏色集; 引數alpha設定點的透明度,預設1.,值越小透明度越高。

clabel方法用於設定等高線標籤; colorbar方法用於設定參考顏色條;

9. 極座標圖

theta=np.linspace(0,2*np.pi,100)

fig=plt.figure(figsize=(10,5))
ax=fig.add_subplot(121,title='polar1',projection='polar')
ax.plot(theta,theta,c='b',lw=2)
ax.set_rmax(theta.max())

ax=fig.add_subplot(122,title='polar2',projection='polar')
ax.plot(theta,theta,c='r',lw=2)
ax.set_rmax(theta.max())
ax.set_rlabel_position(90)
ax.set_theta_offset(np.pi)
ax.set_thetagrids(np.arange(0,360,15))
ax.set_rticks(np.arange(0,6.5,0.5))
ax.set_theta_direction(-1)
複製程式碼

[python][科學計算][matplotlib]使用指南

通過設定projection='polar'建立PolarAxes座標軸,即可實現極座標作圖: set_rmax,set_rmin,set_rlim方法分別可以設定極徑的最大值,最小值,以及範圍; set_rlabel_position方法設定極徑標籤的位置,以角度表示; set_theta_offset方法設定角度的偏移量,以弧度表示; set_thetagrids方法設定角度刻度序列,會影響網格線; set_rticks方法設定極徑刻度序列,會影響網格線; set_theta_direction方法設定角度增長方向。

在呼叫plot等方法繪圖時,原本的xy分別對應到角度和極徑。

四. 其他繪圖元素

返回目錄

1. 註解annotate

fig=plt.figure(figsize=(10,3.5))
ax=fig.add_subplot(121,title='annotate')
ax.scatter([-0.25],[-0.25],s=100)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])

bbox_style = dict(boxstyle="square", fc='white', ec='black',lw=1)
arrow_style = dict(arrowstyle='->',color='black',lw=2)
ax.annotate('This is a dot.',(-0.24,-0.24),(-0.14,0.16),
            arrowprops=arrow_style,bbox=bbox_style,fontsize=15)

ax=fig.add_subplot(122,title='arrow+text')
ax.scatter([-0.25],[-0.25],s=100)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])

ax.arrow(0.09,0.06,-0.25,-0.23,fc='k',ec='k',
         width=0.01,head_width=0.07,head_length=0.07)
ax.text(-0.14,0.16,'This is a dot.',fontsize=15,bbox=bbox_style)
複製程式碼

[python][科學計算][matplotlib]使用指南
annotate方法用於向影像上新增註解: 第一個引數s設定註釋的文字; 第二個引數xy設定要註釋的點位置,tuple型別表示的座標; 第三個引數xytext設定註釋文字的位置,tuple型別表示的座標; 引數xycoordstextcoords設定註釋點位置和文字位置所採用的座標系,預設'data'和資料的座標系一致; 引數arrowprops設定箭頭,dict型別,其中arrowstyle屬性設定樣式,color屬性設定顏色,lw屬性設定箭頭寬度; 以上三個引數具體資訊建議參考官方文件-annotate; 引數bbox設定文字框樣式,dict型別,其中boxstyle屬性設定樣式,fc屬性設定填充顏色,ec屬性設定邊緣顏色,lw屬性設定邊緣線寬度; bbox中的詳細設定建議參考官方文件-Rectangle; 引數fontsize設定字型大小。

註解也可通過arrow+text實現。

arrow方法用於新增箭頭: 第1,2個引數x,y設定箭頭的起始位置; 第3,4個引數dx,dy設定箭頭往xy方向延伸的長度; fc引數設定填充顏色;ec引數設定邊緣顏色; width引數設定箭頭線寬度; head_width引數設定箭頭頭部的寬度; head_length引數設定箭頭頭部的長度。

text方法用於新增文字: 第1,2個引數x,y設定文字的位置; 第3個引數s設定要顯示的文字; 引數fontsize設定字型大小; 引數bbox設定文字框樣式,與annotate相同。

arrow繪製的箭頭在有所傾斜時無法保證頭部的底部與線垂直,對此有要求只能使用annotate

2. 區域填充fill

x=np.arange(0,720,1)
y1=np.sin(x*np.pi/180)
y2=np.cos(x*np.pi/180)

fig=plt.figure(figsize=(10,3.5))
ax=fig.add_subplot(121,title='fill')
ax.plot(x,y1)
ax.plot(x,y2)
ax.fill(x,y1,color='g',alpha=0.3)
ax.fill(x,y2,color='b',alpha=0.3)

ax=fig.add_subplot(122,title='fill between')
ax.plot(x,y1)
ax.plot(x,y2)
ax.fill_between(x,y1,y2,color='g',alpha=0.3)
複製程式碼

[python][科學計算][matplotlib]使用指南
fill方法用於填充多邊形: 第1,2個引數x,y設定邊的xy座標,該繪圖方法不適合填充不封閉的曲線,會如上圖出現無法預估的繪製效果。

fill_between方法用於填充兩條曲線中間的區域: 第1,2,3個引數x,y1,y2設定x座標和兩條曲線的y座標; 第4個引數where設定繪製的橫座標範圍,布林陣列型別,相當於對前三個引數執行索引篩選。

3. 圖片image

from PIL import Image
image1=Image.open('D:\\training_data\\used\\cifar-10-batches-py\\test\\1_貓.png')
image2=Image.open('D:\\training_data\\used\\cifar-10-batches-py\\test\\2_船.png')

fig=plt.figure(figsize=(8,4))
ax=fig.add_subplot(121,title='image1')
ax.imshow(image1)
ax=fig.add_subplot(122,title='image2')
ax.imshow(image2)
複製程式碼

[python][科學計算][matplotlib]使用指南

imshow用於顯示圖片,預設是會顯示座標軸和刻度的,可通過Axes.axis('off')關閉。

4. 基本圖形patch

import matplotlib.patches as patches
from matplotlib.collections import PatchCollection

fig=plt.figure(figsize=(9,3))

ax=fig.add_subplot(121,title='Rectangle')
rects=[]
x=[1.5,3.5,5.5,]
y=[3,4.5,3]
for i in range(3):
    rect=patches.Rectangle((x[i],y[i]),3,3)
    rects.append(rect)
pc=PatchCollection(rects,linewidth=1,edgecolor='r',facecolor='none')
#ax.add_patch(rect)
ax.add_collection(pc)
ax.set_xlim([0,10])
ax.set_ylim([0,10])

ax=fig.add_subplot(122,title='Ellipse')
ells=[]
for i in range(5):
    ell=patches.Ellipse((5,5),6,3,angle=i*36)
    ells.append(ell)
pc=PatchCollection(ells,facecolor='g',alpha=0.5)
#ax.add_patch(ell)
ax.add_collection(pc)
ax.set_xlim([0,10])
ax.set_ylim([0,10])
複製程式碼

[python][科學計算][matplotlib]使用指南
繪製基本圖形和相應集合需要匯入patchesPatchCollection

patches提供了各種圖形的構造: Rectangle是矩形類,第1個引數xy設定左下角頂點的座標,第2,3個引數width,height設定寬度和高度,第4個引數angle設定旋轉角度; Ellipse是橢圓類,第1個引數xy設定橢圓中心的座標,第2,3個引數width,height設定橫軸和豎軸的長度(直徑),第4個引數angle設定旋轉角度。

PatchCollection用於構造patches集合並設定通用的擴充引數: linewidth引數設定邊緣線寬; edgecolor引數設定邊緣顏色; facecolor引數設定填充顏色,facecolor='none'可以設定不填充(在建立圖形類時,fill=False也能設定不填充); alpha引數設定透明度。

add_patch用於向Axes中新增單個圖形; add_collection用於向Axes中新增圖形集合; Axes.patches可以檢視Axes下的所有Patch繪圖物件; Axes.collections可以檢視Axes下的所有繪圖集合。

5. 資料表格table

data=np.array([[1,2,3],[4,5,6],[7,8,9]])
row_labels=['row1','row2','row3']
row_colors=plt.cm.BuPu(np.linspace(0, 0.5, len(row_labels)))
col_labels=['col1','col2','col3']
col_index=np.arange(3)

fig=plt.figure()
ax=fig.add_subplot(111,title='table')
for i in range(len(row_labels)-1,-1,-1):
    ax.bar(col_index,data[i],color=row_colors[i],linewidth=0.5,edgecolor='k')
ax.table(cellText=data,
         rowLabels=row_labels,
         rowColours=row_colors,
         colLabels=col_labels,
         loc='bottom')
ax.set_xticks([])
複製程式碼

[python][科學計算][matplotlib]使用指南

table方法用於新增表格: cellText引數設定單元格資料,二維序列型別,預設NonecellColors引數設定單元格顏色,二維序列型別,預設NonecellTextcellColors兩個引數至少有一個要賦值; cellLoc引數設定單元格位置,預設'right'colWidths引數設定列寬,一維序列型別,可選; rowLabels引數設定行標籤,一維序列型別,可選; rowColors引數設定行標籤顏色,一維序列型別,可選; rowLoc引數設定行標籤位置,預設'left'colLabels引數設定列標籤,一維序列型別,可選; colColors引數設定列標籤顏色,一維序列型別,可選; colLoc引數設定列標籤位置,預設'center'loc引數設定表格位置,預設bottombbox引數設定方框樣式,可選。

更詳細的設定可以自行建立Table物件,通過Axes.add_table方法新增; Axes.tables可以檢視Axes下的所有Table繪圖物件。

相關文章