Bash,Gnuplot:将多个选定的列对从一个数据文件绘制成一个图

时间:2015-02-04 16:44:52

标签: bash shell variables gnuplot using

我制作一个脚本来在窗口中绘制数据文件的所需列对。但我无法弄清楚如何使{gnuplot接受using命令的参数。

我的代码看起来像这样

#!/bin/bash
filee=$1
shift 1
cols=$@

gnuplot -p << eof
#TESTS--------------------------------
print "gnuplot--starts----------------"

print "cols-var is:     $cols"
print "filee-name is:   $filee"

print "pair-vars are:"
do for [pair in "$cols"] {print pair}

print "-------------------------------"
#END TESTS----------------------------"


set term wxt 1 size 1500,900 title 'columns of $filee'
set key top left
set grid
set xrange [2:8]
set yrange [-0.02:0.02]
set format y "%g"
plot for [pair in "$cols"] '$filee' u pair  
eof

如果不是pair作为u的参数,我使用1:31:2或者我得到正确数量的图,但当然它们都是相同的。我尝试了很多东西,除了u不接受变量之外,一切似乎都在工作。运行它的输出是:

$ ./cploter written.dat 1:2 1:3 1:4
gnuplot--starts----------------
cols-var is:    1:2 1:3 1:4
filee-name is:  written.dat
pair-vars are:
1:2
1:3
1:4
-------------------------------
         line 0: warning: Skipping data file with no valid points
         line 0: warning: Skipping data file with no valid points
         line 0: warning: Skipping data file with no valid points 

对此问题的一些帮助将不胜感激:)

编辑:因为u似乎没有通过其参数接受循环,所以我选择了下面的代码。如果你知道一种不同的方法将所需的列对绘制成一个图,请发表评论或回答:)

#!/bin/bash
fil=$1; xx=$2; y1=$3; y2=$4
gnuplot -p <<- eof
set term wxt 1 size 1500,900 title 'columns of $filee'
set key top left
set format y "%g"
plot for [i=${y1}:${y2}] '$fil' u ${xx}:i w l t 'Column ${xx}:'.i
eof

我在gnuplot 4.6上。由于某些原因,使用for [i in $range]在这种情况下不起作用。使用变量ys(i)=word("$yes",i), xs=word("$xes",i)plot for [i=1:3] '$fil' u xs(i):ys(i) w l也不起作用。

2 个答案:

答案 0 :(得分:1)

(部分答案;还有其他一些解决这种情况的方法)

运行脚本时出现了不同的错误(gnuplot 5.0)

line 0: warning: no column with header "1:2"

但我认为问题的根源是一样的。问题是gnuplot正在寻找名为“1:2”的单个列,而不是将令牌“1:2”解释为两列using规范。

如果您只想绘制1:2形式的对,您可以将第二列索引作为参数传递给脚本并使用plot命令

plot for [pair in "$cols"] '$filee' u 1:column(int(pair))

答案 1 :(得分:0)

使用[pair in "$cols"]可以正常工作,前提是其他所有内容都正确无误。以下示例正常工作:

档案test.dat

1 2 3 4
5 6 7 8
9 10 11 12

和脚本plot.sh

#!/bin/bash
filee=$1
shift 1
cols=$@

gnuplot -p <<EOF
set terminal pngcairo
set output 'test.png'
plot for [col in "$cols"] '$filee' u 1:(column(int(col)))

EOF

使用

调用此脚本
./plot.sh test.dat 2 3 4