Gnuplot技术问题:如何跳过第一列值为0的数据行?
过滤Gnuplot临时表中第一列为0的行及最终筛选最小差值行
方法一:生成临时表时直接过滤无效行
不需要先输出0/1标记行,直接在生成临时表阶段只保留满足条件的记录:
$Data <<EOD # block_1 # block_2 x y x y 1 1979.2 2 2027 1 1598.6 2 1591.4 1 1430.8 2 1401.6 1 1544.7 2 1923.7 1 1953.3 2 1677 1 1288.8 2 1311.1 1 1741.3 2 1689.3 1 1791.1 2 2015.8 EOD pt = 1953.1 limit = 0.5 # 只保留block_1的y与pt差值小于limit的行,同时记录差值和block_2的y set table $Candidates plot $Data u (abs($2 - pt)):($4) w table if (abs($2 - pt) < limit) unset table print $Candidates
这段代码会直接输出所有符合差值要求的行,不会包含标记为0的无效记录。
方法二:过滤已生成的$Temp表中第一列为0的行
如果已经得到了包含0/1标记的$Temp表,可通过二次筛选保留第一列为1的行:
# 生成原始$Temp的代码不变 set table $Temp plot $Data u ( absDiff( 2, pt ) ):( $4 ) w table unset table # 过滤第一列为1的行 set table $Filtered plot $Temp u ($1 == 1 ? $2 : NaN) w table unset table print $Filtered
进阶:筛选差值最小的行
如果存在多行满足条件,要选出差值最小的行,可结合stats命令实现:
$Data <<EOD # block_1 # block_2 x y x y 1 1979.2 2 2027 1 1598.6 2 1591.4 1 1430.8 2 1401.6 1 1544.7 2 1923.7 1 1953.3 2 1677 1 1288.8 2 1311.1 1 1741.3 2 1689.3 1 1791.1 2 2015.8 EOD pt = 1953.1 limit = 0.5 # 生成候选行 set table $Candidates plot $Data u (abs($2 - pt)):($4) w table if (abs($2 - pt) < limit) unset table # 计算最小差值 stats $Candidates u 1 nooutput min_diff = STATS_min # 提取差值最小的行 set table $Result plot $Candidates u ($1 == min_diff ? $2 : NaN) w table unset table print "差值最小的行:" print $Result
内容的提问来源于stack exchange,提问作者magfan
相关产品推荐
相关产品推荐

