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

时间:2014-07-30 14:51:01

标签: gnuplot

我有一个包含三列的数据文件: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

得到这个情节:

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行等等,并且它们都是混合的(类似于事件以异步方式发生的日志文件)。

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

1 个答案:

答案 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

结果(使用任一方法):

plotted data