我有400个文件,每个文件包含大约500000个字符,而这500000个字符只包含大约20个字母。我想制作一个直方图,表示使用的最多10个字母(x轴)和每个字母的使用次数(y轴)。我怎么能做到。
答案 0 :(得分:3)
由于您拥有uchar
数组,因此您知道您的元素将始终位于0:255
范围内。在看到TamásSzabó的回答here后,我意识到文本文件中的空字符非常不可能,所以我将忽略它并使用范围1:255
。如果您希望有空字符,则必须调整范围。
为了找到10个最常用的字母,我们首先计算直方图的数量,然后按降序对它们进行排序并取第10个:
counts = histc(uint8(part), [1:255]);
[topCounts, topIndices] = sort(counts, 'descend');
现在我们需要重新排列计数和索引,以便按字母顺序放回字母:
[sortedChars, shortIndices] = sort(topIndices(1:10));
sortedCounts = topCounts(shortIndices);
现在我们可以使用bar
绘制直方图:
bar(sortedCounts);
(如果您希望图表中的条形图像在普通'hist'
图表中那样触摸,则可以添加hist
选项。)
要将水平图例从数值更改为字符,请使用sortedChars
作为'XtickLabel'
:
labelChars = cellstr(sortedChars.').';
set(gca, 'XtickLabel', labelChars);
答案 1 :(得分:0)
注意:这会回答问题的原始版本(数据仅包含10个字母;需要直方图)。问题是完全改变(数据由大约20个字母组成,并且需要10个最常用字母的直方图)。
如果十个字母是任意的并且事先不知道,则您无法使用hist(..., 10)
。请考虑以下示例,其中包含三个任意"字母":
h = hist([1 2 2 10], 3);
结果不是您所期望的[1 2 1]
。问题是hist
选择等宽箱。
以下三种方法可以满足您的需求:
letters = unique(part(:)).'; %'// these are the letters in your file
h = sum(bsxfun(@eq, part(:), letters)); %// count occurrences of each letter
上述方法的第二行可以由histc
替换,指定bin边缘:
letters = unique(part(:)).';
h = histc(part, letters);
或者您可以使用sparse
进行累积:
t = sparse(1, part, 1);
[~, letters, h] = find(t);
例如,对于part = [1 2 2 10]
,上述任何一个都给出了预期的结果,
letters =
1 2 10
h =
1 2 1