原標題:30行Python代碼實現3D數據可視化
作者:潮汐
來源:Python技術
歡迎來到 編程教室~
我們之前的文章中有講解過不少 Matplotlib 的用法,比如:
之前我們基本都是用它來繪制二維的數據圖表。而今天文章中,我們將教大家如何用不到 30 行代碼繪制 Matplotlib 3D 圖形。
回顧 2D 作圖
用賽貝爾曲線作 2d 圖。此圖是用基于 Matplotlib 的 Path 通過賽貝爾曲線實現的,有對賽貝爾曲線感興趣的朋友們可以深入了解一下。在 matplotlib 中,figure 為畫布,axes 為繪圖區,fig.add_subplot、plt.subplot 方法均可以創建子圖。以下是作圖實踐。
importmatplotlib.path asmpath
importmatplotlib.patches asmpatches
importmatplotlib.pyplot asplt
fig, ax = plt.subplots
#定義繪圖指令與控制點坐標
Path = mpath.Path
# Path 控制坐標點繪制貝塞爾曲線
# 圖形數據構造
# MOVETO表示將繪制起點移動到指定坐標
# CURVE4表示使用4個控制點繪制3次貝塞爾曲線
# CURVE3表示使用3個控制點繪制2次貝塞爾曲線
# LINETO表示從當前位置繪制直線到指定位置
# CLOSEPOLY表示從當前位置繪制直線到指定位置,并閉合多邊形
path_data = [
(Path.MOVETO, ( 1.88, -2.57)),
(Path.CURVE4, ( 0.35, -1.1)),
(Path.CURVE4, ( -1.75, 1.5)),
(Path.CURVE4, ( 0.375, 2.0)),
(Path.LINETO, ( 0.85, 1.15)),
(Path.CURVE4, ( 2.2, 3.2)),
(Path.CURVE4, ( 3, 0.05)),
(Path.CURVE4, ( 2.0, -1.5)),
(Path.CLOSEPOLY, ( 1.58, -2.57)),
]
codes,verts = zip(*path_data)
path = mpath.Path(verts, codes)
patch = mpatches.PathPatch(path, facecolor= 'r', alpha= 0.5)
ax.add_patch(patch)
# plot control points and connecting lines
x, y = zip(*path.vertices)
line, = ax.plot(x, y, 'go-')
ax.grid
ax.axis( 'equal')
plt.show
心型效果圖 3D 帽子圖1
Matplotlib 繪制 3D 圖形使用的是 mplot3d Toolkit,即 mplot3d 工具包。繪制 3D 圖可以通過創建子圖,然后指定 projection 參數 為 3d 即可,返回的 ax 為 Axes3D 對象。
導入包:
frommatplotlib importcm
frommatplotlib.ticker importLinearLocator, FormatStrFormatter
frommpl_toolkits.mplot3d importAxes3D
繪圖全過程:
importmatplotlib.pyplot asplt
frommatplotlib importcm
frommatplotlib.ticker importLinearLocator, FormatStrFormatter
frommpl_toolkits.mplot3d importAxes3D
importnumpy asnp
fig = plt.figure
# 指定圖形類型是 3d 類型
ax = fig.add_subplot(projection= '3d')
# 構造數據
X = np.arange( -5, 5, 0.25)
Y = np.arange( -5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X** 2+ Y** 2)
Z = np.sin(R)
# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth= 0, antialiased= False)
# Customize the z axis.
ax.set_zlim( -1.01, 1.01)
ax.zaxis.set_major_locator(LinearLocator( 10))
ax.zaxis.set_major_formatter(FormatStrFormatter( '%.02f'))
# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink= 0.5, aspect= 5)
plt.show
呈現效果:
帽子圖1 3D 帽子圖2 importnumpy asnp
importmatplotlib.pyplot asplt
frommpl_toolkits.mplot3d importAxes3D
fig = plt.figure
# 指定圖形類型為 3d 類型
ax = fig.add_subplot( 111, projection= '3d')
# X, Y value
X = np.arange( -5, 5, 0.25)
Y = np.arange( -5, 5, 0.25)
# 設置 x-y 平面的網格
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2+ Y ** 2)
# height value
Z = np.sin(R)
# rstride:行之間的跨度 cstride:列之間的跨度
# rcount:設置間隔個數,默認50個,ccount:列的間隔個數 不能與上面兩個參數同時出現
#vmax和vmin 顏色的最大值和最小值
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)
# 設置圖像z軸的顯示范圍,x、y軸設置方式相同
ax.set_zlim( -2, 2)
plt.show
帽子圖2 3D 線性圖
3D 線性圖使用 Axes3D.plot來繪制。繪畫的基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])
參數說明:
參數
描述
xs
一維數組,點的 x 軸坐標
ys
一維數組,點的 y 軸坐標
zs
一維數組,可選項,點的 z 軸坐標
zdir
可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞,若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’
**kwargs
其他關鍵字參數,可選項,可參見 matplotlib.axes.Axes.plot
importnumpy
asnp
importmatplotlib.pyplot asplt
frommpl_toolkits.mplot3d importAxes3D
# 依次獲取畫布和繪圖區并創建 Axes3D 對象
fig = plt.figure
ax = fig.gca(projection= '3d')
# 第一條3D線性圖數據
theta = np.linspace( -4* np.pi, 4* np.pi, 100)
z1 = np.linspace( -2, 2, 100)
r = z1** 2+ 1
x1 = r * np.sin(theta)
y1 = r * np.cos(theta)
# 第二條3D線性圖數據
z2 = np.linspace( -3, 3, 100)
x2 = np.sin(z2)
y2 = np.cos(z2)
# 繪制3D線性圖
ax.plot(x1, y1, z1, color= 'b', label= '3D Line1')
ax.plot(x2, y2, z2, color= 'r', label= '3D Line2')
# 設置標題、軸標簽、圖例,也可以直接使用 plt.title、plt.xlabel、plt.legend...
ax.set_title( '3D Line View', pad= 15, fontsize= '10')
ax.set_xlabel( 'x ', color= 'r', fontsize= '14')
ax.set_ylabel( 'y ', color= 'g', fontsize= '14')
ax.set_zlabel( 'z ', color= 'b', fontsize= '14')
ax.legend
plt.show
結果顯示:
線性圖 3D 散點圖
繪制 3D 散點圖的基本方法是:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])
參數詳解:
參數
描述
xs
一維數組,點的 x 軸坐標
ys
一維數組,點的 y 軸坐標
zs
一維數組,可選項,點的 z 軸坐標
zdir
可選項,在 3D 軸上繪制 2D 數據時,數據必須以 xs,ys 的形式傳遞,若此時將 zdir 設置為 ‘y’,數據將會被繪制到 x-z 軸平面上,默認為 ‘z’
s
標量或數組類型,可選項,標記的大小,默認 20
c
標記的顏色,可選項,可以是單個顏色或者一個顏色列表支持英文顏色名稱及其簡寫、十六進制顏色碼等,更多顏色示例參見官網 Color Demo
depthshade
bool 值,可選項,默認 True,是否為散點標記著色以提供深度外觀
**kwargs
其他關鍵字
importmatplotlib.pyplot
asplt
importnumpy asnp
frommpl_toolkits.mplot3d importAxes3D
defrandrange(n, vmin, vmax):
return(vmax - vmin) * np.random.rand(n) + vmin
fig = plt.figure
ax = fig.add_subplot( 111, projection= '3d')
n = 100
# For each set of style and range settings, plot n random points in the box
# defined by x in [23, 32], y in [0, 100], z in [zlow, zhigh].
forc, m, zlow, zhigh in[( 'r', 'o', -50, -25), ( 'b', '^', -30, -5)]:
xs = randrange(n, 23, 32)
ys = randrange(n, 0, 100)
zs = randrange(n, zlow, zhigh)
ax.scatter(xs, ys, zs, c=c, marker=m)
ax.set_title( '3D Diagram View', pad= 15, fontsize= '10')
ax.set_xlabel( 'x ', color= 'r', fontsize= '14')
ax.set_ylabel( 'y ', color= 'g', fontsize= '14')
ax.set_zlabel( 'z ', color= 'b', fontsize= '14')
plt.show
結果顯示為:
散點圖 總結
本文主要是介紹使用 Python 第三方庫 Matplotlib 來繪制 3D 圖形,當然除了上面演示的這幾種,還有更多豐富的圖形和功能等待你去挖掘。相比于 2D 圖形,3D 圖形可以多展現一個維度的數據特征,在可視化時會有更加直觀的效果。 在實際的數據可視化過程中,我們要根據具體需求來決定用怎樣的形式來展現,而多了解一些工具就可以更加游刃有余。這些強大的工具也正是 Python 在數據分析和可視化方面的一大優勢之一。
本文相關代碼下載地址:
https://github.com/JustDoPython/python-examples/tree/master/chaoxi/Matplotlib_3D
150年前,他對拿破侖做數據可視化 返回搜狐,查看更多
責任編輯: