Python 数据可视化全场景实现(二):三维数据可视化实战

在数据分析与学术研究中,二维图表往往难以全面展示复杂数据的空间关系和分布特征。而三维可视化能够更直观地呈现数据的多维度信息,无论是展示函数曲面、对比分组数据,还是分析空间分布,三维图表都能发挥独特作用。本文将基于 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)确保随机生成的数据可复现,方便调试和结果验证。

二、三维可视化案例详解

案例 1:三维曲面图

三维曲面图常用于展示二元函数的空间形态,在物理、数学、工程等领域应用广泛。

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()

关键步骤解析

  1. 数据生成:使用np.meshgrid创建二维网格,结合数学函数生成三维曲面数据。
  2. 曲面绘制plot_surface函数绘制曲面,cmap参数指定颜色映射,rstridecstride控制网格密度。
  3. 视角调整:通过view_init函数设置仰角(elev)和方位角(azim),优化可视化效果。Python 数据可视化全场景实现(二):三维数据可视化实战_第1张图片

案例 2:分类三维散点图

分类三维散点图可用于展示不同组别数据在三维空间中的分布特征,便于对比组间差异。

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()

核心要点

  1. 分组绘制:通过循环遍历不同组别,使用scatter函数分别绘制散点,并设置对应颜色。
  2. 图例设置legend函数添加图例,bbox_to_anchor参数调整图例位置,避免遮挡数据。Python 数据可视化全场景实现(二):三维数据可视化实战_第2张图片

案例 3:三维条形图

三维条形图能够在三维空间中展示多组数据的对比关系,适用于复杂的统计数据可视化。

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()

技术细节

  1. 条形绘制bar3d函数绘制三维条形,通过ravel函数将二维数据展平为一维,便于批量绘制。
  2. 颜色映射:根据条形高度映射颜色,直观展示数据大小差异。Python 数据可视化全场景实现(二):三维数据可视化实战_第3张图片

案例 4:曲面 - 等高线组合图

组合图将曲面与等高线结合,既能展示空间形态,又能突出数据分布的细节特征。

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()

重点操作

  1. 等高线绘制contourf函数绘制填充等高线,zdir参数指定等高线投影方向,offset控制等高线位置。
  2. 图层融合:通过调整alpha参数,实现曲面与等高线的透明叠加,增强可视化层次感。Python 数据可视化全场景实现(二):三维数据可视化实战_第4张图片

案例 5:参数化三维曲线

参数化曲线可用于展示复杂的空间轨迹或函数关系,在数学建模和物理仿真中较为常见。

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()

操作要点

  1. 参数方程:根据数学参数方程生成三维坐标数据。
  2. 曲线绘制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 数据可视化全场景实现(二):三维数据可视化实战_第5张图片

四、总结与拓展

本文通过五个典型案例,全面介绍了 Python 中三维数据可视化的实现方法。从基础的曲面绘制到复杂的组合图表,每个案例都提供了完整的代码和详细的解析。在实际应用中,可根据数据特点和需求调整参数,如颜色映射、视角、标签等,以达到最佳的可视化效果。

你可能感兴趣的:(Python基础,信息可视化,python,开发语言,可视化,论文)