大多數數據可視化教程都給出了大致相同的基本內容:散點圖,折線圖,箱形圖,條形圖和熱圖等,一般都是2D平麵圖。
但是,如果我們希望跟進一步,該怎麽辦? 2D圖隻能顯示一對x–y軸之間的關係;而3D圖可以讓我們探索3對軸:X—y,X—z和y—z。
在本文中,我將向您簡要介紹使用Matplotlib進行3D數據可視化的方法。
3D散點圖和線圖[Scatter圖和Line圖]
Matplotlib中的3D繪圖通過啟用實用程序工具包開始。通過pip安裝時,mplot3d
庫隨您的標準Matplotlib安裝一起提供。隻要確保您的Matplotlib版本超過1.0。
導入此子模塊後,對於Matplotlib中的任何常規軸創建函數,可以通過傳遞projection=”3d”關鍵字來創建3D圖,:
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection=”3d”)
plt.show()
現在,我們的軸已創建,我們可以開始以3D繪圖。 3D繪圖功能非常直觀:scatter
我們稱之為scatter3D
,而不是僅通過X和y數據,我們越過X,y和z。其他所有功能設置(例如顏色和線型)均與2D繪圖功能相同。
這是繪製3D線和3D點的示例。
fig = plt.figure()
ax = plt.axes(projection="3d")
z_line = np.linspace(0, 15, 1000)
x_line = np.cos(z_line)
y_line = np.sin(z_line)
ax.plot3D(x_line, y_line, z_line, ‘gray’)
z_points = 15 * np.random.random(100)
x_points = np.cos(z_points) + 0.1 * np.random.randn(100)
y_points = np.sin(z_points) + 0.1 * np.random.randn(100)
ax.scatter3D(x_points, y_points, z_points, c=z_points, cmap=’hsv’);
plt.show()
這是有關3D繪圖的最棒的部分:互動性。一旦以3D繪圖,繪圖的交互性對於探索可視化數據非常有用。看看我通過在圖上進行簡單的click-and-drag創建的一些不同視圖!
曲麵圖[Surface圖]
曲麵圖對於可視化整個3D場景中3個變量之間的關係非常有用。他們給出了完整的結構,並介紹了每個變量的值如何沿其他兩個變量的軸變化。
在Matplotlib中構建曲麵圖是一個三步過程。
(1)首先,我們需要生成構成曲麵圖的實際點。現在,生成所有3D表麵的點是不可能的,因為它們的數目是無限的!因此,我們將生成足夠的數據來估計表麵,然後推斷其餘點。我們將定義X和y點,然後使用函數計算z點。
fig = plt.figure()
ax = plt.axes(projection="3d")
def z_function(x, y):
return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = z_function(X, Y)
(2)第二步是繪製線框,這是我們對表麵的估計。
fig = plt.figure()
ax = plt.axes(projection="3d")
ax.plot_wireframe(X, Y, Z, color='green')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
(3)最後,我們將曲麵投影到我們的線框估算值上並推斷所有點。
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='winter', edgecolor='none')
ax.set_title('surface');
漂亮吧!這就是我們豐富多彩的3D曲麵!
3D條形圖[bar圖]
條形圖在數據可視化項目中經常使用,因為它們能夠以簡單直觀的方式傳達信息,通常是某種類型的比較。 3D條形圖的優點在於,它們在保持2D條形圖的簡單性的同時又擴展了表示比較信息的能力。
條形圖中的每個條總是需要兩件事:位置和大小。借助3D條形圖,我們將為所有三個變量提供該信息x,y,z。
請查看下麵的代碼和3D圖以獲取示例!
fig = plt.figure()
ax = plt.axes(projection="3d")
num_bars = 15
x_pos = random.sample(xrange(20), num_bars)
y_pos = random.sample(xrange(20), num_bars)
z_pos = [0] * num_bars
x_size = np.ones(num_bars)
y_size = np.ones(num_bars)
z_size = random.sample(xrange(20), num_bars)
ax.bar3d(x_pos, y_pos, z_pos, x_size, y_size, z_size, color=’aqua’)
plt.show()