2

说清楚:

我有看起来像这样的数据:

0,  , ,1,2
1,  , ,2,3
2, 1, ,4,5
3, 1, ,4,6
4, 1,1,4,7
5, 1,2,5,8
6, 1,4,6,7

多列缺失值(仅在文件开头)。现在我想绘制第 2、3 和 5 列,但绘图应该从我要绘制的所有集合都有数据的点开始。

因此,如果我的 xrange 为 [0:10],则如果我绘制 2、3、5,则仅应从 4:6 开始绘制。如果我绘制 2、4、5,那么应该从 2:6 开始绘制。是否有可能测试一个值是否存在?

我已经尝试过类似的东西

plot \
"file.txt" using 1:($2 + ($3*0) + ($5*0)) with lines, \
"file.txt" using 1:($3 + ($2*0) + ($5*0)) with lines, \
"file.txt" using 1:($5 + ($3*0) + ($2*0)) with lines, \

因为我希望如果要使用的一个元素的数据不存在,那么 gnuplot 将忽略整行。

有人出主意吗?

4

2 回答 2

1

啊——我误解了我的输出。

现在,如果我在上面发布的最小示例上测试整个事情,我的解决方案似乎有效。

我现在创建了一些检查函数假人,让事情变得更好。

check2(x1, x2) = 0
check3(x1, x2, x3) = 0
check4(x1, x2, x3, x4) = 0
check5(x1, x2, x3, x4, x5) = 0
check6(x1, x2, x3, x4, x5, x6) = 0
check7(x1, x2, x3, x4, x5, x6, x7) = 0
check8(x1, x2, x3, x4, x5, x6, x7, x8) = 0

plot \
"file.txt" using 1:($2 + check3($2, $3, $5)) with lines, \
"file.txt" using 1:($3 + check3($2, $3, $5)) with lines, \
"file.txt" using 1:($5 + check3($2, $3, $5)) with lines, \

但是,如果有人知道更好的方法,请分享您的知识。

谢谢你

编辑:

结合克里斯托夫在另一个答案中建议的宏,整个事情更加紧凑:

set macro
check3(x1, x2, x3) = 0
AllOrNothing = "check3($2, $3, $5)"
plot \
"file.txt" using 1:($2 + @AllOrNothing ) with lines, \
"file.txt" using 1:($3 + @AllOrNothing ) with lines, \
"file.txt" using 1:($5 + @AllOrNothing ) with lines
于 2013-09-03T13:20:18.463 回答
1

基本上,您可以使用该valid函数来检查列是否包含有效数据。1如果数据有效,则返回,0否则返回。所以一个可能的plot命令如下所示:

plot 'file.txt' using 1:(valid(2)+valid(4)+valid(5) == 3 ? $2 : 1/0),\
...

以下是一个变体,其中要使用的列在 string 中定义cols。检查是动态构造的valid,稍后在 using 语句中作为宏调用。

set datafile separator ','
set style data lines
set macros

cols = "2 4 5"
col_cnt = words(cols)
col_valid = ""
do for [i in cols] {
    col_valid = col_valid . sprintf("valid(%s)+", i)
}
col_valid = col_valid . '0 != col_cnt ? 1/0'

set offsets 0,0,1,1
plot 'file.txt' using 1:(@col_valid : $2) t 'col 2',\
     '' using 1:(@col_valid : $4) t 'col 4',\
     '' using 1:(@col_valid : $5) t 'col 5'

您当然也可以包括循环这些cols值。我跳过了那部分,所以保留一些可读性;)

编辑:根据@vlad_tepesch 的评论改进了脚本。

于 2013-09-03T13:25:41.557 回答