Matplotlib 3D 散点图函数
二维散点图常用于展示两个变量之间的关系,但有些数据可能会涉及三个变量。例如:
- 学生的:学习时长(X 轴)、睡眠时间(Y 轴)、考试成绩(Z 轴)。
- 城市的:经度(X 轴)、纬度(Y 轴)、人口数量(Z 轴)。
如果想要展示 3 个变量之间的关系,此时可以考虑使用 3D 散点图来实现。在 Matplotlib 中,我们可以使用 scatter() 函数在 3D 坐标系中绘制散点图。
语法:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(
xs,
ys,
zs,
s=None,
c=None,
marker='o',
cmap=None,
alpha=None,
**kwargs
)说明:
如果想要使用 3D 散点图,我们需要先从 mpl_toolkits.mplot3d 导入 Axes3D 类,然后使用 add_subplot() 函数创建一个 3D 的子图,最后再调用 scatter() 函数来创建 3D 散点图。
其中,scatter() 函数接收以下参数。
xs(必选):是一维数组或列表,表示散点的 x 坐标。ys(必选):是一维数组或列表,表示散点的 y 坐标。zs(必选):是一维数组或列表,表示散点的 z 坐标。其中,xs、ys 和 zs 的长度必须相同。s(可选):表示散点的大小。可以是一个标量(所有点大小相同),也可以是一个与 xs、 ys 和 zs 长度相同的数组或列表,用于设置每个点的大小。c(可选):表示散点的颜色。可以是一个单一的颜色值,也可以是一个与 xs、ys 和 zs 长度相同的数组或列表,用于设置每个点的颜色。可以使用颜色名称、十六进制颜色代码或 RGB/RGBA 元组。如果传入的是数值数组,则会根据 cmap 参数指定的颜色映射方案进行着色。marker(可选):表示散点的标记样式。常见的标记包括 'o' ( 圆圈 )、'*' ( 星号 )、'.' ( 点 )、'x' (X) 等。cmap(可选):指定颜色映射方案 (colormap)。只有当 c 参数传入的是数值数组时才有效。例如,'viridis'、'plasma'、'magma'、'coolwarm' 等。alpha(可选):表示散点的透明度,取值范围为 0 到 1。**kwargs:其他传递给 scatter 函数的关键字参数。
提示: 如果想要了解如何绘制二维散点图,另请参阅:Matplotlib 散点图。
Matplotlib 3D 散点图示例
接下来,我们通过几个简单例子来介绍一下 Matplotlib 是如何绘制 3D 散点图的。
示例 1:绘制基本的 3D 散点图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 生成随机数据作为散点的坐标
np.random.seed(19680801)
num_points = 50
x = np.random.randn(num_points)
y = np.random.randn(num_points)
z = np.random.randn(num_points)
# 绘制散点图
ax.scatter(x, y, z)
# 设置标题和标签
ax.set_title('基本 3D 散点图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们首先创建了一个 3D 的子图,然后使用 np.random.randn() (NumPy 提供的函数)生成了 50 个随机数作为 x、y 和 z 坐标。最后调用 ax.scatter() 函数,传入这些坐标数据来绘制 3D 散点图。
示例 2:自定义散点的大小和颜色
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 生成随机数据
np.random.seed(19680801)
num_points = 50
x = np.random.randn(num_points)
y = np.random.randn(num_points)
z = np.random.randn(num_points)
sizes = np.random.randint(10, 100, num_points) # 随机生成大小
colors = np.random.rand(num_points) # 随机生成颜色值
# 绘制散点图,自定义大小和颜色
scatter = ax.scatter(x, y, z, s=sizes, c=colors, cmap='viridis', alpha=0.6)
# 添加颜色条
fig.colorbar(scatter)
# 设置标题和标签
ax.set_title('3D 散点图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们为每个散点随机生成了大小(sizes)和颜色值(colors)。其中,将 sizes 传递给 s 参数,将 colors 传递给 c 参数,并使用 'viridis' 颜色映射方案。
此外,我们还使用了 fig.colorbar() 来添加一个颜色条,用于解释颜色值与实际颜色的对应关系。其中,alpha 参数用于设置散点的透明度。
示例 3:使用不同的标记样式
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 生成数据
np.random.seed(19680801)
num_points = 50
x = np.random.randn(num_points)
y = np.random.randn(num_points)
z = np.random.randn(num_points)
# 绘制散点图,使用星号标记
ax.scatter(x, y, z, marker='*')
# 设置标题和标签
ax.set_title('3D 散点图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个简单的例子中,我们通过将 marker 参数设置为 '*',将散点的标记样式更改为星号。小伙伴们可以尝试使用其他标记样式来对比一下。
Matplotlib 3D 散点图案例
假设有 30 个学生,我们记录了他们的学习时长、睡眠时间和考试成绩,此时可以使用 3D 散点图来直观展示。
示例 4:3D 散点图的实际应用
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 数据
np.random.seed(1)
study_hours = np.random.randint(1, 10, 30) # 学习时长
sleep_hours = np.random.randint(4, 9, 30) # 睡眠时间
scores = study_hours * 10 + sleep_hours * 5 + np.random.randint(-10, 10, 30)
# 绘图
scatter = ax.scatter(study_hours, sleep_hours, scores,
c=scores, cmap='coolwarm', s=80, alpha=0.8)
# 标题和标签
ax.set_title('学习时间 vs 睡眠时间 vs 成绩')
ax.set_xlabel('学习时长')
ax.set_ylabel('睡眠时间')
ax.set_zlabel('考试成绩')
# 颜色条
fig.colorbar(scatter, ax=ax, label='成绩高低')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们模拟了学生学习时长、睡眠时间与考试成绩的数据。study_hours 对应 x 轴,sleep_hours 对应 y 轴,而 scores 对应 z 轴。
通过将 scores 作为颜色值传递给 c 参数,并使用 'coolwarm' 颜色映射,我们可以通过散点的位置和颜色同时观察到这三个变量之间的关系。例如,颜色越暖(红色),代表成绩越高,我们可以直观地看到高分学生通常集中在学习时长和睡眠时间较长的区域。
此外,我们还使用 fig.colorbar() 添加了一个颜色条,从而使得图表更易于解读。
