繪制 3D 圖形
到目前為止,我們一直在討論有關 2D 圖形的繪制方法和繪制技術。3D 圖形也是數據可視化的 一個很重要的應用方面,我們接下來就重點講解有關 3D 圖形的實現方法。繪制 3D 圖形通常需要導 入 mpl_toolkits 包中的 mplot3d 包的相關模塊,如 axes3d 模塊,模塊 axes3d 中包含類 Axes3D,對象 Axes3D 可以在 2D 的 matplotlib 畫布中繪制 3D 圖形對象。
一,繪制帶顏色標尺的彩色曲面
在 2D 畫布中繪制 3D 圖形時,繪制的本質就是繪制三維曲面,即由一對有序數對映射成的數據 值和有序數對所組成的三元元組在畫布上的描點成面。這個三維曲面不僅可以著色,還可以按照曲 面的高度分別涂上不同的顏色,同時用顏色標尺進行注釋,說明高度變化。接下來,我們就講解帶 顏色標尺的彩色曲面的繪制方法。
1.代碼示例
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection="3d")x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
x, y = np.meshgrid(x, y)
r = np.sqrt(np.power(x, 2) + np.power(y, 2))
z = np.sin(r)# plot 3d surface
surf = ax.plot_surface(x, y, z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False)# customize the z axis
ax.set(zlim=(-1, 1))
ax.zaxis.set_major_locator(LinearLocator(7))
ax.zaxis.set_major_formatter(FormatStrFormatter("%3.2f"))# add a color bar mapping values to colors
fig.colorbar(surf, shrink=0.6, aspect=10)plt.show()
2.代碼解釋?
為了繪制 3D 圖形,需要從 mpl_toolkits 包里的 mplot3d 包的 axes3d 模塊中導入類 Axes3D,實 現在 2D 的 matplotlib 畫布中繪制 3D 圖形對象的目標。
(1)通過調用“plt.figure()”語句,生成類 Figure 的實例 fig。
(2)向畫布 fig 中添加 3D 投影模式的子區,得到可以繪制 3D 圖形的坐標軸實例 ax。 接下來,設置 x 軸、y 軸和 z 軸的數據內容。
(3)這樣,我們就可以在坐標軸實例 ax 中,調用類 Axes3D 的實例方法 plot_surface()繪制曲 面了。通過參數 rstride 和 cstride 設置曲面上單位曲面的大小,參數 cmap 用于設置曲面補片的顏 色映射表類型。單位曲面(曲面補片)的銜接線的線條寬度設置為 0,以求突出曲面補片的顏色 變化情況。
(4)為了使 z 軸的刻度線和刻度標簽更加清晰和直觀,使用一組代碼對 z 軸的刻度線和刻度標 簽進行定制化設置,主要調整刻度線的數量和刻度標簽的小數點位數。
(5)向畫布中的曲面實例添加顏色標尺,通過參數 shrink 設置顏色標尺的整體大小,通過參數 aspect 設置標尺框的長和寬的比例。 這樣,通過上面的 Python 代碼,我們就完成了帶顏色標尺的彩色曲面的繪制任務。
二,在3D 空間里分層展示投射到指定平面后的2D 柱狀圖
我們在 2D 平面上可以繪制柱狀圖,如果要繪制多組數據的柱狀圖,則可以嘗試使用堆疊柱狀 圖或并列柱狀圖。但是,如果數據組數過多,那么使用這兩種柱狀圖展示數據的可視化效果就不是 很理想。這時候,我們可以先將多組數據的柱狀圖投射到指定平面上,再借助指定坐標軸將投射后 的柱狀圖分層,從而在 3D 空間里實現多組數據的分層展示的 2D 柱狀圖的繪制任務。?
1.代碼示例
import matplotlib.pyplot as plt
import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection="3d")colorsList = ["r", "b", "y"]
yLayersList = [2, 1, 0]for color, layer in zip(colorsList, yLayersList):x = np.arange(10)y = np.random.rand(10)ax.bar(x, y, zs=layer, zdir="y", color=color, alpha=.7)ax.set(xlabel="X", ylabel="Y", zlabel="Z", yticks=yLayersList)plt.show()
2.代碼解釋?
(1)需要從 mpl_toolkits 包里的 mplot3d 包的 axes3d 模塊中導入類 Axes3D,實現在 2D 的 matplotlib 畫布中繪制 3D 圖形對象的目標。
(2)調用模塊 pyplot 中的函數 figure(),生成類 Figure 的實例 fig。
(3)向畫布 fig 中添加 3D 投影模式的子區,得到可以繪制 3D 圖形的坐標軸實例 ax。
(4)分別設置柱狀圖的柱體顏色和柱狀圖投射層次的序號,分別存儲在列表 colorsList 和 yLayersList 中。
(5)借助內置函數 zip(),獲得顏色和層次序號的元組列表,通過 for 循環實現迭代繪制柱狀圖 的目標。
(6)在 for 循環中,需要重點說明語句塊“ax.bar(x,y,zs=layer,zdir="y",color=color,alpha=.7)”的 作用,也就是類 Axes3D 的實例方法 bar()的使用方法。其中,參數 x 表示柱體左邊位置的列表;參 數 y 表示柱體高度的列表;參數 zs 是將柱狀圖進行投射的層次序號;參數 zdir 是將 z 軸用來表示柱 體的高度,即將 y 軸設定成 z 軸;參數 zs 和 zdir 組合使用的效果就是在 y 軸的刻度線位置 2、1 和 0 處所在的與 z 軸所屬平面平行的平面上繪制 2D 柱狀圖;參數 color 用于設置柱體的顏色;參數 alpha 用于設置柱體的透明度。這樣,我們就將 2D 柱狀圖投射到 z 軸所屬的平面上,再借助 y 軸分層展示投射到 z 軸所屬平面上的 2D 柱狀圖,從而實現在 3D 空間里分層展示投射到指定平面 后的 2D 柱狀圖。
(7)通過調用實例方法 set(),統一設置 x 軸、y 軸和 z 軸的坐標軸標簽,以及將 y 軸的刻度線位 置設置成投射層次的位置序號。類 Axes 的實例方法 set()是屬性批量設置器,也就是說,可以將類 Axes 的若干屬性設置一起放在實例方法 set()中來實現。
三,在 3D 空間里繪制散點圖
我們可以在 2D 平面內繪制散點圖,但在很多時候,出于實際項目需要,需要在 3D 空間里繪制 散點圖。在 3D 空間里繪制散點圖,就是在 x 軸和 y 軸之外再添加一條 z 軸后,使用三元有序數對在 3D 空間里進行描點。下面,我們就介紹在 3D 空間里繪制散點圖的實現方法。
1.代碼示例
import matplotlib.pyplot as plt
import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = fig.add_subplot(projection = '3d')xs = np.random.rand(50) * 10
ys = np.random.rand(50) * 10 + 20
zs1 = np.random.rand(50) * 10
zs2 = np.sqrt(xs ** 2 + ys ** 2)ax.scatter(xs, ys, zs=zs1, zdir="z", c="cornflowerblue", marker="o", s=40)
ax.scatter(xs, ys, zs=zs2, zdir="z", c="purple", marker="^", s=40)ax.set(xlabel="X", ylabel="Y", zlabel="Z")plt.show()
2.代碼解釋?
與前面講過的導入 3D 繪圖模式一樣,同樣從 mpl_toolkits 包里的 mplot3d 包的 axes3d 模塊中導 入類 Axes3D,實現在 2D 的 matplotlib 畫布中繪制 3D 圖形對象的目標。
(1)調用模塊 pyplot 中的函數 figure(),生成類 Figure 的實例 fig。
(2)調用實例方法 add_subplot()獲得 3D 模式下的坐標軸實例 ax。
(3)構建一組模擬數據 xs、ys、zs1 和 zs2,用于繪制 3D 空間里的散點圖。
(4)調用類 Axes3D 的實例方法 scatter(),實例方法 scatter()的大部分參數與 2D 平面里的實例 方法 scatter()的大部分參數相同。這里需要重點說明的就是參數 zs。參數 zs 是與 xs 和 ys 數組長度 相同的數組,將 z 軸本身作為 z 坐標軸,這樣,就會在 z 軸上的 zs 列表里的元素的位置處繪制由 xs 和 ys 的對應位置的元素所組成的有序數對的坐標點。
(5)調用“ax.set(xlabel="X",ylabel="Y",zlabel="Z")”語句,設置 x 軸、y 軸和 z 軸的坐標軸標簽。 這樣,通過上面的操作步驟,就可以完成在 3D 空間里繪制散點圖的數據可視化任務。