【问题标题】:Gnuplot: Shortest way to ignore first line in datafileGnuplot:忽略数据文件中第一行的最短方法
【发布时间】:2016-06-02 06:37:41
【问题描述】:

我有一个由另一个 3rd 方应用程序创建的 .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 &lt;filename&gt; 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

【问题讨论】:

  • every ::1 真的那么糟糕吗?这对我来说似乎很优雅。标题字符串"B""C"等来自哪里?它们是列标题吗?
  • 不是“那么糟糕”,但如果这可以在一个语句中而不是在每个情节中完成,我会发现它更优雅。如果我想象一个带有 5 个不同条形和附加误差线的条形图,这将导致 10 个绘图语句,因此有 10 个every ::1。是的,"A""B" 等只是应显示在键/图例中的示例列标题。
  • 你知道情节迭代吗?在gnuplot 提示符下键入help plot iteration
  • 我目前正在外出途中,但我会在回家时考虑一下,谢谢!

标签: plot gnuplot


【解决方案1】:

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

发出命令

set key autotitle columnhead

这告诉 gnuplot 第一行不是数据,而是用于键的列名。您仍然可以像以前一样使用 unset keyplot datafile title sometitle,而 gnuplot 不会使用这些数据。

假设我的文件看起来像

1 2
4 5
7 8

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


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

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

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

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

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

plot @skipfile with lines

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

【讨论】:

  • 在使用任何@之前,请务必使用set macros打开宏。
  • 如果宏不起作用,请尝试@e0k 建议的命令,然后再试一次。但是,我还没有遇到必须发出该命令的 gnuplot 安装。
  • 非常感谢!这似乎正是我想要的,如果这样的@ 是可能的,我也徘徊。两个答案合二为一:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 2018-01-03
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多