使用Gnuplot对缺失值进行着色间隔

Fat*_*ize 5 gnuplot

我有时态数据,其中一些时间间隔仅包含缺失值.我想明确地显示那些缺失的值间隔.

现在,我的解决方案是检查值是否是NaN这样的:

plot file_name using 1:(stringcolumn(num_column) eq "NaN" ? 1/0 : column(num_column)) with lines,\
    "" using 1:(stringcolumn(num_column) eq "NaN" ? 1000 : 1/0) with points
Run Code Online (Sandbox Code Playgroud)

这将导致绘制点y = 1000而不是缺失值的行,这会得到以下结果:

在此输入图像描述

然而,这并不理想,因为a)我需要指定y绘制点的值,b)它非常难看,特别是当数据集的时间较长时.

我想生产这样的东西:

在此输入图像描述

也就是说,用一种颜色完全填充这个间隔(可能与我的图像不同,有一些透明度).请注意,在这些示例中,只有一个缺失值的间隔,实际上在一个图上可以有任意数量的缺失值.

Mat*_*hew 3

我们可以做一些预处理来实现这一点。假设我们有以下数据文件data.txt

1 8
2 6
4 NaN
5 NaN
6 NaN
7 9
8 10
9 NaN
10 NaN
11 6
12 11
Run Code Online (Sandbox Code Playgroud)

和以下 python 3 程序(显然,使用 python 不是执行此操作的唯一方法),process.py 1

data = [x.strip().split() for x in open("data.txt","r")]
i = 0
while i<len(data):
    if (data[i][1]=="NaN"):
        print(data[i-1][0],end=" ") # or use data[i][0]
        i+=1
        while data[i][1]=="NaN": i+=1
        print(data[i][0],end=" ") # or use data[i-1][0]
    else: i+=1
Run Code Online (Sandbox Code Playgroud)

这个Python程序将读取数据文件,对于每个NaN值范围,它将输出最后一个好的和下一个好的x坐标。在示例数据文件的情况下,它输出2 7 8 11可用作绘制矩形的边界。现在我们可以在 gnuplot 2中做

breaks = system("process.py")
set for [i=0:words(breaks)/2-1] object (i+1) rectangle from word(breaks,2*i+1),graph 0 to word(breaks,2*i+2),graph 1 fillstyle solid noborder fc rgb "orange"
Run Code Online (Sandbox Code Playgroud)

这将在此范围内绘制填充矩形。它确定中断变量中有多少个“块”(两个值的组),然后使用中断作为矩形的左边界和右边界一次读取这两个块。

最后,绘制数据

plot "data.txt" u 1:2 with lines
Run Code Online (Sandbox Code Playgroud)

产生

在此输入图像描述

它显示了 NaN 值范围内的填充矩形。


只是为了提供更多的适用性,如果 awk 可用而 python 不可用,下面的 awk 程序process.awk 3与上面的 python 程序具有相同的用途:

BEGIN {
    started = 0;
    last = "";
    vals = "";
}

($2=="NaN") {
    if (started==0) {
        vals = vals " " last;
        started = 1;
    }
}

($2!="NaN") {
    last = $1
    if (started==1) {
        vals = vals " " last;
        started = 0;
    }
}

END {
    sub(/^ /,"",vals);
    print vals;
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过将上面的系统调用替换为

breaks = system("awk -f process.awk data.txt")
Run Code Online (Sandbox Code Playgroud)


1边界延伸到最后一个点和下一个点以完全填充间隙。如果不需要,注释值将仅覆盖文件中由 NaN 标识的区域(示例中为 4-6 和 8-10)。程序不会将 NaN 值作为第一个或最后一个数据点处理。

2我使用纯橙色作为间隙。随意使用任何颜色规格。

3 awk 程序以与 python 程序相同的方式扩展边界,但需要更多修改才能获得其他行为。它在不处理 NaN 值方面具有与第一个或最后一个数据点相同的限制。