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

Mar*_*ger 16 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
Run Code Online (Sandbox Code Playgroud)

第一列是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"
Run Code Online (Sandbox Code Playgroud)

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

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

另一种方法是使用plot <filename> every ::1忽略第一行,这意味着我必须every ::1在上面的脚本中包含5次,如此链接中所述.这将如下所示:

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"
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*hew 30

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

发出命令

set key autotitle columnhead
Run Code Online (Sandbox Code Playgroud)

这告诉gnuplot第一行不是数据,而是要用于键的列名.您可以仍然unset keyplot datafile title sometitle以前一样,并且gnuplot将不会使用该数据.

假设我的文件看起来像

1 2
4 5
7 8
Run Code Online (Sandbox Code Playgroud)

我可以发布set key autotitle columnheadifl unset key(如果我真的不想要一个键),它将跳过第一行.

在此输入图像描述


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

plot "< awk '(NR>2){print;}' datafile"
Run Code Online (Sandbox Code Playgroud)

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

skipfile = "\"< awk '(NR>2){print;}' datafile\""
Run Code Online (Sandbox Code Playgroud)

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

plot @skipfile with lines
Run Code Online (Sandbox Code Playgroud)

@skipfile只是告诉GNUPLOT就像我刚刚输入的内容来处理命令skipfile在那里.

  • 在使用任何`@`之前,一定要用`set macros'打开宏. (2认同)

小智 12

也许这仅适用于当前版本,并且在原始问题时不存在,但目前这是原始问题的答案。由于当我搜索“如何忽略 gnuplot 中的一行”时此页面出现在顶部,因此我认为应该提及此更新。似乎仅存在于>= 5.0版本中

Skip关键字。

gnuplot> 使用 1:5 绘制“datapoints.csv” 跳过 30

"skip 关键字告诉程序在文本(即非二进制)数据文件的开头跳过行。跳过的行不计入处理 every 关键字时使用的行数。请注意,skip N 仅跳过行在文件的开头,而 every ::N 在文件中每个数据块的开头跳过行。另请参阅二进制跳过以了解适用于二进制数据文件的类似选项。