如何在Gnuplot中用一个文件的标题绘制多个数据集?

如何在Gnuplot中用一个文件的标题绘制多个数据集?,gnuplot,Gnuplot,假设我有一个如下所示的文件: "p = 0.1" 1 1 3 3 4 1 "p = 0.2" 1 3 2 2 5 2 plot 'data.dat' i 0 t "p = 0.1", '' i 1 t "p = 0.2" 是否可以让Gnuplot在一个绘图中绘制这两个数据集,并在每个数据集的第一行给出标题?只需稍微修改您的数据集(以便标题作为注释给出): 可以将这两个数据集绘制为单独的直线,如下所示: "p = 0.1" 1 1 3 3 4 1 "p = 0.2" 1 3 2 2 5

假设我有一个如下所示的文件:

"p = 0.1"
1 1
3 3
4 1


"p = 0.2"
1 3
2 2
5 2
plot 'data.dat' i 0 t "p = 0.1", '' i 1 t "p = 0.2"

是否可以让Gnuplot在一个绘图中绘制这两个数据集,并在每个数据集的第一行给出标题?

只需稍微修改您的数据集(以便标题作为注释给出):

可以将这两个数据集绘制为单独的直线,如下所示:

"p = 0.1"
1 1
3 3
4 1


"p = 0.2"
1 3
2 2
5 2
plot 'data.dat' i 0 t "p = 0.1", '' i 1 t "p = 0.2"

plot命令的
index
i
简称)选项告诉gnuplot绘制
i
th数据集。我找不到让gnuplot自动从标题中获取标题的方法,这就是为什么我使用
title
t
)选项手动指定标题。

这是绝对可能的,而且您的数据文件已经是正确的格式。您正在寻找的功能内置于
columnheader(N)
中,它读取第N列顶部的数据并将其用作绘图标题:

 plot 'test.dat' i 0 u 1:2 w lines title columnheader(1),\
      'test.dat' i 1 u 1:2 w lines title columnheader(1)
可以使用迭代将其压缩:

plot for [IDX=0:1] 'test.dat' i IDX u 1:2 w lines title columnheader(1)

根据andyras(和)给出的答案,自动化所有流程的解决方案是:

datafile = 'test.dat'
stats datafile
plot for [IDX=1:STATS_blocks] datafile index (IDX-1) u 1:2 w lines t\ 
columnheader(1) lc variable
这样,脚本会自动检测数据块的数量,并使用不同的颜色和在每个数据块的第一行中定义的相应标题进行打印

gnuplot 5.1(2016/08/28)

这与类似,但对更高版本进行了一些修复

教我[i=0:]的
语法,它分配了
stats
,因此有点好

脚本:

datafile = 'test.dat'
stats datafile nooutput
plot for [IDX=0:STATS_blocks-1] \
    datafile \
    index IDX \
    using 1:2 \
    with lines \
    title columnheader(1)
测试数据:

a
1, 1
2, 2
3, 3


"b"
1, 1
2, 4
3, 9


"c, c"
1, 1
2, 8
3, 27
输出:

这适用于gnuplot 2016/08/28,稍后将成为gnuplot 5.1,但不适用于gnuplot 5.0.3(Ubuntu 16.04),因为在5.0.3中,
stats
命令给出错误,因为列标题不是有效数据。2016年8月28日,这只是一个警告

我已询问如何删除以下位置的警告:

使用如下注释:

#a
1, 1
2, 2
3, 3
在我测试过的两个版本中都不起作用,只是被忽略了。

这是和答案,但没有中间的
统计数据:

# plot.gpi
datafile = ARG1
plot for [i=0:*] datafile index i using 1:2\
with lines title columnheader(1)
for
循环可以直接迭代文件中的所有数据集。它在gnuplot5.0.5中工作,但我不确定
何时获得此功能。在中有记录,但没有

除非线条颜色应由
linecolor变量
使用的第三个输入列确定(根据Bruce的回答),否则gnuplot将自动分配不同的颜色和线条样式。在这种特定情况下,也可以省略使用1:2的

$ gnuplot --version
gnuplot 5.0 patchlevel 5
$ gnuplot --persist -c plot.gpi test.dat

test.dat

"p = 0.1"
1 1
3 3
4 1


"p = 0.2"
1 3
2 2
5 2

谢谢然而,让Gnuplot使用文件中给出的标题才是重点。但是如果这真的不可能,那么我将不得不按照你建议的方式来做:-(@andyras--你肯定可以自动获得标题:-)。诀窍是
columnheader
(参见我的答案)。我曾尝试将
columnheader(1)
用于我的数据文件格式(标题为注释),但它不起作用。不过,对于原始海报的格式,你是对的,我很高兴有这么简单的解决方案@andyras——这是因为您注释掉了标题“data”,所以gnuplot忽略了它。据我所知,
#
数据文件中的行被所有东西忽略,而不解析的行(例如非数字)在打印时被愉快地忽略,但它们仍然可用于特殊功能,如
columnhead
。出于某种原因,使用建议的第一种方法会导致“相当大”的文件出现问题。我正在尝试打印一个2 GB的文件,我有32 GB的ram,内存不足,因为我的'test.dat'包含50个数据系列,因此我有一个'plot'命令,后面有50条打印指令。似乎GNUPLOT正在将2GB文件加载到内存中50次,导致内存不足@mgilson不幸的是,这会导致信息丢失-我正在绘制随机数据,因此如果绘制所有点非常方便,因为它显示了数据在短时间内的传播。@mgilson数据是随机的-无法知道在向下采样时可以去除哪些点您测试了哪个版本?在5.0.3版本中,我需要一些修复程序才能工作:很高兴了解到
for
中的
*
可以更轻松地实现各种有用的功能。然而,在其他情况下,我们可能需要在其他地方使用块的数量,因此仍然需要使用
stats
。例如,现在我需要
STATS\u blocks
计算调色板中的步长,以生成平滑的颜色范围。