在数据分析与学术研究中,二维图表往往难以全面展示复杂数据的空间关系和分布特征。而三维可视化能够更直观地呈现数据的多维度信息,无论是展示函数曲面、对比分组数据,还是分析空间分布,三维图表都能发挥独特作用。本文将基于 Python 的matplotlib
库,结合mpl_toolkits.mplot3d
模块,通过五个经典案例,详细讲解三维数据可视化的实现方法,并提供完整可复用的代码。
在开始可视化之前,我们需要导入必要的库,并进行全局参数设置,确保生成的图表符合学术规范且美观清晰。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
# 通用设置
plt.rcParams.update({
'font.family': 'Arial', # 使用学术常用字体
'font.size': 10,
'axes.titlesize': 12,
'axes.labelsize': 10,
'figure.dpi': 300, # 高分辨率输出
'savefig.bbox': 'tight', # 自动裁剪白边
'savefig.transparent': False
})
np.random.seed(42) # 固定随机种子
上述代码中,plt.rcParams.update
用于设置全局绘图参数,包括字体、字号、分辨率等;np.random.seed(42)
确保随机生成的数据可复现,方便调试和结果验证。
三维曲面图常用于展示二元函数的空间形态,在物理、数学、工程等领域应用广泛。
def plot_surface():
# 生成数据
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))
# 创建图表
fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
rstride=1, cstride=1,
linewidth=0, antialiased=True)
# 设置标签和标题
ax.set_title("3D Surface Visualization", pad=15)
ax.set_xlabel("X Axis", labelpad=10)
ax.set_ylabel("Y Axis", labelpad=10)
ax.set_zlabel("Z Value", labelpad=10)
# 颜色条
cbar = fig.colorbar(surf, shrink=0.5, aspect=10)
cbar.set_label("Value Scale", rotation=270, labelpad=15)
# 视角调整
ax.view_init(elev=25, azim=-45)
# 保存和显示
plt.savefig("surface_plot.pdf", dpi=300)
plt.show()
关键步骤解析:
np.meshgrid
创建二维网格,结合数学函数生成三维曲面数据。plot_surface
函数绘制曲面,cmap
参数指定颜色映射,rstride
和cstride
控制网格密度。view_init
函数设置仰角(elev
)和方位角(azim
),优化可视化效果。分类三维散点图可用于展示不同组别数据在三维空间中的分布特征,便于对比组间差异。
def plot_3d_scatter():
# 生成数据
N = 150
data = np.random.randn(N, 3) * 1.5
categories = np.random.choice(['Group A', 'Group B', 'Group C'], N)
# 创建图表
fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111, projection='3d')
# 颜色映射
colors = {'Group A': '#1f77b4', 'Group B': '#ff7f0e', 'Group C': '#2ca02c'}
# 分组建模
for cat in np.unique(categories):
mask = categories == cat
ax.scatter(data[mask, 0], data[mask, 1], data[mask, 2],
s=25, alpha=0.8,
color=colors[cat], edgecolor='w',
linewidth=0.3, label=cat)
# 标签和标题
ax.set_title("Multi-group 3D Scatter Plot", pad=15)
ax.set_xlabel("Feature 1", labelpad=10)
ax.set_ylabel("Feature 2", labelpad=10)
ax.set_zlabel("Feature 3", labelpad=10)
# 图例
ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
# 视角调整
ax.view_init(elev=20, azim=30)
plt.savefig("3d_scatter.pdf")
plt.show()
核心要点:
三维条形图能够在三维空间中展示多组数据的对比关系,适用于复杂的统计数据可视化。
def plot_3d_bar():
# 生成数据
x = np.arange(5)
y = np.arange(4)
x, y = np.meshgrid(x, y)
z = np.random.rand(4, 5) * 8 + 2
# 创建图表
fig = plt.figure(figsize=(7, 5))
ax = fig.add_subplot(111, projection='3d')
# 绘制3D条形
dx = dy = 0.5
bars = ax.bar3d(x.ravel(), y.ravel(), np.zeros_like(z.ravel()),
dx, dy, z.ravel(),
color=cm.viridis(z.ravel() / z.max()),
edgecolor='k', alpha=0.9)
# 标签设置
ax.set_title("3D Bar Chart Comparison", pad=15)
ax.set_xlabel("X Category", labelpad=10)
ax.set_ylabel("Y Category", labelpad=10)
ax.set_zlabel("Measurement", labelpad=10)
# 调整刻度
ax.set_xticks(x[0] + 0.5)
ax.set_xticklabels([f'C{i + 1}' for i in range(5)])
ax.set_yticks(y[:, 0] + 0.5)
ax.set_yticklabels([f'Set {i + 1}' for i in range(4)])
# 颜色条
cbar = fig.colorbar(bars, shrink=0.6)
cbar.set_label("Value Scale", rotation=270, labelpad=15)
ax.view_init(elev=35, azim=-50)
plt.savefig("3d_bars.pdf")
plt.show()
技术细节:
组合图将曲面与等高线结合,既能展示空间形态,又能突出数据分布的细节特征。
def plot_contour_surface():
# 生成数据
X = np.linspace(-3, 3, 100)
Y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(X, Y)
Z = np.exp(-(X ** 2 + Y ** 2)) + 0.5 * np.exp(-((X - 1) ** 2 + (Y + 1) ** 2))
fig = plt.figure(figsize=(7, 6))
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面
surf = ax.plot_surface(X, Y, Z, cmap='plasma',
rstride=2, cstride=2,
alpha=0.7, antialiased=True)
# 叠加等高线
levels = np.linspace(Z.min(), Z.max(), 15)
ax.contourf(X, Y, Z, zdir='z', offset=Z.min() - 0.1,
cmap='plasma', levels=levels, alpha=0.6)
# 标签设置
ax.set_title("Surface-Contour Hybrid Plot", pad=15)
ax.set_xlabel("X Axis", labelpad=12)
ax.set_ylabel("Y Axis", labelpad=12)
ax.set_zlabel("Z Value", labelpad=12)
ax.set_zlim(Z.min() - 0.1, Z.max())
# 颜色条
cbar = fig.colorbar(surf, shrink=0.6, aspect=10)
cbar.set_label("Density", rotation=270, labelpad=15)
ax.view_init(elev=25, azim=45)
plt.savefig("hybrid_plot.pdf")
plt.show()
重点操作:
参数化曲线可用于展示复杂的空间轨迹或函数关系,在数学建模和物理仿真中较为常见。
def plot_3d_curve():
# 生成螺旋数据
theta = np.linspace(-4 * np.pi, 4 * np.pi, 300)
z = np.linspace(-2, 2, 300)
r = z ** 2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
fig = plt.figure(figsize=(6, 5))
ax = fig.add_subplot(111, projection='3d')
# 绘制曲线
ax.plot(x, y, z, lw=1.5, color='#d62728', alpha=0.9)
# 标注设置
ax.set_title("3D Parametric Curve", pad=15)
ax.set_xlabel("X Axis", labelpad=10)
ax.set_ylabel("Y Axis", labelpad=10)
ax.set_zlabel("Z Axis", labelpad=10)
# 调整视角
ax.view_init(elev=15, azim=60)
plt.savefig("3d_curve.pdf")
plt.show()
操作要点:
plot
函数绘制三维曲线,设置线宽、颜色和透明度,突出曲线特征。通过主函数调用各个绘图函数,实现多个三维图表的批量生成与保存。
if __name__ == "__main__":
plot_surface() # 生成图1
plot_3d_scatter() # 生成图2
plot_3d_bar() # 生成图3
plot_contour_surface() # 生成图4
plot_3d_curve() # 生成图5
运行上述代码后,将在当前目录下生成 5 个 PDF 格式的三维图表文件,可直接用于学术论文、报告展示等场景。
本文通过五个典型案例,全面介绍了 Python 中三维数据可视化的实现方法。从基础的曲面绘制到复杂的组合图表,每个案例都提供了完整的代码和详细的解析。在实际应用中,可根据数据特点和需求调整参数,如颜色映射、视角、标签等,以达到最佳的可视化效果。