如何基于已知自定义频率/数密度值绘制直方图
固定分箱对应已知y值的直方图绘制方案(Python Matplotlib)
你遇到的问题核心是:Matplotlib 常用的plt.hist()接口要求输入原始样本数据,由程序自动完成分箱计数逻辑,不适合已经提前提取到每个分箱对应数密度/占比的场景。这种场景直接用柱状图接口自定义分箱宽度、位置即可,完全复现标准直方图效果。
示例可运行代码
以下代码直接匹配给出的3组分箱测试数据:
import matplotlib.pyplot as plt import numpy as np # 输入自定义分箱边界,按从小到大排列 bin_edges = [4.2, 4.3, 4.4, 4.5] # 每个分箱对应的y轴数值(数密度/占比),顺序和分箱区间一一对应 # 对应区间依次为:4.2-4.3nm、4.3-4.4nm、4.4-4.5nm bin_density = [0, 33, 40] # 自动计算每个分箱的宽度、中心横坐标 bin_width = np.diff(bin_edges) bin_center = bin_edges[:-1] + bin_width / 2 # 初始化画布 plt.figure(figsize=(6, 4), dpi=120) # 绘制柱形:宽度匹配分箱宽度,加黑色描边匹配标准直方图样式 plt.bar( x=bin_center, height=bin_density, width=bin_width, edgecolor="black", color="#4c72b0", linewidth=1 ) # 坐标轴配置 plt.xlabel("粒径 (nm)") plt.ylabel("数密度占比 (%)") plt.xlim(4.15, 4.55) # x轴两侧留少量边距 plt.ylim(0, 45) # y轴上限略大于最大y值 plt.xticks(bin_edges) # x轴刻度直接显示分箱边界 # 隐藏上、右侧边框,匹配科研绘图常用样式 plt.gca().spines["top"].set_visible(False) plt.gca().spines["right"].set_visible(False) plt.tight_layout() plt.show()
适配自定义数据的注意事项
- 替换数据时只需要修改
bin_edges(所有分箱的边界值)和bin_density(每个分箱对应的y值)两个列表即可,两个列表的长度关系必须满足:len(bin_density) = len(bin_edges) - 1 - 该方法天然支持非均匀宽度分箱,不需要手动调整柱子宽度,程序会自动根据分箱边界计算对应柱宽
- 如果你的y值是归一化数密度而非百分比,直接替换
bin_density内容、同步修改y轴标签即可 - 样式调整可以通过修改
color(柱子填充色)、linewidth(描边粗细)、坐标轴范围参数实现和参考样式1:1匹配
其他语言实现参考
如果使用R语言实现,逻辑完全一致:用geom_col()图层,手动指定柱宽为分箱宽度、柱位置为分箱中心即可,不需要使用geom_histogram()自动统计接口。
内容的提问来源于stack exchange,提问作者Nimish
相关产品推荐
相关产品推荐

