Octave中为1到n整数数据生成单值对应柱状直方图的问题
Octave 生成整数数据直方图的正确方法
我需要为取值在1到n之间的整数数据集生成直方图,要求每个整数对应一个独立的柱状条。但尝试将柱状条数量设为整数个数的方法并不生效:
octave:113> [nn,xx]=hist(p,max(p)); octave:114> [min(p) max(p)] ans = 1 15 octave:115> [min(xx) max(xx)] ans = 1.4667 14.5333
尽管size(xx)符合预期为15,且sum(xx)与唯一整数值的总和一致,但xx的取值并非整数本身。我理解hist函数原本是为连续实数据设计的,核心关注柱状条的边界划分,我的使用场景并不在它的设计目标范围内。
我尝试过用以下代码近似实现需求:
bar(1:max(p),histc(p,(unique(p))))
但如果数据p中存在某个中间整数出现次数为0的情况,这段代码会出现严重问题。
解决方法
要确保每个整数(包括出现次数为0的)都对应一个柱状条,需要先明确完整的整数范围,再统计每个整数的出现次数:
方法一:基于histc的直接实现
% 定义完整的整数取值范围(从1到数据中的最大值) x_axis = 1:max(p); % 统计每个整数的出现次数 counts = histc(p, x_axis); % 绘制直方图,每个整数对应一个柱状条 bar(x_axis, counts);
这段代码会自动为1到max(p)之间的所有整数分配位置,即使某个整数出现次数为0,也会显示高度为0的柱状条。
方法二:使用tabulate函数补全数据
tabulate函数会直接返回数据中每个唯一值的出现次数,我们可以基于此补全缺失的整数:
% 获取数据的计数统计表 stats = tabulate(p); % 生成完整的整数范围 full_x = 1:max(p); % 初始化计数数组,默认所有值为0 full_counts = zeros(size(full_x)); % 将已有统计值匹配到完整范围中 for i = 1:size(stats, 1) idx = find(full_x == stats(i, 1)); if ~isempty(idx) full_counts(idx) = stats(i, 2); end end % 绘制直方图 bar(full_x, full_counts);
内容的提问来源于stack exchange,提问作者צ�</think_never_used_51bce0c785ca2f68081bfa7d91973934>
相关产品推荐
相关产品推荐

