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

如何基于已知自定义频率/数密度值绘制直方图

固定分箱对应已知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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:42:40