You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib 3D散点图的轴面添加hist2d直方图?

在3D投影轴面上添加2D直方图的实现方案

要在3D散点图的对应轴面上嵌入2D直方图,核心思路是利用hist2d生成的统计数据,转换为3D绘图支持的格式后,通过plot_surface或pcolormesh在指定轴面绘制。以下是具体步骤和代码示例:

关键步骤说明

  • 提取hist2d核心数据:调用ax.hist2d()会返回counts(直方图计数数组)、xedges/yedges(坐标轴边缘值)、image(绘图对象),我们需要前三个数据重构3D轴面绘图数据。
  • 构建网格数据:用np.meshgrid()将边缘值转换为二维网格,匹配counts的维度。
  • 映射到3D轴面:使用pcolormesh(更贴合hist2d风格)或plot_surface,通过zdir指定目标轴面,offset设置该平面在对应轴上的固定位置(如轴的最小/最大值)。

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 替换为你的x、y、z序列
np.random.seed(42)
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)
z = np.random.normal(0, 1, 1000)
data = np.vstack([x, y, z])
kde = gaussian_kde(data)(data)  # 计算密度波动kde值

# 创建3D绘图对象
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D散点图
ax.scatter(x, y, z, c=kde, cmap='viridis', alpha=0.5)

# --------------------------
# 绘制XY平面的2D直方图(Z轴最小值处)
# --------------------------
counts_xy, xedges_xy, yedges_xy, _ = ax.hist2d(x, y, bins=20, alpha=0)  # alpha=0隐藏原绘图
X_xy, Y_xy = np.meshgrid(xedges_xy, yedges_xy)
Z_xy = np.full_like(X_xy, z.min())
ax.pcolormesh(X_xy, Y_xy, counts_xy.T, zdir='z', offset=z.min(), cmap='viridis', alpha=0.7)

# --------------------------
# 绘制XZ平面的2D直方图(Y轴最大值处)
# --------------------------
counts_xz, xedges_xz, zedges_xz, _ = ax.hist2d(x, z, bins=20, alpha=0)
X_xz, Z_xz = np.meshgrid(xedges_xz, zedges_xz)
Y_xz = np.full_like(X_xz, y.max())
ax.pcolormesh(X_xz, Z_xz, counts_xz.T, zdir='y', offset=y.max(), cmap='viridis', alpha=0.7)

# --------------------------
# 绘制YZ平面的2D直方图(X轴最小值处)
# --------------------------
counts_yz, yedges_yz, zedges_yz, _ = ax.hist2d(y, z, bins=20, alpha=0)
Y_yz, Z_yz = np.meshgrid(yedges_yz, zedges_yz)
X_yz = np.full_like(Y_yz, x.min())
ax.pcolormesh(Y_yz, Z_yz, counts_yz.T, zdir='x', offset=x.min(), cmap='viridis', alpha=0.7)

# 调整视图和标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.view_init(elev=30, azim=45)
plt.tight_layout()
plt.show()

可选调整

  • 若想用kde值替代hist2d计数:可基于x/y、x/z、y/z的二维数据单独计算kde,生成对应密度网格后替换代码中的counts_*数组。
  • 调整offset值:可选择轴的中位数、自定义偏移量,让直方图位置更贴合可视化需求。
  • 调整alpha参数:平衡直方图透明度与散点图的可见性。

内容的提问来源于stack exchange,提问作者SHexter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:46