当前位置: 首页>>技术教程>>正文


python - 轻松学会Matplotlib 3D绘图

技术教程 , , 去评论

 

大多数数据可视化教程都给出了大致相同的基本内容:散点图,折线图,箱形图,条形图和热图等,一般都是2D平面图。

但是,如果我们希望跟进一步,该怎么办? 2D图只能显示一对x--y轴之间的关系;而3D图可以让我们探索3对轴X--yX--zy--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,而不是仅通过Xy数据,我们越过Xyz。其他所有功能设置(例如颜色和线型)均与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表面的点是不可能的,因为它们的数目是无限的!因此,我们将生成足够的数据来估计表面,然后推断其余点。我们将定义Xy点,然后使用函数计算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()


参考资料

本文由《纯净天空》出品。文章地址: https://vimsky.com/article/4328.html,未经允许,请勿转载。