如何在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
相关产品推荐
相关产品推荐

