2025 年 6 月 28 日
Charts SwiftUI&UI Frameworks visionOS WWDC WWDC25從平面到立體:深度解析 Swift Charts 3D 的技術演進與實務應用
為何數據視覺化需要「第三個維度」?
在開發者處理複雜的現實世界數據時,往往會遇到「維度擠壓」的困境。無論是氣象觀測中的溫濕度變化,或是健康 App 中的多項生理指標,傳統的 2D 圖表在呈現三個以上變數的相關性時,通常需要拆解成多張圖表,這使得使用者難以在腦海中拼湊出數據的全貌。
Apple 在最新發布的 iOS、macOS 以及 visionOS 26 中,正式為 Swift Charts 引入了 3D 支援。這項更新具備深遠的策略意義:它不單純是視覺上的裝飾(Eye Candy),更是為了解決數據理解深度的突破。傳統平面在處理如「喙長 beak length」、「翅膀長度 flipper length」與「體重 body mass」等三維變數時,必須透過多個散佈圖來回比對;而 3D 圖表的引入,讓開發者能在單一座標系統中揭示數據間的隱性結構。這標誌著 Swift Charts 從單純的報表工具,演進為強大的空間數據探索平台。
核心架構轉移:從 Chart 到 Chart3D 的無縫銜接
對於已經熟悉 Swift Charts 的開發者來說,邁入 3D 領域的學習曲線被刻意設計得極其平緩。Apple 保持了 API 的高度一致性,核心架構從原本的 Chart 容器轉移至 Chart3D。值得注意的是,這不僅限於點陣資料,開發者熟悉的 PointMark、RuleMark 與 RectangleMark 全數都已更新支援 3D 空間。
Chart3D 與傳統 Chart 的核心差異在於 Z 軸(Z value) 的引入。在 2D 環境中,我們僅需定義 X 與 Y,但在 3D 空間中,數據結構轉變為包含深度的三元組,系統會自動處理投影與深度排序。
Chart3D(penguins) { penguin in
PointMark(
x: .value("翅膀長度 (mm)", penguin.flipperLength),
y: .value("體重 (g)", penguin.bodyMass),
z: .value("喙長 (mm)", penguin.beakLength)
)
.foregroundStyle(by: .value("物種", penguin.species))
}
.chartXAxisLabel("翅膀長度 (mm)")
.chartYAxisLabel("體重 (g)")
.chartZAxisLabel("喙長 (mm)")
.chart3DPose(.front) // 鎖定最佳初始視角
然而,身為專業開發者,必須審慎評估數據的呈現方式。關於 3D 圖表的適用時機,Apple 講者給出了精確的建議:
3D 圖表在數據形狀比精確數值更重要時最能發揮作用。特別是當數據本身具備三維物理空間屬性,或是需要透過互動來強化理解時,3D 才是正確的選擇。
在掌握基礎架構後,我們將透過具體的標記來實踐多維數據的視覺化。
實戰演練:利用 PointMark 進行多維度數據聚類分析
為了展示 3D 空間的優勢,我們以經典的「阿德利企鵝數據集 Palmer Archipelago penguins」為例。此數據集包含三種企鵝(Chinstrap、Gentoo、Adélie)的多項生理特徵。在 2D 散佈圖中,我們可能需要至少三張圖表才能勉強觀察出物種間的差異。
但在 Chart3D 中使用 PointMark,我們可以同時將翅膀長度設為 X 軸、體重設為 Y 軸、喙長設為 Z 軸。透過這三個維度的交織,三個物種的數據點會在空間中自然形成明顯的族群聚類(Clusters)。
開發者可以透過 Swift Charts 內建的手勢支援,讓使用者旋轉圖表以尋找最佳視角。例如,當從側面觀察時,3D 圖表會轉化為類似 2D 的投影,方便對比特定兩個屬性的關係;而旋轉至特定角度時,三個物種間的界線變得清晰可辨,這是傳統平面圖表難以達成的直觀感受。
除了離散的點資料,Swift Charts 3D 亦能處理連續的數學函式與統計模型。
進階視覺化:SurfacePlot 與線性回歸的曲面呈現
在科學運算與統計預測中,SurfacePlot 是本次更新的一大技術亮點。它是 WWDC24 引入的 LinePlot API 在 3D 空間的自然延伸。當我們需要呈現複雜的數學曲面或統計模型時,SurfacePlot 提供了強大的戰略支援。
SurfacePlot 的運作邏輯基於函數評估:它接受一個傳入兩個獨立變數(Independent variables,X 與 Z)並回傳一個相依變數(Dependent variable,Y,代表高度值)的閉包。系統會自動在定義域內計算這些數值,並生成一個連續的曲面。這在視覺化「線性回歸 Linear Regression」模型時極具價值。例如,我們可以建立一個模型來根據翅膀長度與喙長預測企鵝體重,透過 SurfacePlot 呈現一個平滑的斜面,並將實際的數據點與此曲面交織。開發者能一眼看出模型預測(曲面)與真實數據(點)的吻合程度,直觀地驗證變數間的正相關性。
Chart3D {
SurfacePlot(x: "翅膀長度", y: "體重", z: "喙長") { x, z in
// 線性回歸模型預測體重(替換為實際 fitted 係數)
return 45.2 * x + 32.7 * z - 5200.0
}
.foregroundStyle(.heightBased)
// 疊加真實數據點
ForEach(penguins) { penguin in
PointMark(
x: .value("翅膀長度", penguin.flipperLength),
y: .value("體重", penguin.bodyMass),
z: .value("喙長", penguin.beakLength)
)
}
}
當圖表具備了厚度與曲面,開發者接下來必須精確控制用戶的觀察視角,以確保數據不被誤讀。
視覺心理學:姿勢 Pose 與投影 Projection 的精準控制
3D 視角雖然資訊豐富,但也帶來了額外的認知負荷。若初始視角選擇不當,數據可能會互相遮擋。因此,透過 .chart3DPose() 修正初始化「姿勢」至關重要。開發者可以使用預設常數如 .front,或自定義 Azimuth(方位角,左右旋轉)與 Inclination(傾角,上下俯視)來鎖定最佳觀察點。
此外,投影方式的選擇直接影響了使用者對空間的感知。透過 .chart3DCameraProjection() 標籤,我們可以切換兩種模式:
- 正視投影 Orthographic:這是預設模式。無論數據點在前方或後方,大小保持一致,平行線不會交匯。這種投影方式消除了透視造成的形變,最利於精確比對不同深度數據點間的數值
- 透視投影 Perspective:遠處物體變小,平行線向遠方匯合。這能提供強烈的沉浸感,特別是在 visionOS 等空間運算裝置上,利用硬體帶來的深度知覺,能讓數據看起來更加真實且具備層次感
為了增強視覺引導,SurfacePlot 還支援透過 .foregroundStyle() 套用特殊的著色樣式:
.heightBased:根據表面高度(Y 軸)自動套用漸層,強化起伏感.normalBased:根據曲面的法線角度(斜率)著色,有助於觀察地形或函數變化的劇烈程度
開啟開發者的三維數據視野
Swift Charts 3D 的推出,並不僅是 API 的增補,而是 Apple 數據視覺化生態的一次重大躍升。它在 visionOS 上展現了原生的空間優勢,將數據從冰冷的像素轉化為可互動、可觸摸的立體存在。對於空間運算(Spatial Computing)而言,透視投影與手勢互動的結合,讓探索數據變得像觀察實體物件一樣自然。
我們必須謹記講者的警示:互動性是理解 3D 數據的核心。 靜止的 3D 圖表往往帶有欺騙性,若你的應用場景無法提供互動,則應優先考慮 2D 呈現。但當使用者能透過手勢撥動數據、從不同方位審視模型時,隱藏在維度背後的洞見才會真正浮現。
在你的下一個專案中,有哪些數據維度是過去被擠壓在 2D 平面,而現在正等待在 3D 空間中被釋放的?
關於 XcodeProject
XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。