目錄
- 1.pyplot基礎語法
- 2.散點圖與折線圖
- 3.3D圖與等高線圖
1.pyplot基礎語法
(1)創建畫布
figure()創建一個空白畫布,可以指定畫布的大小figsize和設定解析度dpi
plt.figure()
plt.figure(figsize=(8,6),dpi=80) #(8,6)代表影像的長和寬單位是英寸,dpi代表解析度
(2)創建子圖
figure.add_subplot方法用來創建子圖,也可以直接使用subplot.
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 | 設定網格線 |
示例(應用上面的全部設定):
%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()用來顯示圖形
plt.savefig('1.png') #可以添加路徑
2.散點圖與折線圖
散點圖可以利用scatter函式來繪制,這個是專門繪制散點圖的,也可以使用plot函式來繪制,
利用plot直接將關于連接線的部分去掉,加上marker部分就可以了就由折線圖變成了散點圖,對于上面例子中的:
plt.plot(x,y1,'-r')
將其改為 plt.plot(x,y1,'ro') 就變成了散點圖(用o代表點)
也可以通過scatter函式
plt.scatter(x,y1,c='r',marker='o')
結果:

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()
結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/57315.html
標籤:其他
上一篇:TimeoutError: [WinError 10060] 由于連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗
