我有时态数据,其中一些时间间隔仅包含缺失值.我想明确地显示那些缺失的值间隔.
现在,我的解决方案是检查值是否是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)它非常难看,特别是当数据集的时间较长时.
我想生产这样的东西:
也就是说,用一种颜色完全填充这个间隔(可能与我的图像不同,有一些透明度).请注意,在这些示例中,只有一个缺失值的间隔,实际上在一个图上可以有任意数量的缺失值.
我们可以做一些预处理来实现这一点。假设我们有以下数据文件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)
2我使用纯橙色作为间隙。随意使用任何颜色规格。
3 awk 程序以与 python 程序相同的方式扩展边界,但需要更多修改才能获得其他行为。它在不处理 NaN 值方面具有与第一个或最后一个数据点相同的限制。
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |