通过将数字分组到一个范围内在 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 中绘图的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 在按特定列分组时构建动态范围的数字

Redshift:按范围将行分组并添加到输出列中

在Python中将数字分组为范围[重复]

怎样用spss进行数据分组?

通过MATLAB读取mnist数据库

语音处理基于matlab GUI数字音频分析与处理系统含Matlab源码 1739期