gnuplot bashshell在一张图中有几条曲线和拟合曲线

时间:2014-10-03 03:22:49

标签: bash loops gnuplot curve-fitting

这是我之前提出的问题的后续问题:"gnuplot bashshell to plot several curves in one window" Christoph对此有所帮助。但是,我已经简化了我的问题,假设我可以自己从那里前进。没必要,我不能! :(我真的想在一个无花果框架中绘制的是一组数据文件,并为每个数据文件一个曲线(指数函数)适合它。不幸的是我坚持使用gnuplot 4.2,它不允许我使用 for循环迭代。我将非常感谢任何建议。以下bash cript打印九条曲线及其在不同文件上的拟合线。

#!/bin/bash

for Counter in {1..9}; do
FILE="dataFile"$Counter".data"
gnuplot <<EOF
set xlabel "k"
set ylabel "p(k)"
set term png
set output "${FILE}.png"
title_fexp(a,b) = sprintf('exp(x) = %.2f * e(%.2f)', a, b)
expon(x) = c * exp(-x*d)
fit [10:100] expon(x) '${FILE}' via c,d
plot [1:50] expon(x)t title_fexp(c,d), '${FILE}' 
EOF
done

2 个答案:

答案 0 :(得分:3)

在编写bash脚本以生成gnuplot脚本之前,您应该考虑一下gnuplot脚本应该是什么样子。之后,您可以编写一个bash / what脚本来生成相同的gnuplot代码。

所以,你想要的是这个:

set xlabel "k"
set ylabel "p(k)"
set term png
set output "MySingleFile.png"


# Note that I've added c and d to the declaration
expon(x, c, d) = c * exp(-x*d)

# This allows to store the fit parameters for each datafile separately
fit expon(x, c1, d1) "dataFile1.data" via c1, d1
fit expon(x, c2, d2) "dataFile2.data" via c2, d2
fit expon(x, c3, d3) "dataFile3.data" via c3, d3

# now plot it. Note: The backslash allows multi line commands
plot \
    "dataFile1.data" notitle pt 1, \
    expon(x, c1, d1) title sprintf('exp(x) = %.2f * e(%.2f)', c1, d1) lt 1,\
    "dataFile2.data" notitle pt 2, \
    expon(x, c2, d2) title  sprintf('exp(x) = %.2f * e(%.2f)', c2, d2) lt 2,\
    "dataFile3.data" notitle pt 3, \
    expon(x, c3, d3) title  sprintf('exp(x) = %.2f * e(%.2f)', c3, d3) lt 3


unset output

现在你可以编写一个基于你的bash脚本,它生成像我一样的代码。 但是,请考虑将gnuplot命令传递到单独的文件中,然后使用此文件作为参数调用gnuplot。这允许调试bash脚本的输出。

请注意,命令图的最后一行末尾没有逗号。根据您的需要,您的bash脚本需要关注,或者您只需编辑您的gnuplot文件并删除最后一个逗号。

答案 1 :(得分:1)

抱歉,我没有太多时间,但我想帮你一把......

如果你想用@ sweber的代码循环,你可以做这样的事情:

#!/bin/bash    
{ 
cat<<EOF
set xlabel "k"
set ylabel "p(k)"
set term png
set output "MySingleFile.png"
EOF

for i in {1..3}
do
   cat<<EOF
   fit ... something with $i ...
EOF
done

for i in {1..3}
do
   cat<<EOF
   plot ... something with $i ...
EOF
done } | gnuplot

只需删除末尾的| gnuplot即可调试或查看生成的代码。就像这样:

set xlabel "k"
set ylabel "p(k)"
set term png
set output "MySingleFile.png"
fit ... something with 1 ...
fit ... something with 2 ...
fit ... something with 3 ...
plot ... something with 1 ...
plot ... something with 2 ...
plot ... something with 3 ...