我有一个包含三列的数据文件:Xi,Yi和Zi,如下所示:
1 1 2
2 4 4
3 9 6
4 16 8
5 25 10
我需要将易和Zi绘制成西。所以我使用以下命令:
plot 'speed.txt' using 1:2 with lines, 'speed.txt' using 1:3 with lines
得到这个情节:
但问题是我的数据文件大部分时间都不在三列中。基本上我有两种不同的数据类型存储在两列中。因此,上面相同的三列文件将采用两列格式:(最后一列显示已生成此数据的汽车)。
1 1 car1
1 2 car2
2 4 car1
2 4 car2
3 9 car1
3 6 car2
4 16 car1
4 8 car2
5 25 car1
5 10 car2
数据类型中没有特殊模式,这意味着car1可以生成10行,然后car3生成2行等等,并且它们都是混合的(类似于事件以异步方式发生的日志文件)。
有什么方法可以从这些数据中获得相同的情节?例如,使用汽车名称作为分隔不同数据类型的键。
答案 0 :(得分:1)
这是你可以做到的一种方式。对于第二列中的两个以上不同的名称,它不能很好地扩展,但它确实有效:
set datafile separator ","
plot '<awk ''{printf "%s,%s\n", $1, $3=="car1"?"," $2:$2}'' cars' u 1:2, '' u 1:3
这将“car1”数据放入第二列,将“car2”数据放入第三列。
如果可伸缩性是您所追求的,那么这将适用于许多不同数量的列。它使用相同的方法,但为第三列中的每个唯一名称动态添加新的输出列:
plot '<awk '' \
function r(n) { s=""; for(j=0;j<n;++j) s=s ","; return s } \
{ a[$3,$1] = $2 } \
!seen[$3] { seen[$3] = ++c } \
END{ \
for (i in a) { \
split(i,b,SUBSEP); \
printf "%s%s%s\n", b[2], r(seen[b[1]]),a[i] \
} \
}'' cars' using 1:2, '' using 1:3
尽管我喜欢使用带有gnuplot的awk,我认为这个脚本与长边接壤......为了提高可读性,你可能想把它变成一个单独的awk脚本:
<强> cars.awk 强>
# repeat comma n times
function r(n) {
s=""
for (j = 0; j < n; ++j)
s = s ","
return s
}
# add each element to array, indexed on third,first column
{ a[$3,$1] = $2 }
# register any new names seen in column three
!seen[$3] {
seen[$3] = ++c
}
END {
for (i in a) {
# the index $3,$1 from above is separated by
# the built-in variable SUBSEP
split(i, b, SUBSEP)
# now b[1] is the name (car1 or car2)
# which is used to determine how many commas
# b[2] is the x value
# a[i] is the y value
printf "%s%s%s\n", b[2], r(seen[b[1]]), a[i]
}
}
然后在你的gnuplot中,只需调用脚本:
plot '<awk -f cars.awk cars' using 1:2, '' using 1:3
结果(使用任一方法):