Matplotlib 的三維繪圖并不是一套獨(dú)立系統(tǒng),而是在原有 Figure、Axes 與子圖機(jī)制上的擴(kuò)展。三維圖仍沿用標(biāo)題、坐標(biāo)軸標(biāo)簽與布局調(diào)整等基本框架,只是繪圖對(duì)象從二維平面延伸到了三維空間。
在較新的 Matplotlib 版本中,只要使用 projection='3d' 創(chuàng)建坐標(biāo)軸,通常不必再顯式導(dǎo)入 Axes3D。但從概念上說,三維坐標(biāo)軸對(duì)象仍然屬于 mplot3d 提供的 Axes3D 體系。
注:本文只對(duì)三維繪圖中獨(dú)有或特別關(guān)鍵的函數(shù)參數(shù)進(jìn)行說明。
一、三維坐標(biāo)軸創(chuàng)建函數(shù)
三維圖形的前提是先創(chuàng)建三維坐標(biāo)軸。
add_subplot(..., projection='3d')
在 Figure 對(duì)象中添加一個(gè)三維子圖,并返回對(duì)應(yīng)的三維 Axes 對(duì)象。
ax = fig.add_subplot(nrows, ncols, index, projection='3d')參數(shù)說明:
? projection='3d':指定當(dāng)前子圖為三維投影坐標(biāo)軸;若省略該參數(shù),則創(chuàng)建的是普通二維子圖
返回值:返回一個(gè)三維 Axes 對(duì)象,通常記作 ax。
示例:
plt.show()這是一種非常常見、也較清晰的三維坐標(biāo)軸創(chuàng)建方式。它保留了 Matplotlib 一貫的“先創(chuàng)建圖形,再在圖形中添加子圖”的結(jié)構(gòu)。
axes(projection='3d')
用于創(chuàng)建一個(gè)三維坐標(biāo)區(qū)域。
ax = plt.axes(projection='3d')也可與位置參數(shù)一起使用:
ax = plt.axes([left, bottom, width, height], projection='3d')參數(shù)說明:
? projection='3d':指定創(chuàng)建三維坐標(biāo)軸
返回值:返回一個(gè)三維 Axes 對(duì)象。
示例:
plt.show()plt.axes() 在二維繪圖中也可以使用,但在三維繪圖中,必須明確加上 projection='3d',否則得到的仍然是二維坐標(biāo)軸。
subplots()
一次性創(chuàng)建 Figure 和一個(gè)或多個(gè) Axes 對(duì)象。
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=None, subplot_kw={'projection': '3d'})參數(shù)說明:
? subplot_kw:傳遞給每個(gè)子圖的關(guān)鍵字參數(shù)。在三維繪圖中,通常寫為 {'projection': '3d'},用于指定創(chuàng)建三維坐標(biāo)軸
subplots() 的完整接口還包含 sharex、sharey、squeeze、gridspec_kw、**fig_kw 等參數(shù)。
返回值:返回一個(gè)元組:
? fig:Figure 對(duì)象,表示整張畫布
? ax 或 axs:子圖對(duì)象;當(dāng)創(chuàng)建的是三維子圖時(shí),這里得到的是三維坐標(biāo)軸對(duì)象
示例:
plt.show()subplots() 的優(yōu)勢(shì)在于能夠一次性完成畫布與子圖的創(chuàng)建,寫法緊湊,特別適合規(guī)則的單圖或多子圖布局。
不過,在三維繪圖的教學(xué)中,很多示例仍常寫成“先 plt.figure(),再 fig.add_subplot(..., projection='3d')”的形式,因?yàn)檫@種寫法更容易體現(xiàn)三維坐標(biāo)軸是如何附加到 Figure 上的。
二、三維基礎(chǔ)繪圖函數(shù)
與二維圖形不同,這一組函數(shù)需要處理空間中的點(diǎn)、線、面或立體對(duì)象。
scatter()
用于繪制三維散點(diǎn)圖,展示離散點(diǎn)在三維空間中的分布情況。
ax.scatter(xs, ys, zs=0, zdir='z', s=None, c=None, depthshade=True, **kwargs)參數(shù)說明:
? zs:第三維坐標(biāo)數(shù)據(jù),即各點(diǎn)的 z 值
? zdir:指定第三維所對(duì)應(yīng)的方向,默認(rèn)是 'z'
? depthshade:是否啟用深度陰影效果,用于增強(qiáng)空間層次感
返回值:返回一個(gè) PathCollection 對(duì)象。
示例:
plt.show()與二維散點(diǎn)圖相比,三維散點(diǎn)圖多了 z 方向,因此每個(gè)點(diǎn)由 (x, y, z) 三個(gè)值共同確定。
它適合觀察三維點(diǎn)云分布、聚類結(jié)構(gòu)或三個(gè)變量之間的空間關(guān)系。
plot()
用于繪制三維折線圖,也可理解為在三維空間中繪制連續(xù)軌跡。
ax.plot(xs, ys, zs, **kwargs)參數(shù)說明:
? zs:第三維坐標(biāo)數(shù)據(jù)。在 3D 坐標(biāo)軸中,第三維數(shù)據(jù)通常作為第三組位置參數(shù)傳入
返回值:返回一個(gè)由線對(duì)象組成的列表。
示例:
plt.show()三維折線圖常用于繪制空間軌跡,例如螺旋線、參數(shù)曲線或路徑變化過程。
從本質(zhì)上說,它仍然是“按順序連接數(shù)據(jù)點(diǎn)”,只是連接發(fā)生在三維空間中。
plot_surface()
用于繪制三維曲面圖,是三維繪圖中最重要的函數(shù)之一。它通常用來展示二元函數(shù)的整體形狀或某個(gè)平面區(qū)域上的高度變化。
ax.plot_surface(X, Y, Z, *, norm=None, vmin=None, vmax=None, lightsource=None, axlim_clip=False, **kwargs)參數(shù)說明:
? X、Y:網(wǎng)格坐標(biāo)矩陣
? Z:與 X、Y 對(duì)應(yīng)的高度矩陣
? rcount:行方向參與繪制的最大采樣數(shù),默認(rèn) 50
? ccount:列方向參與繪制的最大采樣數(shù),默認(rèn) 50
? cmap:顏色映射方案,用于根據(jù)高度顯示不同顏色
rainbow:彩虹漸變,視覺鮮艷,但不太適合嚴(yán)肅的數(shù)據(jù)表達(dá)? edgecolor:曲面網(wǎng)格邊界顏色
其它合法顏色名:如 'red'、'blue'、'green' 等? rstride:行方向采樣步長
? cstride:列方向采樣步長
? linewidth:網(wǎng)格線寬
? antialiased:是否啟用抗鋸齒
? alpha:透明度
返回值:返回一個(gè) Poly3DCollection 對(duì)象。
示例:
plt.show()plot_surface() 與散點(diǎn)圖、折線圖不同,它要求輸入數(shù)據(jù)通常是二維網(wǎng)格結(jié)構(gòu)。因此,在使用前往往需要先通過 np.meshgrid() 構(gòu)造 X、Y 網(wǎng)格,再計(jì)算對(duì)應(yīng)的 Z 值。
plot_surface() 默認(rèn)會(huì)通過 rcount 和 ccount 控制每個(gè)方向參與繪制的最大采樣數(shù),默認(rèn)均為 50;也可以改用 rstride、cstride 指定步長。對(duì)于網(wǎng)格非常密集的數(shù)據(jù),這一機(jī)制有助于控制繪圖開銷。
plot_wireframe()
用于繪制三維線框圖。
ax.plot_wireframe(X, Y, Z, **kwargs)參數(shù)說明:
? X、Y、Z:二維數(shù)組,表示曲面上各點(diǎn)的坐標(biāo)
? rcount、ccount:每個(gè)方向上用于繪制的最大采樣數(shù),默認(rèn)均為 50
? rstride、cstride:行和列的步長,可用于控制線框稀疏程度
? color:線框顏色
? linewidth:線寬
? axlim_clip:是否裁剪坐標(biāo)軸范圍外的線框,默認(rèn) False。
返回值:返回一個(gè) Line3DCollection 對(duì)象。
示例:
plt.show()plot_wireframe() 與 plot_surface() 類似,都用于展示曲面形狀;不同的是,線框圖更強(qiáng)調(diào)網(wǎng)格結(jié)構(gòu)本身,適合觀察曲面的整體輪廓與起伏變化。官方文檔還說明,若輸入數(shù)據(jù)點(diǎn)過多,函數(shù)會(huì)按 rcount 和 ccount 自動(dòng)下采樣。
plot_trisurf()
用于繪制基于三角剖分的三維曲面圖。
ax.plot_trisurf(*args, color=None, **kwargs)參數(shù)說明:
plot_trisurf() 的參數(shù)形式比 plot_surface() 更靈活,常見寫法有兩類:
第一類,直接傳入三角剖分對(duì)象:
ax.plot_trisurf(triangulation, Z, ...)第二類,直接傳入點(diǎn)坐標(biāo):
ax.plot_trisurf(X, Y, Z, ...)常用參數(shù)包括:
? X、Y、Z:曲面點(diǎn)坐標(biāo)
? triangles:三角形頂點(diǎn)索引
? cmap:顏色映射方案
? color:整體顏色
? linewidth:邊界線寬
? antialiased:是否抗鋸齒
? axlim_clip:是否裁剪坐標(biāo)軸范圍外的內(nèi)容。
返回值:返回一個(gè) Poly3DCollection 對(duì)象。
示例:
plt.show()plot_surface() 通常要求輸入規(guī)則網(wǎng)格數(shù)據(jù),因此常常需要先用 np.meshgrid() 構(gòu)造二維網(wǎng)格;而 plot_trisurf() 不要求點(diǎn)必須落在規(guī)則網(wǎng)格上,它會(huì)根據(jù)平面散點(diǎn)自動(dòng)進(jìn)行三角剖分,再生成曲面。正因?yàn)槿绱耍m合處理實(shí)驗(yàn)采樣點(diǎn)、地形離散點(diǎn)、傳感器測(cè)量點(diǎn)等不規(guī)則空間數(shù)據(jù)。
bar3d()
用于繪制三維柱狀圖,在三維空間中顯示立體柱體。
ax.bar3d(x, y, z, dx, dy, dz, color=None, zsort='average', shade=True, **kwargs)參數(shù)說明:
? x:柱體底部起點(diǎn)的 x 坐標(biāo)
? y:柱體底部起點(diǎn)的 y 坐標(biāo)
? z:柱體底部起點(diǎn)的 z 坐標(biāo)
? dx:柱體在 x 方向上的寬度
? dy:柱體在 y 方向上的寬度
? dz:柱體在 z 方向上的高度
? zsort:柱體排序方式,影響渲染順序
'max':按柱體相關(guān)頂點(diǎn) z 值的最大值決定繪制順序? shade:是否啟用陰影效果
返回值:返回一個(gè) Poly3DCollection 對(duì)象。
示例:
plt.show()三維柱狀圖可以看作二維柱狀圖在空間中的擴(kuò)展。
不過,由于三維圖存在遮擋與透視問題,它雖然更立體,卻不一定總比二維柱狀圖更清晰。因此在正式分析中應(yīng)根據(jù)任務(wù)選擇。
contour()
用于繪制三維等高線圖,展示曲面的等值線結(jié)構(gòu)。
ax.contour(X, Y, Z, levels=None, zdir='z', offset=None, cmap=None, **kwargs)參數(shù)說明:
? X:網(wǎng)格點(diǎn)的 x 坐標(biāo)二維數(shù)組
? Y:網(wǎng)格點(diǎn)的 y 坐標(biāo)二維數(shù)組
? Z:對(duì)應(yīng)位置的高度值二維數(shù)組
? levels:等高線層級(jí)數(shù)量或具體層級(jí)值
? zdir:指定等高線投影方向
? offset:投影偏移位置
? cmap:顏色映射方案
返回值:返回一個(gè) QuadContourSet 對(duì)象。
示例:
plt.show()這里的 ax.contour() 是在三維坐標(biāo)軸上繪制等高線,可直接顯示在三維空間中,也可結(jié)合 zdir 與 offset 做投影。
三維等高線圖常用于輔助觀察曲面的層級(jí)變化。它既可以單獨(dú)繪制,也可以與 plot_surface() 配合使用,使曲面的高低結(jié)構(gòu)更加清晰。
contourf()
用于繪制三維填充等高線圖。
ax.contourf(X, Y, Z, *args, zdir='z', offset=None, **kwargs)參數(shù)說明:
? *args:等高線層級(jí)等額外參數(shù)
? zdir:等高線延伸或投影的方向,可取 'x'、'y'、'z'
? offset:若指定,則將填充等高線投影到與 zdir 垂直的平面上
? cmap:顏色映射方案
? axlim_clip:是否裁剪坐標(biāo)軸范圍外的內(nèi)容,默認(rèn) False
返回值:返回一個(gè) QuadContourSet 對(duì)象。
示例:
plt.show()contourf() 可以看作 contour() 的填充版本。它不僅能顯示等值分層,還能通過顏色填充增強(qiáng)層次感;若配合 offset 使用,還可以把填充等高線投影到某個(gè)坐標(biāo)平面上。
quiver()
用于繪制三維箭頭場(chǎng)。
ax.quiver(X, Y, Z, U, V, W, **kwargs)參數(shù)說明:
? X、Y、Z:箭頭起點(diǎn)坐標(biāo)
? U、V、W:箭頭在三個(gè)方向上的分量
? length:箭頭長度縮放因子,默認(rèn) 1
? arrow_length_ratio:箭頭頭部相對(duì)于整體長度的比例,默認(rèn) 0.3
? pivot:箭頭錨點(diǎn)位置,可取 'tail'、'middle'、'tip'
? normalize:是否將箭頭長度歸一化,默認(rèn) False
? axlim_clip:是否裁剪坐標(biāo)軸范圍外的箭頭,默認(rèn) False
返回值:返回一個(gè) Line3DCollection 對(duì)象。
示例:
plt.show()quiver() 常用于展示方向、速度、力場(chǎng)、梯度等向量信息。與散點(diǎn)圖展示“位置”不同,箭頭圖同時(shí)表達(dá)了“位置 + 方向 + 大小”三類信息。
三、三維圖形修飾函數(shù)
三維圖除了常見的標(biāo)題、橫軸標(biāo)簽、縱軸標(biāo)簽之外,還多了 z 軸和觀察角度等三維特有信息。因此,這一組函數(shù)在三維圖中尤其重要。
set_title()
用于設(shè)置三維子圖標(biāo)題。
ax.set_title(label, fontdict=None, loc=None, pad=None, **kwargs)參數(shù)說明:
該函數(shù)與二維繪圖中的 set_title() 用法相同,三維繪圖中沒有新增的獨(dú)有參數(shù)。
返回值:返回一個(gè) Text 對(duì)象。
示例:
ax.set_title("三維曲面圖")該函數(shù)雖然不是三維繪圖獨(dú)有,但在三維圖中同樣用于說明圖形內(nèi)容,常與 set_xlabel()、set_ylabel()、set_zlabel() 配合使用。
set_xlabel()/set_ylabel()
用于設(shè)置三維坐標(biāo)軸中的 x 軸與 y 軸標(biāo)簽。
ax.set_ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)參數(shù)說明:
與二維繪圖中的同名函數(shù)一致,三維場(chǎng)景中沒有額外獨(dú)有參數(shù)。
返回值:返回一個(gè) Text 對(duì)象。
示例:
ax.set_ylabel("Y")set_zlabel()
用于設(shè)置三維坐標(biāo)軸的 z 軸標(biāo)簽。
ax.set_zlabel(zlabel, fontdict=None, labelpad=None, **kwargs)參數(shù)說明:
? zlabel:z 軸標(biāo)簽文本
? 其余參數(shù)含義與 set_xlabel()、set_ylabel() 類似
返回值:返回一個(gè) Text 對(duì)象。
示例:
plt.show()set_zlim()
用于設(shè)置三維坐標(biāo)軸 z 軸的顯示范圍。
ax.set_zlim(bottom=None, top=None)參數(shù)說明:
? bottom:z 軸下界
? top:z 軸上界
返回值:返回設(shè)置后的 z 軸范圍。
示例:
ax.set_zlim(0, 20)當(dāng) z 方向數(shù)據(jù)跨度較大,或者希望突出某一高度區(qū)間時(shí),set_zlim() 很有用。它與二維圖中的 set_xlim()、set_ylim() 在作用邏輯上是一致的。
view_init()
用于設(shè)置三維圖的觀察角度。它決定讀者從什么方向觀看當(dāng)前三維圖形,因此在三維繪圖中非常重要。
ax.view_init(elev=None, azim=None, roll=None, vertical_axis='z', share=False)參數(shù)說明:
? elev:仰角,即從豎直方向上觀察的角度
? azim:方位角,即繞垂直軸旋轉(zhuǎn)的角度
? roll:繞觀察方向的旋轉(zhuǎn)角度
? vertical_axis:指定哪個(gè)軸視為豎直方向,默認(rèn)是 'z'
返回值:無返回值,主要起視角設(shè)置作用。
示例:
plt.show()三維圖的可讀性在很大程度上依賴視角。
同一組數(shù)據(jù),如果觀察角度不合適,空間結(jié)構(gòu)可能會(huì)變得難以辨認(rèn)。因此,view_init() 不是單純的美化函數(shù),而是三維表達(dá)的重要組成部分。
set_proj_type()
用于設(shè)置三維圖的投影方式。它決定三維場(chǎng)景是采用透視投影還是正交投影,從而影響圖形的空間視覺效果。
ax.set_proj_type(proj_type, focal_length=None)參數(shù)說明:
? proj_type:投影類型,常見取值為:
'ortho':正交投影,不表現(xiàn)近大遠(yuǎn)小,更適合強(qiáng)調(diào)幾何結(jié)構(gòu)與尺寸關(guān)系? focal_length:焦距參數(shù),主要用于透視投影效果調(diào)節(jié)
返回值:無返回值。
示例:
plt.show()view_init() 解決的是“從哪個(gè)方向看”,而 set_proj_type() 解決的是“用什么投影方式看”。二者共同決定三維圖的視覺呈現(xiàn)。官方專門提供了 3D plot projection types 示例來展示不同投影方式的效果差異。
set_box_aspect()
用于設(shè)置三維坐標(biāo)軸盒子的顯示比例。
ax.set_box_aspect(aspect, *, zoom=1)參數(shù)說明:
? aspect:三維坐標(biāo)軸盒子的比例,通常寫成三元組,如 (1, 1, 1) 或 (2, 1, 1)
? zoom:縮放系數(shù),默認(rèn) 1
返回值:無返回值。
示例:
plt.show()set_box_aspect() 控制的是三維坐標(biāo)軸外框在顯示中的比例,而不是數(shù)據(jù)本身的數(shù)值比例。官方文檔指出,其默認(rèn)盒子比例為 4:4:3。在三維圖中,如果默認(rèn)顯示效果讓圖形顯得“過扁”或“過高”,這個(gè)函數(shù)非常有用。
tight_layout()
自動(dòng)調(diào)整子圖間距,減少多子圖場(chǎng)景中的標(biāo)題、標(biāo)簽和刻度重疊。
plt.tight_layout(pad=1.08)或:
fig.tight_layout(pad=1.08)參數(shù)說明:
與二維繪圖中的 tight_layout() 基本一致,三維繪圖中沒有新增獨(dú)有參數(shù)。
返回值:無顯式返回值。
示例:
plt.tight_layout()tight_layout() 可用于對(duì)子圖間距做基礎(chǔ)性的自動(dòng)調(diào)整,但官方文檔同時(shí)指出,它屬于較早的布局機(jī)制,只檢查刻度標(biāo)簽、軸標(biāo)簽和標(biāo)題等元素的范圍。在復(fù)雜三維多子圖場(chǎng)景中,它的效果可能有限;若布局更復(fù)雜,通常更推薦使用 constrained_layout。
小結(jié)
Matplotlib 三維繪圖的關(guān)鍵,是先創(chuàng)建三維坐標(biāo)軸,再根據(jù)數(shù)據(jù)特點(diǎn)選擇點(diǎn)、線、曲面、柱體或向量場(chǎng)等函數(shù),最后結(jié)合 z 軸范圍、觀察角度、投影方式與盒子比例完善表達(dá)。學(xué)習(xí)時(shí),應(yīng)重點(diǎn)把握不同數(shù)據(jù)組織形式與函數(shù)選擇之間的對(duì)應(yīng)關(guān)系。
“點(diǎn)贊有美意,贊賞是鼓勵(lì)”
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.