我有500个文件要绘制,我想自动执行此操作。我有gnuplot脚本 用硬编码的文件名进行绘图。我希望有一个循环,每次迭代使用不同的文件名调用gnuplot,但似乎gnuplot不支持命令行参数。
有简单的方法吗?我还安装了gnuplot-python包,以防我可以通过python脚本来实现。但是,我找不到api,所以有点难以弄明白。
谢谢!
答案 0 :(得分:22)
您可以通过添加行
将gnuplot脚本转换为shell脚本#!/bin/sh
gnuplot << EOF
追加
行EOF
并用$
替换每个\$
。然后,您可以用$1
替换文件名的每个出现,并使用文件名作为参数调用shell脚本。
答案 1 :(得分:6)
关于Sven Marnach解决方案中的$(在EOF之间的界限用shell命名称为“here script”):根据我的经验,一个人像往常一样使用shell变量,但是用于gnuplot本身的$ s必须逃脱。
以下是一个例子:
for distrib in "uniform" "correlated" "clustered"
do
gnuplot << EOF
# gnuplot preamble omitted for brevity
set output "../plots/$distrib-$eps-$points.pdf"
set title "$distrib distribution, eps = $eps, #points = $points"
plot "../plots/dat/$distrib-$eps-$points.dat" using 1:(\$2/$points) title "exact NN"
EOF
done
注意反斜杠逃避美元,以便gnuplot看到它。
答案 2 :(得分:1)
一种简单的方法是生成500个gnuplot脚本,如下所示:
for filename in list_of_files:
outfile = open(filename + '-script', 'w')
outfile.write(script_text % (filename,))
其中script_text
是gnuplot脚本的文本,文件名替换为%s
。
答案 3 :(得分:1)
我有几次这样做了。但是不要使用EOF,因为你不能在&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; EOF和EOF标签。根据文件的名称,您可以以不同的方式进行。
a)如果文件名是可循环的(排序为1.dat 2.dat 3.dat等)
#!/bin/bash
for((i=0;i<1;i++)) do
echo "plot '-' u 1:2"
for((j=1;j<=3;j++)) do
cat $i.dat
echo "e"
done
done | gnuplot -persist
第一个循环是一种缓冲区,可以将它全部输入到gnuplot。
b)如果文件名不可循环(例如ñlasjkd.datajñljd.movañlsjkd.gif),首先需要将它们移动到新文件夹。然后做
#!/bin/bash
ffiles=$(ls | xargs) # a list of the folder's files
# Use the list to pipe all the data to gnuplot using cat
for((i=0;i<1;i++)) do
echo "plot '-' u 1:2 w lp";
cat $ffiles;
echo "e";
done | gnuplot -persist
c)如果你想要更多,那就是:将分离文件的信息保存在一个文件上......但是,使数据表保持活着使用gnuplot的“索引”(如果gnuplot读取两条黑线猜测是另一个数据表)
#!/bin/bash
ffiles=$(ls|xargs)
ls $ffiles > ffiles.list # A file with the folder's files
while read line
do
cat $line;
echo -e; echo -e;
done < ffiles.list > alldata.dat
# ^-feeding ffiles.list to the while loop
# and writing the file alldata.dat
现在你可以去gnuplot并访问一个数据表
plot 'alldata.dat' index 1 u 1:2
您将看到列表“ffiles.list”中出现的第一个文件。如果你想看到不止一个,说4
plot 'alldata.dat' index 1:4 u 1:2
棘手而且容易。
答案 4 :(得分:1)
除非我误解你的问题,否则有一种更简单的方法。
在gnuplot脚本中,将所有出现的文件名替换为$0
。
然后在bash中循环你的绘图文件(假设它们是$ plotsDir中的.txt文件)并调用gnuplot:
for f in "$plotsDir/*.txt"; do
echo "call '$f'" | gnuplot
done
答案 5 :(得分:0)
这是一种方法。您的gnuplot输入文件,例如plot.gp
,包含一行
plot "data"
或类似的东西。保存plot1.gp
中此行之前的行以及plot2.gp
中此行之后的行。现在将gnuplot称为
gnuplot plot1.gp -e `plot "data"` plot2.gp
有助于在命令行上传递data
的名称。
答案 6 :(得分:0)
我创建了一个名为test.txt
的文件,其中包含plot [0:20] x;
我运行gnuplot test.txt
并且我看到gnuplot确实已经读取了我的文件的内容,因此它在运行时支持参数。
答案 7 :(得分:0)
How to pass command line argument to gnuplot?中还介绍了解决此问题的不同方法:
-e
-c
或call
与ARG0
类变量一起使用(gnuplot&gt; = 5)call
与$0
类变量一起使用(gnuplot&lt; = 4.6.6)system()