Matplotlib 不僅可以繪制二維圖形,也支持基礎的三維可視化。在數據分析、科學計算和教學演示中,二維圖通常已經能夠表達大量信息,但當數據同時涉及三個變量,或者我們希望展示空間軌跡、曲面形狀、立體分布時,三維圖就具有明顯優勢。
例如,在二維坐標系中,一條曲線只能表現橫軸與縱軸之間的關系;而在三維坐標系中,點、線和面都可以在空間中展開,從而幫助我們觀察更復雜的結構。螺旋線、空間點云、函數曲面、立體柱狀圖等,都是典型的三維可視化對象。Matplotlib 對這些圖形提供了基礎支持,因此,掌握三維繪圖的基本方法,是理解 Matplotlib 圖形體系的重要延伸。
一、什么是 Matplotlib 的三維繪圖
在二維繪圖中,我們主要處理兩個坐標軸:橫軸 x 與縱軸 y。而在三維繪圖中,會進一步引入 z 軸,用來表示第三個方向上的位置或數值變化。這樣,數據點就不再只落在一個平面上,而是被放置在三維空間中進行觀察。
Matplotlib 的三維繪圖主要依賴 mplot3d 工具包。它不是一個與 Matplotlib 完全分離的獨立系統,而是在原有繪圖框架上的擴展。因此,三維繪圖依然延續 Matplotlib 的基本思想:先創建圖形對象,再創建坐標軸對象,最后在坐標軸上繪制圖形。換句話說,三維繪圖并不是一種全新的繪圖思路,而是二維繪圖在空間維度上的自然擴展。
通常,我們仍然先導入最基礎的兩個庫:
import numpy as np其中:
matplotlib.pyplot 用于創建圖形、坐標軸以及控制圖形顯示;
numpy 用于構造數值數據,尤其適合生成曲線、網格和曲面數據。
二、三維坐標軸是如何創建的
學習 Matplotlib 三維繪圖時,首先要理解三維坐標軸的創建方式。因為只有創建出三維坐標軸,后續的散點圖、折線圖、曲面圖等才有意義。
在較早資料中,常見到以下導入方式:
from mpl_toolkits.mplot3d import Axes3D但在當前常用寫法中,通常直接通過 projection='3d' 創建三維坐標軸即可。例如:
ax = plt.axes(projection='3d')或者:
ax = fig.add_subplot(111, projection='3d')這兩種方式本質上都可以創建三維坐標軸對象。對于初學者來說,第二種寫法通常更清楚,因為它明確表明:這個三維坐標軸 ax 屬于哪個 Figure 對象。也就是說,三維繪圖仍然遵循“圖形對象—坐標軸對象”的結構關系,只是這里的坐標軸不再是二維平面,而是三維空間中的繪圖區。
三、Matplotlib 三維繪圖的基本思路
雖然三維圖在視覺上比二維圖復雜,但它的繪圖流程與二維圖并沒有本質區別。一般來說,可以概括為以下幾個步驟。
1、準備數據
先構造 x、y、z 數據。
如果是三維散點圖或三維折線圖,通常直接準備三個一維數組即可;
如果是三維曲面圖或三維等高線圖,則通常需要先構造二維網格數據。
2、創建三維坐標軸
通過 projection='3d' 創建三維坐標軸對象 ax。
3、選擇圖形類型并繪制
例如:
ax.contour(...):繪制三維等高線圖4、補充圖形信息
包括:
plt.show():顯示圖形說明:可根據圖形布局需要使用 plt.tight_layout() 或其他布局控制方式。
從結構上看,三維繪圖并沒有脫離 Matplotlib 的通用模式。真正需要額外注意的,是不同圖形對數據組織方式的要求并不完全一樣。
四、三維繪圖中最常見的圖形類型
Matplotlib 支持多種三維圖形。最常見、也最值得先掌握的,主要是以下幾類。
![]()
1、三維散點圖
三維散點圖使用三個坐標值 (x, y, z) 來唯一確定一個點,因此它適合展示離散點在空間中的分布情況。
ax.scatter(xs, ys, zs)它常用于:
? 觀察三維數據的空間分布
? 比較樣本在三個變量上的位置
? 展示隨機點云或聚類結果
2、三維折線圖
三維折線圖用于繪制一條在空間中連續變化的軌跡。
ax.plot(xs, ys, zs)與二維折線圖相比,它多了一個 z 方向,因此更適合展示:
? 空間軌跡
? 螺旋線、參數曲線
? 某個變量隨路徑連續變化的過程
3、三維曲面圖
三維曲面圖用于展示二元函數的整體形狀。
ax.plot_surface(X, Y, Z)這里的 X、Y 和 Z 通常都是二維數組,它們共同描述平面上每個網格點的位置和該位置的高度值。因此,曲面圖特別適合:
? 數學函數圖像
? 地形高度圖
? 二維輸入、單一輸出的函數關系可視化
4、三維柱狀圖
三維柱狀圖在三維空間中繪制立體柱體。
ax.bar3d(x, y, z, dx, dy, dz)其中:
x、y、z 表示柱體底部起點;
dx、dy、dz 表示柱體在三個方向上的尺寸。
它適合用于:
? 多組分類數據的立體對比
? 展示“位置 + 高度”型數據
5、三維等高線圖
在三維坐標軸對象 ax 上,可使用:
ax.contour(X, Y, Z)繪制三維等高線。它本質上是在 3D 坐標系中展示等值線。
它有時也會配合投影一起使用,以幫助觀察曲面高度的層級變化,因此適合:
? 分析曲面的層級結構
? 配合曲面圖一起使用,增強對高度變化的理解
五、案例一:3D 散點圖
三維散點圖是最適合入門的圖形之一,因為它的數據組織方式最直接:只要準備三個一維數組,就可以構成一組三維坐標點。
plt.show()![]()
1、np.random.normal(0, 1, 100) 表示生成 100 個服從正態分布的隨機數,因此點云大致會集中在原點附近,但會向三維空間中隨機散開。
2、三維坐標軸是通過:
ax = fig.add_subplot(111, projection='3d')或者:
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})創建出來的。這說明當前子圖是一個三維投影坐標軸,而不是普通二維坐標軸。
3、scatter() 會把 x[i]、y[i]、z[i] 組合成一個空間點,因此 100 個元素會形成 100 個三維散點。
繪制出來的結果通常表現為一團分布在空間中的紅色點。它本質上展示的是三組隨機變量在三維空間中的聯合分布情況。雖然這里的數據是隨機生成的,但這種圖形在數據探索中很常見。例如,當我們有三個數值特征時,就可以用三維散點圖初步觀察:
? 點是否集中;
? 是否存在明顯的空間分層;
? 是否可能存在離群點。
六、案例二:3D 螺旋線與曲面圖
三維繪圖不僅可以單獨展示一種圖形,也可以與子圖機制結合起來,形成對比展示。下面這個例子在同一張畫布中放置兩個三維子圖:左側繪制螺旋線,右側繪制曲面圖。它有助于同時理解“空間軌跡”和“空間曲面”這兩種不同的數據表達方式。
plt.show()![]()
1、關于螺旋線圖
(1)為什么 x 和 y 會形成圓周運動
在這個例子中:
y1 = np.sin(t)這是參數方程中最經典的一組組合。因為對于任意參數 t,點 (cos(t), sin(t)) 都會落在單位圓上,所以從俯視角度看,這條曲線會繞著原點做圓周運動。
(2)為什么會變成螺旋線
如果只有 x = cos(t) 和 y = sin(t),那么得到的只是二維平面中的圓。現在再加入:
z1 = t這意味著隨著參數 t 增大,點在 z 方向不斷上升。于是,原本平面中的圓周運動就被“拉伸”為一條向上盤旋的空間曲線,也就是螺旋線。
(3)它適合表達什么
這類圖常用于說明:
? 參數曲線
? 周期運動與線性增長的結合
? 三維軌跡的連續變化
2、關于曲面圖
(1)為什么曲面圖通常要使用網格數據
三維曲面圖不是簡單地給出三個一維數組,而通常需要一個二維網格。也就是說,要先在平面上生成一系列 x 和 y 的組合點,再計算每個位置對應的函數值 z。例如:
Z2 = np.sin(np.sqrt(X2**2 + Y2**2))這里的 X2 和 Y2 表示平面上的網格點坐標,而 Z2 表示對應位置的高度。只有在這樣的網格結構上,plot_surface() 才能把這些點連接成連續的曲面。
(2)這個函數圖像有什么特征
函數:
Z = sin(sqrt(X^2 + Y^2))表示高度只與點到原點的距離有關,因此圖像通常會呈現一種以原點為中心向外擴散的波紋效果。它很像水面上出現的同心波。
(3)cmap='viridis' 的作用
cmap 用于設置顏色映射方案。曲面圖中不同高度會對應不同顏色,因此顏色本身也在幫助表達數值變化。viridis 是 Matplotlib 中較常用的一種漸變配色,層次清晰,適合展示連續數值變化。
(4)edgecolor='none' 的作用
它表示不繪制曲面網格邊界線。這樣圖面會更平滑,更適合觀察整體形狀。如果保留邊界線,圖會更強調網格結構,但也可能顯得更密、更雜。
七、如何理解三維圖的“觀看角度”
與二維圖相比,三維圖還有一個非常重要的問題:同一組數據,從不同角度觀察,視覺效果可能差異很大。
例如:
螺旋線從正面看,像一條起伏的曲線;
從上方俯視時,更像一個圓;
曲面圖從斜上方看,更容易看出高低起伏;
從正側面看,則可能只看到局部輪廓。
在實際繪圖中,可以通過下列方法調節觀察角度:
ax.view_init(elev=30, azim=45, roll=15)其中:
? elev=30:俯視角(elevation),表示觀察者相對于水平面的高低角度
? azim=45:方位角(azimuth),表示觀察者圍繞豎直軸旋轉的角度
? roll=15:滾轉角,圍繞 viewing axis(視線軸)旋轉的角度
例如,在前面的螺旋線示例中加上一句:
ax1.view_init(elev=25, azim=45)就可以讓讀者更容易看出它的盤旋上升結構。
說明:在基礎使用中,roll 參數可以省略,此時通常只調整 elev 與 azim。
對于三維圖來說,視角并不是純粹的“美化參數”,而是圖形表達的一部分。同一張圖,如果視角選擇不合適,可能會讓空間關系變得難以判斷。因此,學習三維繪圖時,應有意識地把“選擇觀察角度”也納入繪圖過程。
八、三維繪圖中常見的問題
Matplotlib 的 3D 功能適合教學演示、基礎可視化與輕量實驗;若需要更復雜的交互式三維場景,往往還需要專門的 3D 可視化工具。
在初學階段,三維繪圖經常會遇到以下幾類問題。
1、忘記創建三維坐標軸
如果只是寫:
ax = fig.add_subplot(111)那么創建出來的是二維坐標軸,而不是三維坐標軸。此時后續再傳入三維數據時,就會報錯或表現異常。因此必須加上:
projection='3d'2、曲面圖的數據維度不匹配
plot_surface(X, Y, Z) 要求 X、Y、Z 的形狀一致,通常都是二維數組。如果直接傳入一維數組,往往無法正確繪制曲面。
3、引號格式錯誤
有些課件或文檔中的代碼片段可能使用排版引號,如 ‘ ’ 或 “ ”。這些引號在 Python 中不是合法的字符串定界符。編寫代碼時應統一使用英文半角引號,例如:
ax.scatter(x, y, z, color='red')4、過度依賴三維圖
三維圖雖然直觀,但也更容易因為視角、遮擋和透視效果造成閱讀困難。因此在正式分析中,應根據任務選擇圖形,而不是為了“更立體”就一律改成三維圖。很多情況下,二維圖反而更清晰。
小結
Matplotlib 的三維繪圖建立在二維繪圖體系之上,核心在于創建三維坐標軸,并根據數據形狀選擇合適的繪圖方法。入門階段應重點掌握散點圖、折線圖、曲面圖及視角調整方法,從而建立對三維數據表達方式的基本理解。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
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.