目錄python
(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') #能夠添加路徑
散點圖能夠利用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
對於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()
結果: