如何使用Matplotlib叠加三个双峰直方图并展示实际值而非分箱区间
代码调整方案
核心调整逻辑
因为你的三个向量都只有两个非常接近的离散取值,默认hist的自动分箱规则会把这些相近值合并,无法呈现真实的分布情况,因此改用直接统计实际唯一值+计数的方式绘制柱状图,完全匹配你的需求。
调整后完整代码
import matplotlib.pyplot as plt import numpy as np x1 = [0.003996747444034554, 0.003996747444034554, 0.003996747458586469, 0.003996747444034554, 0.003996747444034554, 0.003996747444034554, 0.003996747458586469, 0.003996747444034554, 0.003996747444034554, 0.003996747444034554] x2 = [0.003996536252088845, 0.003996536252088845, 0.003996536252088845, 0.003996536310296506, 0.003996536252088845, 0.003996536252088845, 0.003996536252088845, 0.003996536252088845, 0.003996536252088845, 0.003996536252088845] x3 = [0.003996643703430891, 0.003996643703430891, 0.003996643703430891, 0.003996643703430891, 0.003996643703430891, 0.003996643761638552, 0.003996643703430891, 0.003996643703430891, 0.003996643703430891, 0.003996643703430891] plt.figure(figsize=(10, 5)) # 匹配数值差异量级设置柱宽,避免柱子重叠 bar_width = 1e-11 # 遍历三个向量绘制柱状图 for x, label, color in zip([x1, x2, x3], ['x1', 'x2', 'x3'], ['#1f77b4', '#ff7f0e', '#2ca02c']): # 直接统计实际唯一值和对应出现次数 vals, counts = np.unique(x, return_counts=True) plt.bar(vals, counts, width=bar_width, label=label, alpha=0.7, color=color) # 配置横轴显示完整实际值,关闭科学计数法和偏移 plt.ticklabel_format(axis='x', useOffset=False, style='plain') plt.xticks(rotation=45) plt.xlabel('取值') plt.ylabel('出现次数') plt.legend() plt.tight_layout() plt.show()
效果说明
- 三个二值分布全部绘制在同一绘图区域,通过颜色和标签区分
- 横轴完全使用数据的实际取值展示,不会出现分箱合并的问题
- 透明度设置避免数值接近的柱子完全遮挡,可同时看清三个分布的取值和计数
如果你需要的是分组并列展示而非半透明重叠,只需调整每个向量柱子的横向偏移量即可。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

