是否可以在gnuplot中绘制正态概率分布

时间:2015-05-23 04:29:40

标签: linux shell plot gnuplot

我的数据文件是 -

 2 3 4 1 5 2 0 3 4 5 3 2 0 3 4 0 5 4 3 2 3 4 4 0 5 3 2 3 4 5 1 3 4

我的要求是在gnuplot中绘制普通PDF。 我可以通过计算f(x)

来做到这一点
f(x) = \frac{1}{\sqrt{2\pi\sigma^2} } e^{ -\frac{(x-\mu)^2}{2\sigma^2} } 
for each x using shell script. 

然后我使用命令 -

在gnuplot中绘制它
plot 'ifile.txt' using 1:2 with lines

但是否可以直接在gnuplot中绘图?

1 个答案:

答案 0 :(得分:0)

gnuplot在smooth关键字下提供了许多处理选项(尝试输入help smooth以获取更多信息)。对于你的具体情况,我会推荐合适的。

首先,请注意您的数据点是连续的,您需要将其转换为gnuplot的列才能使用它。您可以使用awk

执行此操作
awk '{for (i=1;i<=NF;i++) print $i}' datafile

可以从gnuplot中调用:

plot "< awk '{for (i=1;i<=NF;i++) print $i}' datafile" ...

现在假设datafile具有正确的格式以简化。

您可以使用smooth frequency选项查看每个值的出现次数:

plot "datafile" u 1:(1.) smooth frequency w lp pt 7

enter image description here

要获得规范化分布,请除以值的数量。这可以在gnuplot中使用stats自动完成:

stats "datafile"

这将在变量STATS_records中存储值的数量,在这种情况下,值为33:

gnuplot> print STATS_records
33.0

因此,归一化分布(在x处获得值的概率)是:

plot "datafile" u 1:(1./STATS_records) smooth frequency w lp pt 7

enter image description here

正如您所看到的,您的发行版看起来并不像普通发行版,但无论如何,让我们继续。创建一个Gaussian用于拟合并适合您的数据,并绘制它。您需要适应概率,而不是数据本身。为此,我们绘制table以提取smooth frequency生成的数据:

# Non-normalized Gaussian
f(x)= A * exp(-(x-x0)**2/2./sigma**2)
# Save probability data to table
set table "probability"
plot "datafile" u 1:(1./STATS_records) smooth frequency not
unset table
# Fit the Gaussian to the data, exclude points from table with grep
fit f(x) "< grep -v 'u' probability" via x0, sigma, A
# Normalize the gaussian
g(x) = 1./sqrt(2.*pi*sigma**2) * f(x) / A
# Plot
plot "datafile" u 1:(1./STATS_records) smooth frequency w lp pt 7, g(x)

enter image description here

set table会生成一些您应该排除的点,这就是我使用grep过滤文件的原因。此外,在用可变幅度完成拟合之后,需要对高斯进行归一化。如果要检索拟合参数:

gnuplot> print x0, sigma
3.40584703189268 1.76237558717934

最后请注意,如果数据点之间的间距不均匀,例如而x = 0, 1, 2, 3 ...代替x = 0, 0.1, 0.5, 3, 3.2 ...,您需要使用不同的方式来执行此操作,例如,定义常规大小的分组以对数据点进行分组。