matplotlib库绘图基础
matplotlib庫畫圖基礎
文章目錄
- matplotlib庫畫圖基礎
- 1.matplotlib簡介
- 2.繪圖操作
- 2.1導入畫圖庫
- 2.2畫第一個圖
- 2.3創建figure
- 2.4控制線條風格
- 2.5坐標軸控制
- 2.6繪制坐標軸
- 2.7繪制標注
- 2.8繪制散點圖
- 2.9繪制條形圖
- 2.10繪制等高圖
- 2.11繪制三維圖
- 2.12在figure中繪制多個子圖
1.matplotlib簡介
? Matplotlib 是一個非常強大的 Python 畫圖工具,如果用過MATLAB的話,學這個學起來十分簡單,因為Matplotlib的畫圖跟MATLAB里面的函數差不多。
2.繪圖操作
2.1導入畫圖庫
import matplotlib.pyplot as plt import numpy as np2.2畫第一個圖
以下操作都在jupyter notebook中畫制,如果是在pycharm等其他編譯器,會彈出figure組件,供用戶調整畫像。
x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2 #畫圖使用plot plt.plot(x,y1,x,y2) plt.show()基礎知識點:每個畫圖都會使用一個figure,figure可以認為是一個畫板,如果不特別聲明,所以畫圖和曲線將在一個默認figure中展示
2.3創建figure
在jupyter notebook中畫制是沒有figure組件彈出的,所以所有的繪圖都會輸出到notebook中
x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2#figure1(獨立的畫板) plt.figure(1) plt.plot(x,y1)#figure2(獨立的畫板) plt.figure(2) plt.plot(x,y1) plt.plot(x,y2) plt.show()因為在jupyter notebook上畫的圖,直接顯示在頁面上,無法看到figure組件。用pycharm就沒事了。
2.4控制線條風格
可以通過color控制線條顏色,linewidth控制線條寬度,linestyle控制線條風格
x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2#figure1 plt.figure(1) plt.plot(x,y1)#figure2 plt.figure(2) plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted') plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--') plt.show()2.5坐標軸控制
對畫圖的x,y軸的坐標進行控制可以通過xlim和xlabel,ylim和ylabel進行控制
x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted') plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--') #控制X坐標顯示范圍 plt.xlim((-2,2)) #給X和Y軸起軸標簽名 plt.xlabel('Xlabel') plt.ylabel('Ylabel') #控制X軸的度標,ticks標度位置,labels標度名 plt.xticks(np.linspace(-2,2,4)) plt.yticks(ticks=[-0.5,1,2.5],labels=['bad','good','very good'])#曲線對照框 plt.legend(('label1', 'label2')) plt.show()2.6繪制坐標軸
將坐標軸移動到畫圖中心。
x = np.linspace(-1,1,50) y1 = 2*x + 1 y2 = x**2plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted') plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--') plt.xlim((-2,2)) plt.xlabel('X') plt.ylabel('Y') plt.xticks(np.linspace(-2,2,4)) plt.yticks(ticks=[-0.5,1,2.5],labels=['bad','good','very good'])ax = plt.gca() # get current axis 獲得坐標軸對象 ax.spines['right'].set_color('none') # 將右邊 邊沿線顏色設置為空 其實就相當于抹掉這條邊 ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') # 設置中心的為(0,0)的坐標軸 ax.spines['bottom'].set_position(('data', 0)) # 指定 data 設置的bottom(也就是指定的x軸)綁定到y軸的0這個點上 ax.spines['left'].set_position(('data', 0))plt.show()2.7繪制標注
主要是在畫圖中標注信息,起主要使用函數annotate()來實現
x = np.linspace(-1,1,50) y = 2*x + 1 x0 = 0.5 y0=2*x0+1 plt.scatter(x0,y0) plt.plot([x0,x0],[y0,-1],'--',lw=2.5) plt.plot(x,y) #xy控制箭頭的點,xytext控制標簽的位置,arrowprops用來設置箭頭的風格 #r'$2x+1=%s$'%y0 是要打印的文本內容,這里r代表字符串中字符不轉義(不好說明,如果看不懂直接寫自己要打印的內容即可) plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xytext=(0.6,1.5),arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2')) plt.show()2.8繪制散點圖
繪制散點圖使用函數scatter,該函數主要用作繪制散點圖
x = np.linspace(-1,1,50) y = 2*x + 1 r = np.random.normal(0,0.3,50) y1= y+rplt.scatter(x,y1,color='b',linewidths=1) plt.plot(x,y,color='r',linewidth=2.5)plt.show()2.9繪制條形圖
x = np.linspace(0,5,6) y = 2*x + 10 r = np.random.normal(0,2,6) y1= y+r #畫柱狀圖 plt.bar(x,y1,edgecolor='white') plt.bar(x,-y,color='orange',edgecolor='white') #標注值 for X,Y in zip(x,y1):plt.text(X,Y+0.1,'%.2f'%Y,ha='center',va='bottom') for X,Y in zip(x,y):plt.text(X,-Y-2.2,'%.2f'%Y,ha='center',va='bottom')plt.show()2.10繪制等高圖
# 計算x,y坐標對應的高度值 def f(x, y):return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2)# 生成x,y的數據 n = 256 x = np.linspace(-3, 3, n) y = np.linspace(-3, 3, n)# 把x,y數據生成mesh網格狀的數據 #等高線的顯示是在網格的基礎上添加上高度值 X, Y = np.meshgrid(x, y)# 填充等高圖 Cs=plt.contourf(X, Y, f(X, Y),8,alpha=0.7,cmap=plt.cm.hot) #等高線 C=plt.contour(X, Y, f(X, Y),8,colors='black') #增加標簽 plt.clabel(C,inline=True,fontsize=8) #設置顏色條 plt.colorbar(Cs)# 顯示圖表 plt.show()2.11繪制三維圖
畫三維圖,需要使用Axes3D模塊,所有要先進行導入:
from mpl_toolkits.mplot3d import Axes3D構建三維坐標:
figure = plt.figure() ax = Axes3D(figure)#也可以這樣 fig = plt.figure() ax = fig.gca(projection='3d')繪制:
# X, Y 的值 X = np.arange(-4, 4, 0.25) Y = np.arange(-4, 4, 0.25) # x,y 平面的網格,其實就是對X,Y進行廣播操作 X, Y = np.meshgrid(X, Y) R = np.sqrt(X ** 2 + Y ** 2) # Z 的值 Z = np.sin(R) # rstride:網格之間的行跨度 # cstride:網格之間的列跨度 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # zdir : 等高線圖('z' | 'x' | 'y') # offset : 表示等高線圖投射到指定頁面的某個刻度 ax.contourf(X,Y,Z,zdir='z',offset=-2)p # z軸的顯示范圍 ax.set_zlim(-2,2) plt.show()這里的刻度沒負號是因為在jupyter里面畫的圖,matplotlib對jupyter notebook多少有點不兼容。
在jupyter notebook中因為沒辦彈出figure組件,輸出的結果直接是顯示在網頁中的。這導致一些顯示會出問題。在pycharm編譯器基本不會出現這種顯示的錯誤。
2.12在figure中繪制多個子圖
使用subplot,在一個figure中繪制多個圖
fig=plt.figure() plt.subplot(2,2,1) #繪制圖1plt.subplot(2,2,2) #繪制圖2plt.subplot(2,2,3) #繪制圖3plt.subplot(2,2,4) #繪制圖4總結
以上是生活随笔為你收集整理的matplotlib库绘图基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas loc和iloc区别
- 下一篇: ES6的导入和导出模块