从一个文件中绘制多个数据集

5
注意:我可以控制数据文件的格式,但它必须是单个文件。
我试图使用gnuplot在同一张图上绘制多个数据集。我想理想情况下绘制如下图所示的内容:
data_1 0 0
data_2 0 0
data_1 1 1
data_2 0 1
data_1 2 2
data_2 1 2

在这种情况下,data_1data_2 应该是两个单独的曲线。
我还想避免在 gnuplot 脚本中放置可能数据集的列表或数量。基本上,我希望通过特定字段“分组”数据点,并将每个组作为单独的数据集绘制在同一图表上。
作为最后的备选方案,我可以使用 grep 将原始文件拆分为每个数据集一个文件,并绘制它们(我想这更容易?),但我正在寻找一种使用单个文件来完成它的方法。
2个回答

7
保存数据的gnuplot方法是使用两个空行将数据集分开。然后,你可以使用index在单个文件中访问不同的数据集:
data_1 0 0
data_1 1 1
data_1 2 2


data_2 0 0
data_2 0 1
data_2 1 2

同时在图表中

画出来。

plot 'file.dat' using 2:3 index 0, '' using 2:3 index 1

要获取数据集的数量,请使用 stats 命令,它会将数据集(数据块)的数量保存到一个变量中,您可以在迭代时使用此变量:
stats 'file.dat' using 0 nooutput
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 2:3 index i

为了扩展这一点,您甚至可以按以下方式格式化文件。
data_1
0 0
1 1
2 2


data_2
0 0
0 1
1 2

并使用第一行搜索数据集作为绘图关键字:

set key autotitle columnheader
stats 'file.dat' using 0 nooutput
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 1:2 index i

enter image description here


如果OP可以重组文件(而且他们确实说他们可以这样做),那么这绝对是正确的方法。我想使用提供的文件结构来回答它。然而,当这种重组是可能的时候,这是更容易的方法。 - Matthew
我有一个非常类似的问题。我无法重新组织我的数据。数据集之间只有一个空行而不是两个。有没有办法告诉gnuplot使用一个空行来分隔数据集,就像我们可以为字段分隔符做的那样? - R.U.

1
你可以使用外部程序从第一列获取值,然后根据这些条件绘制数据。
例如,使用python3(和Windows样式引号),我们可以执行1
values = system('python -c "data = sorted(set(x.split()[0] for x in open(\"datafile\",\"r\"))); print(\"\n\".join(data))"')

这将导致变量values包含"data_1 data_2"。现在,我们可以使用plot for循环遍历此变量。我们测试每行以查看第一列的值是否正确。如果不正确,我们使用值1/0,这会导致gnuplot跳过该行。
plot for [w in values] datafile u 2:((strcol(1) eq w)?$3:1/0) with points pt 7 t w

enter image description here

当然,这会导致图表中出现不连续的情况。如果我们不想要这种情况(例如使用线条样式),我们可以使用外部程序进行过滤。例如,使用awk(带有Windows引号)。
plot for [w in values] sprintf('< awk "($1==\"%s\")" datafile',w) u 2:3 with lines t w

enter image description here

在这里,我们使用 sprintf 函数使用 awk 命令来构建重定向命令,以便处理我们正在使用的索引:

< awk "($1==\"data_1\")" datafile
< awk "($1==\"data_2\")" datafile

使用标准的Unix命令,我们也可以执行以下操作(Windows引号)。
values = system('awk "{print $1}" datafile | sort | uniq')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接