gpt4 book ai didi

MATLAB:组合和归一化具有不同样本大小的直方图

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:36 26 4
gpt4 key购买 nike

我有四组数据,我想用一张图在 MATLAB 中表示它们的分布。当前代码是:

[n1,x1]=hist([dataset1{:}]);
[n2,x2]=hist([dataset2{:}]);
[n3,x3]=hist([dataset3{:}]);
[n4,x4]=hist([dataset4{:}]);
bar(x1,n1,'hist');
hold on; h1=bar(x1,n1,'hist'); set(h1,'facecolor','g')
hold on; h2=bar(x2,n2,'hist'); set(h2,'facecolor','g')
hold on; h3=bar(x3,n3,'hist'); set(h3,'facecolor','g')
hold on; h4=bar(x4,n4,'hist'); set(h4,'facecolor','g')
hold off

我的问题是每个组的采样大小不同,dataset1 的 n 为 69,dataset2 的 n 为 23,dataset3 和 dataset4 的 n 为 10。那么在表示这三个组时如何对分布进行归一化一起?

是否有某种方法可以……例如……将每个容器中的实例除以该组的样本?

最佳答案

您可以通过除以元素总数来标准化您的直方图:

[n1,x1] = histcounts(randn(69,1));
[n2,x2] = histcounts(randn(23,1));
[n3,x3] = histcounts(randn(10,1));
[n4,x4] = histcounts(randn(10,1));
hold on
bar(x4(1:end-1),n4./sum(n4),'histc');
bar(x3(1:end-1),n3./sum(n3),'histc');
bar(x2(1:end-1),n2./sum(n2),'histc');
bar(x1(1:end-1),n1./sum(n1),'histc');
hold off
ax = gca;
set(ax.Children,{'FaceColor'},mat2cell(lines(4),ones(4,1),3))
set(ax.Children,{'FaceAlpha'},repmat({0.7},4,1))

但是,正如您在上面看到的,您可以做更多的事情来使您的代码更简单和简短:

  1. 您只需要坚持一次。
  2. 不要收集所有的 bar 句柄,而是使用 axes 句柄。
  3. 按数据集中元素数量的升序绘制条形图,这样所有直方图都清晰可见。
  4. 使用 axes 句柄在一个命令中设置所有属性。

附带说明 - 最好使用 histcounts .

结果如下:

only hist


编辑:

如果你还想绘制来自 histfit 的 pdf 线,那么你可以先保存它,然后再绘制标准化:

dataset = {randn(69,1),randn(23,1),randn(10,1),randn(10,1)};
fits = zeros(100,2,numel(dataset));
hold on
for k = numel(dataset):-1:1
total = numel(dataset{k}); % for normalizing
f = histfit(dataset{k}); % draw the histogram and fit
% collect the curve data and normalize it:
fits(:,:,k) = [f(2).XData; f(2).YData./total].';
x = f(1).XData; % collect the bar positions
n = f(1).YData; % collect the bar counts
f.delete % delete the histogram and the fit
bar(x,n./total,'histc'); % plot the bar
end
ax = gca; % get the axis handle
% set all color and transparency for the bars:
set(ax.Children,{'FaceColor'},mat2cell(lines(4),ones(4,1),3))
set(ax.Children,{'FaceAlpha'},repmat({0.7},4,1))
% plot all the curves:
plot(squeeze(fits(:,1,:)),squeeze(fits(:,2,:)),'LineWidth',3)
hold off

同样,您可以对代码进行一些其他改进:

  1. 将所有内容放在一个循环中,以便以后更容易更改。
  2. 将所有曲线数据收集到一个变量中,这样您就可以非常轻松地将它们全部绘制在一起。

新的结果是:

hist & fit

关于MATLAB:组合和归一化具有不同样本大小的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com