GNUPLOT:将数据管道传输到gnuplot脚本的更好方法

时间:2019-02-02 14:50:14

标签: shell gnuplot

我有一个这样的gnuplot脚本(简化)

reset session

set terminal pngcairo enhanced font "Times,25" size 800,400

filename = ifilename

stats filename nooutput

N = STATS_columns
M = STATS_records

set angles degrees
set size square 1.25,1

set output ofilename

# does some stuff
...
...
...

set parametric  

plot \ 
    for [i=2:N] filename u (posX($0, column(i))):(posY($0, column(i))) w p ps 1.2 pt 7 lc rgb lcolor(i-2)

我想做的是通过Shell脚本定义ifilename(输入文件)和ofilename(输出文件)。

所以我认为-e命令可能只是这项工作。

所以对于脚本的gnuploat部分,我为此感到恼怒

gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp

但是它抛出了错误

"chart.gp" line 8: undefined variable: ifilename

引用此行

filename = ifilename

我认为这可能是因为解析两个=符号时遇到了一些麻烦,所以我删除了这一行并像这样重写了我的shell脚本

gnuplot -e "filename='data/points_data1.dat'; ofilename='plot1'" chart.gp

但这一次它引发了以下错误

"chart.gp" line 8: undefined variable: filename

实际起作用的是

echo "data/points_data$i.dat" | gnuplot chart.gp

我将filename = ifilename行替换为

FILE = system("read filename; echo $filename") 

以及filename脚本中带有FILE的{​​{1}}的每个实例。

但是我不确定如何使用该语法来定义输出文件。


所以我想知道,是否有更好的方法将外壳程序输入管道传递到gnuplot脚本?

2 个答案:

答案 0 :(得分:1)

您的原始命令几乎奏效。调用

gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp

正确定义了输入和输出文件名。但是然后您通过发出命令将它们破坏在chart.gp脚本中

  reset session

清除所有变量定义,包括您特别想要的变量。从脚本中删除该行,就可以了。如果“重置会话”命令的目的是确保不使用系统范围的或专用的初始化文件,则在命令行上将其替换为“ -d”:

  gnuplot -d -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp

答案 1 :(得分:0)

FILE = system("read filename; echo $filename") 

实际上很好。

如果要将输出通过管道传输到某个文件,则可以省略set output "something.png"

,相反,您可以通过运行这样的脚本直接将.png的输出直接发送到stdout

#!/usr/bin/env gnuplot

reset session

set terminal pngcairo enhanced font "Times,25" size 800,400
...

然后您可以将输出通过管道传输到.png文件,像这样

./chart.gp > mypng.png

因此,最终命令是这个样子

echo "data/points_data$i.dat" | gnuplot chart.gp > plot$i.png