【问题标题】:Matlab: plotting frequency distribution with a curveMatlab:用曲线绘制频率分布
【发布时间】:2014-07-15 14:58:42
【问题描述】:

我必须在一张图上绘制 10 个频率分布。为了保持整洁,我想避免使用箱制作直方图,并且更喜欢让线条遵循每个直方图的轮廓。

我尝试了以下

[counts, bins] = hist(data);
plot(bins, counts)

但这给了我一个非常不精确和锯齿状的线。

我读到了 ksdensity,它给了我一个很好的曲线,但它改变了我的 y 轴的缩放比例,我需要能够从 y 轴读取频率。

你还能推荐什么吗?

【问题讨论】:

    标签: matlab plot histogram distribution


    【解决方案1】:

    splines 插值怎么样?

    nbins = 10; %// number of bins for original histogram
    n_interp = 500; %// number of values for interpolation
    [counts, bins] = hist(data, nbins);
    bins_interp = linspace(bins(1), bins(end), n_interp);
    counts_interp = interp1(bins, counts, bins_interp, 'spline');
    plot(bins, counts) %// original histogram
    figure
    plot(bins_interp, counts_interp) %// interpolated histogram
    

    例子:让

    data = randn(1,1e4);
    

    原始直方图:

    插值:

    按照您的代码,上图中的 y 轴给出了计数,而不是概率密度。要获得概率密度,您需要进行归一化:

    normalization = 1/(bins(2)-bins(1))/sum(counts);
    plot(bins, counts*normalization) %// original histogram
    plot(bins_interp, counts_interp*normalization) %// interpolated histogram
    

    检查:总面积应约为 1:

    >> trapz(bins_interp, counts_interp*normalization)
    ans =
        1.0009
    

    【讨论】:

      【解决方案2】:

      您正在为直方图使用默认的 bin 数量,我假设您正在使用默认数量的 bin 进行核密度估计计算。

      根据您所拥有的数据点数量,这肯定不是最佳的,正如您所发现的那样。首先要尝试计算optimum bin width 以提供最平滑的曲线,同时尽可能最好地保留底层PDF。 (另见hereherehere);

      如果您仍然不喜欢结果图的平滑度,您可以尝试使用来自histbins 输出作为ksdensity 的进一步输入。也许是这样的:

      [kcounts,kbins] = ksdensity(data,bins,'npoints',length(bins));
      

      我没有你的数据,所以你可能需要稍微调整一下参数才能得到你想要的。

      或者,您可以尝试通过从 hist 获得的点拟合 spline 并绘制它。

      一些代码:

      data = randn(1,1e4);
      
      optN = sshist(data);
      
      figure(1)
      [N,Center] = hist(data);
      [Nopt,CenterOpt] = hist(data,optN);
      [f,xi] = ksdensity(data,CenterOpt);
      
      dN = mode(diff(Center));
      dNopt = mode(diff(CenterOpt));
      
      plot(Center,N/dN,'.-',CenterOpt,Nopt/dNopt,'.-',xi,f*length(data),'.-')
      legend('Default','Optimum','ksdensity')
      

      结果:

      请注意,“最佳”箱宽度保留了分布的一些精细结构(我必须运行几次才能获得尖峰),而 ksdensity 给出了平滑曲线。根据您在数据中查找的内容,这可能是好是坏。

      【讨论】:

      • 请注意,y 轴缩放始终取决于 bin 宽度。 ksdensity 将返回一条归一化为面积 1 的曲线,因此您可以通过乘以 length(data) 来重新缩放它,这样 y 轴就会与点数成正比。
      • 乘以length(data),究竟是如何重新缩放的?
      • 我不确定我是否理解您的问题。在上面的示例代码中,我在倒数第二行进行了乘法运算:f*length(data)
      • 另外请注意,两个直方图都通过 bin 宽度进行归一化,以将它们转换为每个 bin 宽度频率的数字,以便每个直方图曲线的积分等于对象的总数。将kdensity 乘以对象总数使其与其他对象的总数匹配。
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2017-12-23
      • 2011-02-05
      • 2014-07-08
      • 2011-08-20
      • 2018-02-08
      • 2012-03-02
      相关资源
      最近更新 更多