注意:我可以控制数据文件的格式,但必须是单个文件。
我正在尝试使用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_1
和data_2
应该是两条不同的曲线。
我还想避免在gnuplot脚本中输入可能的数据集的列表,甚至是数字。基本上,我希望它按特定字段“分组”数据点,并将每个组绘制为同一图表上的单独数据集。
作为最后的选择,我可以使用grep将原始文件拆分为每个数据集一个文件,并绘制那些(我想它更容易?),但我正在寻找一种方法来处理单个文件
答案 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
答案 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
当然,这会导致情节不连续。如果我们不想要(例如,使用线条样式),我们可以使用外部程序进行过滤。例如,使用awk(使用Windows引号)
plot for [w in values] sprintf('< awk "($1==\"%s\")" datafile',w) u 2:3 with lines t w
这里我们使用sprintf
使用awk为我们正在使用的索引构建重定向命令:
< awk "($1==\"data_1\")" datafile
< awk "($1==\"data_2\")" datafile
<小时/> 1 使用标准的unix命令,我们也可以(Windows引用)
values = system('awk "{print $1}" datafile | sort | uniq')