我的数据文件是 -
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中绘图?
答案 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
要获得规范化分布,请除以值的数量。这可以在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
正如您所看到的,您的发行版看起来并不像普通发行版,但无论如何,让我们继续。创建一个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)
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 ...
,您需要使用不同的方式来执行此操作,例如,定义常规大小的分组以对数据点进行分组。