数据可视化一直是机器学习的重要部分,大多数数据可视化教程的基本内容包括:散点图,线图,箱形图,条形图和热图,虽然这些对于数据预处理来说基本够用,但是今天给大家分享另一种数据可视化图形——3D可视化。3D图可以让我们更加直观的了解数据之间的关系: x - y , x - z和y - z 。在本文中,我将简单介绍使用Matplotlib进行3D数据可视化。
3D散点图和线图
matplotlib中提供3D画图库为mplot3d,在使用时,我们通过一个关键字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。3D绘图库的用法与2D绘图基本一样。我们定义好x、y与z轴之间的数据关系即可,具体使用查看下边示例:
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曲面图
曲面图可以很好地提供了一个完整的结构来查看每个变量的值如何在另外两个轴的轴上变化。在Matplotlib中构建表面图是一个3个步骤的过程。
一、我们需要生成构成曲面图的实际点。注意生成3D曲面的所有点是不可能的,因为它们有无限个!因此我们将生成能够表示曲面的部分点,然后再估计其余的点。
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)
二、绘制线框,通过我们刚生成的点及关系式来绘制曲面图
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()
绘制结果为
最后,我们将曲面投影到线框估计上,并估计出其余的点。
ax = plt.axes(projection ='3d')
ax.plot_surface(X,Y,Z,rstride = 1,cstride = 1,
cmap ='winter',edgecolor ='none')
ax.set_title('曲面')
3D条形图
条形图是数据可视化中常用的一类图形,其能够以简单直观的方式反映出数据信息。 3D条形图的美妙之处在于它们保持了2D条形图的简单性,同时扩展了它们表示比较信息的能力。绘制条形图需要两个东西:位置和大小。 在3D条形图中,我们将选择z轴来表示高度; 因此,每个条形将从z = 0开始,其大小与我们试图可视化的值成比例。 x和y位置将表示横跨2D平面z = 0的条形坐标。我们将每个条形截面积都设置为1,使所有条形都具有相同的形状。下面为示例代码:
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()
可视化结果为