Gnuplot中使用table与convexhull时如何仅导出非NaN行?
解决gnuplot中set table $HULL生成大量NaN行的问题
问题背景
使用gnuplot的set table $HULL结合plot ... convexhull处理datos.txt数据时,生成的$HULL变量中包含大量NaN行。需要在保留x、y列原始显式格式的前提下,仅保留非NaN行,且必须使用set table实现(无法通过无table方式满足格式要求)。
解决方案
通过两步处理:先生成包含凸包数据的原始$HULL变量,再过滤其中的NaN行到新变量中,全程保留列格式。
示例代码
# 第一步:生成包含完整凸包数据(含NaN行)的$HULL变量 set table $HULL plot 'datos.txt' using 1:2 convexhull unset table # 第二步:过滤非NaN行到$HULL_CLEAN,保留原始列格式 set table $HULL_CLEAN # 仅当x、y均为非NaN时输出,NaN行会被自动跳过 plot $HULL using ($1 == $1 ? $1 : NaN) : ($2 == $2 ? $2 : NaN) with table unset table # 可选:删除原始$HULL变量释放空间 unset data $HULL
关键原理
- NaN判断逻辑:gnuplot中NaN不等于自身,因此
$1 == $1可准确判断x列是否为非NaN,同理$2 == $2判断y列。 - 格式保留:通过
set table读取原始$HULL的数据并过滤,会完全保留原数据的列格式(如小数位数、科学计数法等),避免手动输出(如print)导致的格式失真。 - 过滤机制:当
using语句返回NaN时,with table不会将该行写入目标变量,从而自动剔除所有包含NaN的行。
简化版(直接生成过滤后的凸包数据)
若无需保留原始含NaN的$HULL,可直接在生成时过滤:
set table $HULL # 先计算凸包,再仅输出非NaN行 plot 'datos.txt' using ($1 == $1 ? $1 : NaN) : ($2 == $2 ? $2 : NaN) convexhull with table unset table
注:此方法需确保原始
datos.txt中无NaN行,否则会影响凸包计算结果。若原始数据含NaN,建议使用两步法。
内容的提问来源于stack exchange,提问作者ifffam
相关产品推荐
相关产品推荐

