大多数数据可视化教程都给出了大致相同的基本内容:散点图,折线图,箱形图,条形图和热图等,一般都是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()