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

Julia中Histogram()无法显示区间边缘值的问题求助

解决Julia中自定义直方图区间不包含边缘值的问题

问题根源

Plots.jl的histogram()默认采用左闭右开的区间规则(即[a, b)),所以当数据刚好等于分箱的右边界时,会被排除在外。比如你定义bins=range(0,1,length=3),实际分箱是[0,0.5)和[0.5,1),数据中的1就不在任何分箱里,自然不会被显示。

可行解决方法

方法1:显式指定分箱闭合方向(StatsBase配合Plots)

利用StatsBase的fit()函数指定closed=:right,将区间改为右闭左开,让边缘值被包含进去,再将统计结果传给Plots绘图:

using Plots, StatsBase

x = [0, 0.5, 1]
# 自定义分箱,指定右闭合规则
bins = range(0, 1, length=3)
freqs = fit(Histogram, x, bins, closed=:right)
# 基于统计结果绘制直方图
plot(histogram(freqs))

此时分箱变为(0,0.5]和(0.5,1],数据中的1会被纳入最后一个分箱。

方法2:手动扩展右边界并修正轴标签

如果不想依赖StatsBase,可以轻微扩展分箱的右边界,再手动把x轴标签改回原边界值,既保证边缘值被统计,又不影响视觉呈现:

using Plots

x = [0, 0.5, 1]
original_bins = range(0, 1, length=3)
# 给右边界添加一个极小值(eps()为对应类型的最小增量)
extended_bins = push!(collect(original_bins), original_bins[end] + eps())
# 绘图时指定原边界为x轴刻度
histogram(x, bins=extended_bins, xticks=original_bins)

这种方式不会改变分箱宽度的一致性,x轴显示的还是你需要的原始边界值。

方法3:用bar函数手动绘制(完全可控)

如果需要绝对的自定义控制,可以先用StatsBase计算每个分箱的频数,再用bar函数绘制,精准控制分箱范围和标签:

using Plots, StatsBase

x = [0, 0.5, 1]
bins = range(0, 1, length=3)
freqs = fit(Histogram, x, bins, closed=:right)
# 以分箱左边界为bar的位置,设置宽度为分箱步长
bar(freqs.edges[1][1:end-1], freqs.weights, width=step(bins), xticks=bins)

这种方式自由度最高,适合需要严格统一分箱宽度的对比场景。

效果验证

以上三种方法都能让0、0.5、1被正确统计到对应分箱中,同时保持分箱宽度一致,满足对比需求。

内容的提问来源于stack exchange,提问作者capstain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:30:59