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

时间:2016-03-03 23:19:10

标签: gnuplot

注意:我可以控制数据文件的格式,但必须是单个文件。

我正在尝试使用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 个答案:

答案 0 :(得分:3)

保存数据的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

答案 1 :(得分:1)

您可以使用外部程序从第一列中获取值,然后根据该值有条件地绘制数据。

例如,使用python3(和Windows样式引号),我们可以做 1

values = system('python -c "data = sorted(set(x.split()[0] for x in open(\"datafile\",\"r\"))); print(\"\n\".join(data))"')

这将导致变量包含"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

<小时/> 1 使用标准的unix命令,我们也可以(Windows引用)

values = system('awk "{print $1}" datafile | sort | uniq')