每位数据科学家都应该知道如何创建有效的数据可视化。如果没有可视化,你就会在试图处理数字和想象成千上万的数据点中陷入困境,!
除此之外,它还是与非技术业务利益相关者进行有效沟通的重要工具,他们可以通过图片而不仅仅是单词更容易地理解您的结果。
大多数数据可视化教程都展示了相同的基本内容:散点图,直线图,箱形图,条形图和热图。这些都非常适合快速、高水平地了解数据集。
但是,如果我们更进一步,那该怎么办呢?2D图只能显示单对轴x - y之间的关系;3D图可以让我们探索3对轴的关系:x - y,x - z和y - z。
在本文中,我将简单介绍使用Matplotlib进行3D数据可视化。最后,您将能够将3D绘图添加到数据科学工具包中!
3D散点图和直线图
Matplotlib中的3D绘图首先启用实用工具集。我们可以通过导入mplot3d库来启用此工具包,该库通过pip安装标准的Matplotlib。请确保您的Matplotlib版本超过1.0。
导入该子模块后,可以通过将关键字projection="3d"传递给Matplotlib中的任何常规轴创建函数来创建3D图:
from mpl_toolkits import mplot3dimport numpy as npimport matplotlib.pyplot as pltfig = plt.figure()ax = plt.axes(projection="3d")plt.show()
![1732a4788861a093353abd1041ac4d84.png](https://i-blog.csdnimg.cn/blog_migrate/38f28965a7e10b9673c9a8b6f591ac16.jpeg)
![2752fc0c8945562ad819b6af57203fb2.png](https://i-blog.csdnimg.cn/blog_migrate/a97de7764f6b25e8b5380c5bd5438e1a.jpeg)
现在我们已经创建了坐标轴,我们可以开始绘制3D图了。3D绘图函数非常直观:而不是分散scatter3D ,而是传递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()
![9d4c6d98529c771d2026391da797fc20.png](https://i-blog.csdnimg.cn/blog_migrate/154a3a81b03482a951a81f2fb8881295.jpeg)
![0faf5711dd7cf4008801e39260d93432.png](https://i-blog.csdnimg.cn/blog_migrate/e573752d7b3d3caf7b132e90ebe682b1.jpeg)
这是关于3D绘图的最棒的部分:交互性。在绘制3D图形后,绘图的交互性对于探索可视化数据非常有用。通过简单地点击并拖动绘图,查看我创建的一些不同视图!
![e713c30b73926572bfb36a3f6f78d51f.png](https://i-blog.csdnimg.cn/blog_migrate/8b82dc55fa9d2b2d08d9723cf88485a7.jpeg)
曲面图
曲面图可以很好地显示整个3D景观中3个变量之间的关系。它们提供了一个完整的结构和视图,并查看每个变量的值如何在另外两个轴上的变化。
在Matplotlib中构建曲面图有3个步骤的过程。
(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)
![00dea5a7c217c2d5e7e57a2934d29f3e.png](https://i-blog.csdnimg.cn/blog_migrate/470bb400bd12827cc0c2de28c4d36f6a.jpeg)
(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()
![96c5dabc393b6ceaef6b0123c875e8d7.png](https://i-blog.csdnimg.cn/blog_migrate/5cb5d2663748d9d41c31f52c7af150ae.jpeg)
![df11ae17da2e981d09f1392355c89d85.png](https://i-blog.csdnimg.cn/blog_migrate/8dc561649a47cc579de551bc0c8e8154.jpeg)
(3)最后,我们将曲面投影到线框估计值上,并推断出所有点。
ax = plt.axes(projection='3d')ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='winter', edgecolor='none')ax.set_title('surface');
![ac5c30356e64b0053f5d8db130bc5f52.png](https://i-blog.csdnimg.cn/blog_migrate/de49e69314a87d28ea99e4f2f31546f1.jpeg)
![eab3e77eff5909bcc2807407d0f0a7da.png](https://i-blog.csdnimg.cn/blog_migrate/5994d7d8a1b0454a188519f6598633fa.jpeg)
这是我们彩色的3D曲面!
3D条形图
条形图在数据可视化项目中经常使用,因为它们能够以简单直观的方式传递信息,通常是某种类型的比较。3D条形图的美妙之处在于它们保持了2D条形图的简单性,同时扩展了它们表示比较信息的能力。
条形图中的每个条形图总是需要两个东西:位置和大小。使用3D条形图,我们将为所有三个变量x,y,z提供该信息。
我们将选择z轴来编码每个条的高度;因此,每个条形将从z = 0开始,其大小与我们试图可视化的值成比例。x和y的位置表示横轴在z = 0的2D平面上的坐标。我们将设置每个条的x和y大小为1,这样所有条都具有相同的形状。
查看下面的代码和3D图表作为示例!
fig = plt.figure()ax = plt.axes(projection="3d")num_bars = 15x_pos = random.sample(xrange(20), num_bars)y_pos = random.sample(xrange(20), num_bars)z_pos = [0] * num_barsx_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()
![044a607d512aaf56b2c134f8144a9586.png](https://i-blog.csdnimg.cn/blog_migrate/93296418b19ed923e5ca9fe4cd69203e.jpeg)
![f1a8bb46b3df4369b4ebd4fa05cb4dee.png](https://i-blog.csdnimg.cn/blog_migrate/84607b124681425590f70651a7683d2d.jpeg)