Gnuplot可以在运行时使用不同的参数吗?也许用Python?

时间:2010-12-07 16:57:20

标签: python scripting gnuplot

我有500个文件要绘制,我想自动执行此操作。我有gnuplot脚本 用硬编码的文件名进行绘图。我希望有一个循环,每次迭代使用不同的文件名调用gnuplot,但似乎gnuplot不支持命令行参数。

有简单的方法吗?我还安装了gnuplot-python包,以防我可以通过python脚本来实现。但是,我找不到api,所以有点难以弄明白。

谢谢!

8 个答案:

答案 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
  • -ccallARG0类变量一起使用(gnuplot&gt; = 5)
  • call$0类变量一起使用(gnuplot&lt; = 4.6.6)
  • 使用环境变量和system()
  • 将程序管道化为gnuplot