1. 程式人生 > >Python三維繪圖--Matplotlib

Python三維繪圖--Matplotlib

Python三維繪圖

在遇到三維資料時,三維影象能給我們對資料帶來更加深入地理解。python的matplotlib庫就包含了豐富的三維繪圖工具。

1.建立三維座標軸物件Axes3D

建立Axes3D主要有兩種方式,一種是利用關鍵字projection='3d'l來實現,另一種則是通過從mpl_toolkits.mplot3d匯入物件Axes3D來實現,目的都是生成具有三維格式的物件Axes3D.

#方法一,利用關鍵字
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#定義座標軸
fig =
plt.figure() ax1 = plt.axes(projection='3d') #ax = fig.add_subplot(111,projection='3d') #這種方法也可以畫多個子圖 #方法二,利用三維軸方法 from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D #定義影象和三維格式座標軸 fig=plt.figure() ax2 = Axes3D(fig)
2.三維曲線和散點

隨後在定義的座標軸上畫圖:

import numpy as np
z = np.linspace(
0,13,1000) x = 5*np.sin(z) y = 5*np.cos(z) zd = 13*np.random.random(100) xd = 5*np.sin(zd) yd = 5*np.cos(zd) ax1.scatter3D(xd,yd,zd, cmap='Blues') #繪製散點圖 ax1.plot3D(x,y,z,'gray') #繪製空間曲線 plt.show()

在這裡插入圖片描述

3.三維曲面

下一步畫三維曲面

fig = plt.figure()  #定義新的三維座標軸
ax3 = plt.axes(projection='3d')

#定義三維資料
xx = np.arange(
-10,10,100) yy = np.arange(-10,10,100) X, Y = np.meshgrid(x, y) Z = np.sin(X)+np.cos(Y) #作圖 ax3.plot_surface(X,Y,Z,cmap='rainbow') #ax3.contour(X,Y,Z, zdim='z',offset=-2,cmap='rainbow) #等高線圖,要設定offset,為Z的最小值 plt.show()

在這裡插入圖片描述 如果加入渲染時的步長,會得到更加清晰細膩的影象: ax3.plot_surface(X,Y,Z,rstride = 1, cstride = 1,cmap='rainbow'),其中的row和cloum_stride為橫豎方向的步長。 在這裡插入圖片描述

4.等高線

同時還可以將等高線投影到不同的面上:

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#定義座標軸
fig4 = plt.figure()
ax4 = plt.axes(projection='3d')

#生成三維資料
xx = np.arange(-5,5,0.1)
yy = np.arange(-5,5,0.1)
X, Y = np.meshgrid(xx, yy)
Z = np.sin(np.sqrt(X**2+Y**2))

#作圖
ax4.plot_surface(X,Y,Z,alpha=0.3,cmap='winter')     #生成表面, alpha 用於控制透明度
ax4.contour(X,Y,Z,zdir='z', offset=-3,cmap="rainbow")  #生成z方向投影,投到x-y平面
ax4.contour(X,Y,Z,zdir='x', offset=-6,cmap="rainbow")  #生成x方向投影,投到y-z平面
ax4.contour(X,Y,Z,zdir='y', offset=6,cmap="rainbow")   #生成y方向投影,投到x-z平面
#ax4.contourf(X,Y,Z,zdir='y', offset=6,cmap="rainbow")   #生成y方向投影填充,投到x-z平面,contourf()函式

#設定顯示範圍
ax4.set_xlabel('X')
ax4.set_xlim(-6, 4)  #拉開座標軸範圍顯示投影
ax4.set_ylabel('Y')
ax4.set_ylim(-4, 6)
ax4.set_zlabel('Z')
ax4.set_zlim(-3, 3)

plt.show()

在這裡插入圖片描述在這裡插入圖片描述

5.隨機散點圖

可以利用scatter()生成各種不同大小,顏色的散點圖,其引數如下:

#函式定義
matplotlib.pyplot.scatter(x, y, 
	s=None,   #散點的大小 array  scalar
	c=None,   #顏色序列   array、sequency
	marker=None,   #點的樣式
	cmap=None,    #colormap 顏色樣式
	norm=None,    #歸一化  歸一化的顏色camp
	vmin=None, vmax=None,    #對應上面的歸一化範圍
 	alpha=None,     #透明度
	linewidths=None,   #線寬
	verts=None,   #
	edgecolors=None,  #邊緣顏色
	data=None, 
	**kwargs
	)
#ref:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#定義座標軸
fig4 = plt.figure()
ax4 = plt.axes(projection='3d')

#生成三維資料
xx = np.random.random(20)*10-5   #取100個隨機數,範圍在5~5之間
yy = np.random.random(20)*10-5
X, Y = np.meshgrid(xx, yy)
Z = np.sin(np.sqrt(X**2+Y**2))

#作圖
ax4.scatter(X,Y,Z,alpha=0.3,c=np.random.random(400),s=np.random.randint(10,20, size=(20, 40)))     #生成散點.利用c控制顏色序列,s控制大小

#設定顯示範圍

plt.show()

在這裡插入圖片描述

Finish

在這裡插入圖片描述