使事情清楚:
我的数据如下:
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会忽略整行。
有人有想法吗?
答案 0 :(得分:1)
啊 - 我误解了我的输出。
现在,如果我在上面发布的最小例子中测试整个事情,我的解决方案似乎有效。
我现在创建了一些检查功能dummys,使事情变得更好。
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
答案 1 :(得分:1)
基本上,您可以使用valid
函数检查列是否包含有效数据。如果数据有效,则返回1
,否则返回0
。所以可能的plot
命令如下所示:
plot 'file.txt' using 1:(valid(2)+valid(4)+valid(5) == 3 ? $2 : 1/0),\
...
以下是一种变体,其中要使用的列在字符串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的评论改进了剧本。