3

我在我的 gnuplot 脚本上遇到了奇怪的行为。此脚本的目标是读取文件并使用文件的第一行作为系列标题绘制一组特定的行(基于文件中给定起点的 3 个连续行)。

虽然该情节在概念上有效,但我在左侧的图像中遇到了一个大插入,就好像读取了一个空行并将其绘制为 0(没有标题)

输入文件:

Level,Filter,Type,Set1,Set2,Set3
Level1,Filter1,Type1,112,186,90
Level1,Filter1,Type2,233,335,159
Level1,Filter1,Type3,224,332,157

代码:

set terminal postscript color
set output '| epstopdf --filter --outfile=output.pdf'

set boxwidth 0.5
set style fill solid
set style data histograms

set datafile separator "," 

LINE1 = 1 + 3 * COUNT
LINE2 = LINE1 + 1
LINE3 = LINE1 + 2

plot '../test.csv' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $4 : 1/0) ti col,'' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $5 : 1/0) ti col,'' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $6 : 1/0) ti col

命令行调用

>gnuplot -e "COUNT=0" test.plot

我怎样才能摆脱导致正确转变的空白字段?

我的 gnuplot 版本是 4.6。

4

1 回答 1

2

由于您已经在使用管道和 unix-ish 工具,我也会sed在这里使用:

set term post color
set output 'foo.ps'

set style data histograms 
set style histogram clustered 

set datafile separator ","     

set boxwidth 0.5
set style fill solid

SED_CMD = sprintf('< sed -n -e 1p -e %d,%dp test.csv',COUNT*3+2,COUNT*3+4)

plot for [COL=4:6] SED_CMD u COL ti col

当我试图弄清楚你的脚本在做什么时,我已经简化了很多事情——我使用了情节迭代(在 gnuplot 4.3 中引入)。最初我认为这plot '...' every ...会起作用,但直方图似乎卡住了every,我(还没有!)明白为什么。

下面是对该sed命令的解释:

-e 1p      #print first line in file
-e %d,%dp  #print n'th line through m'th line (inclusive) where n=COUNT*3+2 and m=COUNT*3+4

如果您担心 shell 注入,这似乎也是安全的:

gnuplot -e 'COUNT=";echo hi"' -persist test.gp
"test.gp", line 10: Non-numeric string found where a numeric expression was expected

Gnuplot 只会将数字写入您的命令字符串。

于 2012-11-08T19:27:31.950 回答