如何使用Python绘制3D直方图展示不同条件B下属性A的频数分布
Python 3D直方图绘制方案
依赖安装
首先安装需要的第三方库:
pip install numpy matplotlib
实现代码
你只需要替换代码中B_values和A_data_list为你的实际实验数据即可直接运行:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # ---------------------- 替换为你的真实数据 ---------------------- # 所有条件B的取值,和示例中的温度值对应 B_values = [200, 250, 300, 350, 400] # 每个B值对应的属性A的原始采集数据,顺序和B_values一一对应 # 此处为模拟数据,直接替换为你的实验数据即可 A_data_list = [] for b in B_values: # 模拟随B值变化的A数据,演示用 A_data = np.random.normal(loc=b*0.02, scale=0.5, size=1000) A_data_list.append(A_data) # 属性A的统计区间,可根据你的A的实际取值范围调整bins数量 A_bins = np.linspace(-2, 4, 30) # -------------------------------------------------------------- fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') # 遍历所有B值对应的数据绘制直方图 for z_idx, (b_val, a_data) in enumerate(zip(B_values, A_data_list)): # 计算A数据的直方图频数 hist, bin_edges = np.histogram(a_data, bins=A_bins) # 取区间中点作为x轴坐标 x_coords = (bin_edges[:-1] + bin_edges[1:]) / 2 # 沿z轴排布不同B的直方图 ax.bar( x=x_coords, height=hist, zs=z_idx, zdir='z', alpha=0.7, width=np.diff(A_bins)[0] * 0.8 ) # 设置坐标轴信息 ax.set_xlabel('属性A') ax.set_ylabel('频数') ax.set_zlabel('条件B') # 把z轴刻度替换为实际的B值 ax.set_zticks(range(len(B_values))) ax.set_zticklabels(B_values) # 调整观察视角,可自行修改参数调整角度 ax.view_init(elev=30, azim=-60) plt.tight_layout() plt.show()
自定义调整说明
- 可修改
ax.bar中的alpha参数调整条形透明度,传入color参数为不同B的直方图设置区分色 - 调整
view_init的elev和azim参数可以修改3D图的观察角度 - 修改
A_bins的区间和数量可以调整直方图的统计精度
内容的提问来源于stack exchange,提问作者bad_chemist
相关产品推荐
相关产品推荐

