gpt4 book ai didi

gnuplot - 在 Gnuplot 中绘制具有混合数据的多列文件

转载 作者:行者123 更新时间:2023-12-02 21:09:00 26 4
gpt4 key购买 nike

我有一个包含三列的数据文件:Xi、Yi 和 Zi,如下所示:

1  1    2
2 4 4
3 9 6
4 16 8
5 25 10

我需要密谋易和子对抗习。所以我使用以下命令:

plot 'speed.txt' using 1:2 with lines, 'speed.txt' using 1:3 with lines

并得到这个图:

enter image description here

但问题是我的数据文件大多数时候不是三列。基本上我有两种不同的数据类型存储在两列中。因此,上面相同的三列文件在两列格式中将如下所示:(最后一列显示生成此数据的汽车)。

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 行,依此类推,它们都是混合的(类似于事件异步发生的日志文件)。

有什么方法可以从这些数据中得到相同的图吗?例如使用汽车名称作为键来分隔不同的数据类型。

最佳答案

这是一种方法。对于第二列中两个以上的不同名称,它不能很好地扩展,但它确实有效:

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

尽管我喜欢将 awk 与 gnuplot 一起使用,但我认为这个脚本有点过长......为了增加可读性,您可能希望将其制作成一个单独的 awk 脚本:

汽车.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

结果(使用任一方法):

plotted data

关于gnuplot - 在 Gnuplot 中绘制具有混合数据的多列文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25039978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com