Gnuplot:忽略数据文件中第一行的最短方法

时间:2016-02-20 17:19:12

标签: plot gnuplot

我有一个由另一个第三方应用程序创建的.csv数据文件,应该使用gnuplot绘制。 我们假设该文件具有以下格式:

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N)
1;1;2;1;1;1
2;3;3;3;5;6
3;4;1;1;1;4

第一列是x轴,下面的列应该各自绘制为自己的线图(是的,我知道,一个图中的太多线图可​​能看起来很糟糕,但只是想知道)。这是一个MCVE:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' using 1:2 with lines title "A",\
  'C://tmp/test.csv' using 1:3 with lines title "B",\
  'C://tmp/test.csv' using 1:4 with lines title "C",\
  'C://tmp/test.csv' using 1:5 with lines title "D",\
  'C://tmp/test.csv' using 1:6 with lines title "E"

问题是,这也是第一行,因为它是数据。

我知道可以通过#启动#1;2;3;4;5;6来忽略数据文件中的任何行,但我不想编辑该文件,因为它也被其他工具使用。

另一种方法是使用plot <filename> every ::1忽略第一行,这意味着我必须在上述脚本中包含every ::1 5次,如in this link所述。这看起来如下:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\
  'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\
  'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\
  'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\
  'C://tmp/test.csv' every ::1 using 1:6 with lines title "E"

为每个情节定义every ::1真的唯一的方法吗?是否有一些更短的 - 更好的单线 - 忽略第一(n)线的方式;某种方式来定义every ::1“全局”或类似(伪代码)set datafile ignorefirstnlines 1

1 个答案:

答案 0 :(得分:27)

Gnuplot可以从第一行读取列名,但您仍然可以正常指定列名。因此,这有效地跳过了第一行。

发出命令

set key autotitle columnhead

这告诉gnuplot第一行不是数据,而是要用于键的列名。您仍然可以unset keyplot datafile title sometitle使用之前的相同内容,gnuplot将不会使用该数据。

假设我的文件看起来像

1 2
4 5
7 8

我可以按set key autotitle columnhead发出unset key(如果我真的不想要密钥),它会跳过第一行。

enter image description here

或者,我可以通过外部程序管道我的数据。例如,使用awk(适用于大多数操作系统,包括Windows),我可以

plot "< awk '(NR>2){print;}' datafile"

跳过前两行(使用Windows,我必须'< awk "(NR>2){print;}" datafile')。如果我不想继续输入,我可以将其存储在字符串

skipfile = "\"< awk '(NR>2){print;}' datafile\""

并将其用作宏(对于Windows,请使用skipfile = '"< awk \"(NR>2){print;}\" datafile"')。例如,要使用行绘制数据文件,我可能会

plot @skipfile with lines

@skipfile只是告诉gnuplot处理命令,就像我刚刚在那里输入skipfile的内容一样。