Matlab 频率直方图密度

Matlab 频率直方图密度,matlab,plot,distribution,Matlab,Plot,Distribution,我想在一张图上绘制多个频率直方图,然而,我的频率图是参差不齐的,不好看。此代码如下所示: mmin = min([Data]); mmax = max([Data]); figure(1);n = hist(Data, x); f = n/sum(n); plot(x,f,'r','LineWidth',3) [f,xi] = ksdensity(data); figure(1) plot(xi,f); 为了使其平滑,我查看了ksdensity,并基于此代码创建了下图: mmin = mi

我想在一张图上绘制多个频率直方图,然而,我的频率图是参差不齐的,不好看。此代码如下所示:

mmin = min([Data]);
mmax = max([Data]);
figure(1);n = hist(Data, x);
f = n/sum(n);
plot(x,f,'r','LineWidth',3)
[f,xi] = ksdensity(data);
figure(1)
plot(xi,f);

为了使其平滑,我查看了
ksdensity
,并基于此代码创建了下图:

mmin = min([Data]);
mmax = max([Data]);
figure(1);n = hist(Data, x);
f = n/sum(n);
plot(x,f,'r','LineWidth',3)
[f,xi] = ksdensity(data);
figure(1)
plot(xi,f);

但是,我注意到我的图表不再在y轴上绘制频率。是否仍然可以使用
ksdensity
更正此更改?我真的很喜欢图表的外观,而不是我的频率直方图,并且希望继续使用
ksdensity
,除非有更好的建议

谢谢大家!

数据样本:
诀窍在于,我认为您没有正确计算直方图中的频率。你忽略了箱子的宽度。你的频率应该是每个位置的SNP数量,这需要除以每个位置的数量(可能是分数)

试试这个:

Data = rand(1, 1e4);

figure(1);
[n, c] = hist(Data, 20);
dc = abs(c(2) - c(1));

f = n./(dc * sum(n));
plot(c,f,'r','LineWidth',3)

[~,f_kde,xi] = kde(Data);
line(xi,f_kde);
我没有统计工具箱,所以我使用文件交换函数,但两者的工作方式相同

如果第一个图形确实是您想要的,那么做一点代数运算,而不是将直方图值除以bin宽度,而是将kdensity值乘以相同的bin宽度


正如我在我的另一篇文章中提到的,有很多方法可以为直方图选择最佳的箱子宽度。为了方便起见,我在这里选择了20。

昨天也有类似的帖子,这里是链接,基本上,用插值计算的移动平均值就是方法(我似乎记得)@GameofThrows,我会研究一下。非常感谢。不客气,默认情况下ksdensity会进行归一化(即曲线下的面积应等于1)。因此,使用post中的方法(也可以设置内核大小)调整绘图可能更容易@christylynn002-我明白你为什么访问我的post了。我解决的问题,OP只想平滑拐角点。您希望平滑因子显著增加,因此请选择一个相当大的窗口大小。。。大约20。。。甚至30岁。“你必须进行实验才能得到好的结果。”“啊,我明白了。感谢您的回复。我使用
ksdensity
而不是
kde
尝试了这种方法,但我仍然遇到了锯齿峰。我也从中创建了kde函数,但仍然很成功……上面的第二个图看起来并不参差不齐,因此如果您的真实数据(我无法从工作中访问Dropbox,所以我自己看不到)与示例完全不同,我帮不了您多少忙,但如果没有,我真的认为您已经达到了需要的位置。
kde
kdensity
的输出已经是一个合适的频率,因此不需要进行标准化。您应该直接从这些函数中获取输出,以比较不同的直方图。这就是我所想的。谢谢你的帮助。