【问题标题】:Matlab plot in histogram直方图中的 Matlab 绘图
【发布时间】:2013-04-22 13:12:52
【问题描述】:

假设y 是一个随机数遵循分布f(x)=sqrt(4-x^2)/(2*pi) 的向量。目前我使用命令hist(y,30)。如何将分布函数f(x)=sqrt(4-x^2)/(2*pi) 绘制到同一个直方图中?

【问题讨论】:

  • 你不是已经用hist 绘制了吗?
  • 粗略的想法是用两个输出调用 hist,因此它为您提供 bin 中心和计数。然后您手动绘制这些条形图,并在条形图顶部叠加一个缩放的密度函数。请参阅下面的答案。

标签: matlab statistics


【解决方案1】:

您也可以通过找到如下的理论比例因子来进行数值归一化,而不是进行标准化。

nbins = 30;
nsamples = max(size(y));
binsize = (max(y)-min(y)) / nsamples
hist(y,nbins)
hold on
x1=linspace(min(y),max(y),100);
scalefactor = nsamples * binsize 
y1=scalefactor * sqrt(4-x^2)/(2*pi)
plot(x1,y1)

更新:工作原理。

对于任何大到足以对 pdf 提供良好近似的数据集(称为 f(x)),f(x) 在该域上的积分将近似为一。但是我们知道 any 直方图下的面积正好等于样本总数乘以 bin-width。

因此,使 pdf 与直方图保持一致的一个非常简单的比例因子是 Ns*Wb,即样本点的总数乘以 bin 的宽度。

【讨论】:

  • 这个答案本身没有足够的上下文。你能把答案改进成独立的吗?
  • 我认为从提供的代码中可以清楚地看出“比例因子”的计算。不过,我可以添加更多为什么这个特定比例因子起作用的细节。查看更新的答案。
【解决方案2】:

让我们以另一个分布函数为例,即标准正态分布。要完全按照您所说的去做,请执行以下操作:

nRand = 10000;
y = randn(1,nRand);
[myHist, bins] = hist(y,30);
pdf = normpdf(bins);
figure, bar(bins, myHist,1); hold on; plot(bins,pdf,'rx-'); hold off;

这可能不是你真正想要的。为什么?您会注意到您的密度函数在直方图底部看起来像一条细线。这是因为直方图是 bin 中数字的计数,而密度函数被归一化以积分为 1。如果您在一个 bin 中有数百个项目,则密度函数无法在比例上与之匹配,因此您会遇到缩放或归一化问题。要么你必须标准化直方图,要么绘制一个缩放分布函数。我更喜欢缩放分布函数,以便在查看直方图时我的计数是有意义的:

normalizedpdf = pdf/sum(pdf)*sum(myHist);
figure, bar(bins, myHist,1); hold on; plot(bins,normalizedpdf,'rx-'); hold off;

你的情况是一样的,除了你将使用你指定的函数 f(x) 而不是 normpdf 命令。

【讨论】:

    【解决方案3】:

    让我再添加一个例子:

    %# some normally distributed random data
    data = randn(1e3,1);
    
    %# histogram
    numbins = 30;
    hist(data, numbins);
    h(1) = get(gca,'Children');
    set(h(1), 'FaceColor',[.8 .8 1])
    
    %# figure out how to scale the pdf (with area = 1), to the area of the histogram
    [bincounts,binpos] = hist(data, numbins);
    binwidth = binpos(2) - binpos(1);
    histarea = binwidth*sum(bincounts);
    
    %# fit a gaussian
    [muhat,sigmahat] = normfit(data);
    x = linspace(binpos(1),binpos(end),100);
    y = normpdf(x, muhat, sigmahat);
    h(2) = line(x, y*histarea, 'Color','b', 'LineWidth',2);
    
    %# kernel estimator
    [f,x,u] = ksdensity( data );
    h(3) = line(x, f*histarea, 'Color','r', 'LineWidth',2);
    
    legend(h, {'freq hist','fitted Gaussian','kernel estimator'})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2013-01-17
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多