Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:用曲线绘制频率分布_Matlab_Plot_Histogram_Distribution - Fatal编程技术网

Matlab:用曲线绘制频率分布

Matlab:用曲线绘制频率分布,matlab,plot,histogram,distribution,Matlab,Plot,Histogram,Distribution,我必须在一张图上画出10个频率分布。为了保持事物整洁,我希望避免使用箱子制作直方图,并希望在每个直方图图的轮廓之后有线条 我尝试了以下方法 [counts, bins] = hist(data); plot(bins, counts) 但这给了我一条非常不精确且参差不齐的线 我读到了ksdensity,它给了我一个很好的曲线,但是它改变了我y轴的比例,我需要能够从y轴读取频率 您还可以推荐什么吗?您在直方图中使用默认的存储箱数,我假设,在内核密度估计计算中使用默认的存储箱数 正如您所发现的,根

我必须在一张图上画出10个频率分布。为了保持事物整洁,我希望避免使用箱子制作直方图,并希望在每个直方图图的轮廓之后有线条

我尝试了以下方法

[counts, bins] = hist(data);
plot(bins, counts)
但这给了我一条非常不精确且参差不齐的线

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


您还可以推荐什么吗?

您在直方图中使用默认的存储箱数,我假设,在内核密度估计计算中使用默认的存储箱数

正如您所发现的,根据您拥有的数据点数量,这肯定不是最优的。首先要尝试的是计算出最平滑的曲线,同时尽可能最好地保留底层PDF。(另见,和)

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

[kcounts,kbins] = ksdensity(data,bins,'npoints',length(bins));
我没有您的数据,因此您可能需要对参数进行一些处理,以获得您想要的结果

或者,您可以尝试通过从
hist
获得的点拟合
样条曲线
,并绘制该样条曲线

一些代码:

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
给出了一条平滑的曲线。根据您在数据中查找的内容,可能是好的,也可能是坏的。

您在直方图中使用默认的存储箱数,我假设,在内核密度估计计算中使用默认的存储箱数

正如您所发现的,根据您拥有的数据点数量,这肯定不是最优的。首先要尝试的是计算出最平滑的曲线,同时尽可能最好地保留底层PDF。(另见,和)

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

[kcounts,kbins] = ksdensity(data,bins,'npoints',length(bins));
我没有您的数据,因此您可能需要对参数进行一些处理,以获得您想要的结果

或者,您可以尝试通过从
hist
获得的点拟合
样条曲线
,并绘制该样条曲线

一些代码:

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
给出了一条平滑的曲线。根据您在数据中查找的内容,这可能是好的,也可能是坏的。

使用插值如何

示例:让

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

用它插值怎么样

示例:让

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

请注意,y轴缩放始终取决于箱子宽度
ksdensity
将返回一条归一化为1的曲线,因此您可以通过乘以
长度(数据)
来重新缩放该曲线,从而使y轴与点数成比例。通过乘以
长度(数据)
来重新缩放该曲线的准确程度如何?我不确定是否理解您的问题。在上面的示例代码中,我在倒数第二行中进行了乘法:
f*length(data)
还请注意,两个直方图都通过bin width标准化,以将它们转换为每个bin width频率的数字,因此每个直方图曲线的积分等于对象总数。将
kdensity
乘以对象总数,使其与其他对象的整数匹配。请注意,y轴缩放始终取决于箱子宽度
ksdensity
将返回一条归一化为1的曲线,因此您可以通过乘以
长度(数据)
来重新缩放该曲线,从而使y轴与点数成比例。通过乘以
长度(数据)
来重新缩放该曲线的准确程度如何?我不确定是否理解您的问题。在上面的示例代码中,我在倒数第二行中进行了乘法:
f*length(data)
还请注意,两个直方图都通过bin width标准化,以将它们转换为每个bin width频率的数字,因此每个直方图曲线的积分等于对象总数。将
kdensity
乘以对象总数,使其与其他对象的整数匹配。