通过将数字分组到一个范围内在 matlab / octave 中绘图
Posted
技术标签:
【中文标题】通过将数字分组到一个范围内在 matlab / octave 中绘图【英文标题】:Plotting in matlab / octave by grouping numbers into a range 【发布时间】:2015-03-07 15:58:35 【问题描述】:我试图将 数据设为 x 轴,y 轴设为按 10 分组的值的数量。请参阅下面的图作为示例
我尝试使用 bar(x),但我不确定您如何获得正确类别中的数字以进行绘图。
示例:
如果数据是x=1,5.3,9,10.5,12,13,15.2,25,191,192.4
the group 0-10 should be 1,5.3,9
the group 10.1-20 should be 10.5,12,13,15.2
the group of 20.1-30 should be 25
.
.
.
the group of 190.1-200 should be 191,192.4
PS:我使用的是 octave 3.8.1,类似于 matlab
【问题讨论】:
您在寻找直方图吗? mathworks.com/help/matlab/ref/hist.html @Daniel 谢谢,我只是不记得它的名字了 【参考方案1】:您可以使用histc
。但是histc
认为每个 bin 的左边缘相等,而不是右边缘:
bincounts = histc(x,binranges)
计算x
中每个指定 bin 范围内的值的数量。输入binranges
确定每个 bin 的端点。输出bincounts
包含每个 bin 中来自x
的元素数。例如,如果
binranges
等于向量[0,5,10,13]
,则histc
会创建四个分箱。第一个 bin 包含大于或等于0
且严格小于5
的值。第二个 bin 包括大于或等于5
和小于10
的值,依此类推。最后一个 bin 包含标量值13
。
要在左边缘设置相等条件,最好手动使用bsxfun
:
y = diff(sum(bsxfun(@le, x(:), 0:10:200), 1));
sum(bsxfun(...), 1)
查找有多少 x
的条目小于或等于 0
, 10
, ... 200
;然后diff(...)
给出想要的结果y
:
y =
3 4 1 0 0 0 0 [...] 2
然后您可以使用bar(y)
绘制条形图。如果您还想更改 x 轴上显示的文本,请设置轴的 'xticklabel'
属性:
bar(y);
strings = '0-10', '10-20', '20-30'; %// manually define all strings up to '190-200'
set(gca, 'xticklabel', strings)
【讨论】:
这看起来非常不错,但 x 轴从 1...20 开始,而不是数据值。有办法改变吗?【参考方案2】:使用您的数据,您可以使用:
x = [1 5.3 9 10.5 12 13 15.2 25 191 192.4];
nbins = round(max(x)/10+.5);
hist(x, nbins);
这是结果:
【讨论】:
这似乎可行并且非常简单,但可以确保hist
考虑每个 bin 的 右 边缘的相等性吗?我在文档中找不到它
hist
默认情况下,只使用十根柱子。您可以使用参数更改条数。你可以直接写它,例如hist(x, 20)
,或者使用你的最大数组值来计算这个数字。
当然;但这并不能回答我的问题。在示例中,如何知道第一个区间是(0 10]
还是[0 10)
?
假设。 :-) 更严重的是:你可以简单地写nbins = round((max(x)-min(x))/10+.5);
,而不是nbins = round(max(x)/10+.5);
。以上是关于通过将数字分组到一个范围内在 matlab / octave 中绘图的主要内容,如果未能解决你的问题,请参考以下文章