Matplotlib的使用

1.pyplot基礎語法

(1)建立畫布
figure()建立一個空白畫布,能夠指定畫布的大小figsize和設置分辨率dpi數組

plt.figure() 
plt.figure(figsize=(8,6),dpi=80) #(8,6)表明圖像的長和寬單位是英寸,dpi表明分辨率

(2)建立子圖
figure.add_subplot方法用來建立子圖,也能夠直接使用subplot.ide

fig=plt.figure()
fig.add_subplot(2,2,1)
或
subplot(2,2,1)
例如:
plt.figure()
x=np.linspace(-np.pi,np.pi,100)
y1=np.sin(x)
y2=np.cos(x)
plt.subplot(211)  #表示2x1的畫布中的第一個
plt.plot(x,y1,'-r')
plt.title('sin')
plt.subplot(212) #等同 fig.add_subplot(212) 2x1畫布中第二個
plt.title('cos')
plt.plot(x,y2,'-.b')
plt.show()

在這裏插入圖片描述
(3)添加畫布內容
注意:
對於中文亂碼問題,能夠在做圖以前添加以下代碼:函數

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

添加圖例必定是在繪圖(plot)以後,設置標籤等和繪圖沒有前後順序,而且圖例中的順序和繪圖的順序一致。字體

函數 做用
plt.title 添加標題
plt.xlabel 設置x軸的名稱
plt.ylabel 設置y軸的名稱
plt.xlim 設置x軸的範圍(參數是上下限的tuple)
plt.ylim 設置y軸的範圍
plt.xticks 設置x軸的刻度數目和取值(參數是list)【其參數rotation表明傾斜角度】
plt.yticks 設置y軸的刻度數目和取值
plt.legend 設置圖例
plt.grid 設置網格線

示例(應用上面的所有設置):spa

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
fig=plt.figure()
plt.title('sin&cos')
x=np.linspace(-np.pi,np.pi,100,endpoint=False)
y1=np.sin(x)
y2=np.cos(x)
plt.plot(x,y1,'-r') #實線
plt.plot(x,y2,'-.b') #虛線
a=[-np.pi,-1/2*np.pi,0,1/2*np.pi,np.pi] 
label=[r'$-\pi$',r'$-\pi/2$',0,r'$\pi/2$',r'$\pi$']  #使用laTex
plt.xticks(a,label) #設置x軸的記號,若是僅有a,則爲設置x軸的ticks,其還有個參數rotation表明傾斜角度,若是x軸的刻度標籤太長能夠設置角度讓其傾斜,例如rotation=45,表明傾斜45度
plt.xlim((0,np.pi)) #設置x軸的顯示範圍[0,pi)
plt.xlabel('x的取值')
plt.ylabel('y的值')
plt.grid(linestyle=':',color='y')#添加背景網格線
plt.legend(['sin','cos'],loc='lower left') #調整圖例的位置在左下,注意圖例中的sin,與cos對應繪圖時的順序
plt.show()

結果:
在這裏插入圖片描述
(4)保存與顯示圖形
savefig能夠用來保存繪製的圖形
show()用來顯示圖形3d

plt.savefig('1.png') #能夠添加路徑

2.散點圖與折線圖

散點圖能夠利用scatter函數來繪製,這個是專門繪製散點圖的,也可使用plot函數來繪製。
利用plot直接將關於鏈接線的部分去掉,加上marker部分就能夠了就由折線圖變成了散點圖,對於上面例子中的:code

plt.plot(x,y1,'-r')  
將其改成 plt.plot(x,y1,'ro') 就變成了散點圖(用o表明點)
也能夠經過scatter函數
plt.scatter(x,y1,c='r',marker='o')

結果:
在這裏插入圖片描述blog

3.3D圖與等高線圖

對於3D圖的繪製須要引入from mpl_toolkits.mplot3d import Axes3D
3D圖和2D圖的區別就是將x和y進行了meshgrid操做
對於meshgrid函數的做用是將x,y向量 編織成二維的柵格.
例如:
二維座標系中X軸的取值是1,2,3,而Y軸的取值是4,5,那麼能夠得到(1,4)(1,5)
(2,4)(2,5)
(3,4)(3,5)這些座標,這就構成了一個二維的網格,而meshgrid的做用就是這個。圖片

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
a=np.array([1,2,3])
b=np.array([4,5])
c,d=np.meshgrid(a,b)  #c[[1,2,3],[1,2,3]] d[[4,4,4],[5,5,5]]
e=np.array([[1,2,1],[7,8,9]])
fig=plt.figure()
#在畫布上添加3D座標軸
ax=Axes3D(fig)
#畫出3d圖:rstride 和 cstride 分別表明 row 和 column 的跨度,通常選擇默認就行,不設置。
ax.plot_surface(c,d,e,rstride=1,cstride=1,cmap='rainbow')
ax.scatter(c, d,e, c = 'g', marker = '^') #將點標出來

結果:
在這裏插入圖片描述
我感受對於3D圖的繪製,由於此時x軸和y軸都是二維數組,按照2d中二維數組繪圖時,會對以對其進行橫向分割的方式,而後去進行鏈接。對於3d中,首先就是根據橫向分割,而後按照構成點的順序進行鏈接,而後再根據縱向分割,而後按照構成點的順序進行鏈接,這樣就鏈接成了3d圖。對於3D圖的繪製只須要作的就是構成網格矩陣,而後根據x,y的值去求z的值,這樣x,y,z所有有了後就能夠對其繪製三維圖。
注意:
當x和y是二維數組時,會對以對其進行橫向分割的方式,而後去進行鏈接。

x=np.array([[0,0.5,1],[0,0.5,1],[2,1,4]])
y=np.array([[0,0,0],[1,1,1],[3,3,4]])
plt.plot(x,y,'-rx')
按照(0,0)(0,1)(2,3)鏈接,而後再(0.5,0)(0.5,1)(1,3)以此類推.

2D的結果:
在這裏插入圖片描述

三維的話就至關於多了個z,設z=np.array([[0,1,2],[1,2,3],[4,5,6]])
那麼繪圖能夠理解爲:
按照(0,0,1)(0.5,1,1)(2,3,4)連結,而後再(0.5,0,1)(0.5,1,2)(1,3,5)以此類推,而後再橫向(0,0,1)(0.5,0,1)(1,0,2)鏈接,以此類推。
能夠理解成橫向分割後鏈接,而後再縱向分割後鏈接。

等高線圖:

plt.figure()
plt.xlabel(r'$\theta_0$')
plt.ylabel(r'$\theta_1$')
theta0_val=np.linspace(-10,10,100)
theta1_val=np.linspace(-1,4,100)
xs,ys=np.meshgrid(theta0_val,theta1_val)
#使用contour生成三維結構表面的等值線圖, np.logspace(-2,3,20)表明z值10^-2到10^3的20元素的等比數列,即那些等高線
CS = plt.contour(xs, ys, J_val, np.logspace(-2,3,20))
#最後加入Label,inline控制是否將Label畫在線裏面,字體大小爲10。
plt.clabel(CS, inline=1, fontsize=10)
# 繪製最優解
plt.plot(theta[0,0], theta[1,0], 'rx', markersize=10, linewidth=2)
#theta[0,0], theta[1,0]爲最優解的值
plt.show()

結果:
在這裏插入圖片描述

相關文章
相關標籤/搜索