如何在gnuplot循环中选择指定命名列?脚本异常排查
解决Gnuplot循环选择指定命名列的异常问题
问题概述
实现Gnuplot在for循环中选择指定命名列时遇到以下三个异常:
- 首次加载脚本报错:
gnuplot> load "test_plot_data.gp"
"test_plot_data.gp" line 46: warning: selected_columns is not a string variable
"lh_01":"rh_01"
"test_plot_data.gp" line 62: undefined variable: with - 再次加载脚本时,首次循环能正确读取
lh_01:rh_01数据,但后续循环列名更新为lh_02:rh_02后仍输出旧数据 - 同一Gnuplot会话中后续加载脚本,始终输出
lh_02:rh_02的数据,即使列名设置正确
错误原因分析
- 宏替换与语法错误:用
@selected_columns拼接列名的方式不符合Gnuplot语法,导致变量类型报错;同时set table模式下plot命令不需要额外指定with table,否则会触发"undefined variable: with"错误。 - 循环变量被篡改:在循环内直接修改迭代变量
selected_label,破坏了循环的迭代序列,导致后续循环的列名匹配逻辑混乱。 - 临时表未正确重置:临时数据集
$Temp在循环中未被彻底清空,旧数据残留导致输出异常。
修复后的脚本
reset set datafile missing "NaN" set datafile columnheader # Set up for subjects and column usage $Data << EOD # TP1 gp HS Age lh_01 rh_01 lh_02 rh_02 2 0 37.74 7030.26 7353.44 70.26 73.44 2 0 26.42 7652.64 8566.62 76.64 85.62 2 0 30.20 6938.74 7489.41 69.74 74.41 2 0 27.68 6619.97 6224.74 66.97 62.74 2 1 18.87 7472.23 8635.48 74.23 86.48 2 0 34.56 6612.52 7347.70 66.52 73.70 2 0 33.54 7049.64 7137.09 70.64 71.09 3 1 21.47 8327.11 8745.67 83.11 87.67 1 0 22.00 7924.66 8694.33 79.66 86.33 1 0 24.96 7605.58 8072.01 76.58 80.01 3 1 12.10 8883.32 9230.87 88.32 92.87 2 0 24.72 8271.73 8465.82 82.73 84.82 # TP 2 gp HS Age lh_01 rh_01 lh_02 rh_02 2 0 38.84 7069.54 7380.43 70.54 73.43 2 0 33.14 7705.56 8076.87 77.56 80.87 2 0 39.78 7346.33 7712.80 73.33 77.80 2 0 28.98 6963.54 7171.83 69.54 71.83 2 1 23.71 6830.13 8113.97 68.13 81.97 2 0 39.93 7438.96 7020.43 74.96 70.43 2 0 44.92 6943.02 7204.57 69.02 72.57 3 1 26.82 8245.33 8335.07 82.33 83.07 1 0 24.93 7396.14 7853.01 73.14 78.01 1 0 29.79 7421.25 7810.83 74.25 78.83 3 1 14.55 8672.95 8937.76 86.95 89.76 2 0 27.30 8668.1 8506.81 86.1 85.81 EOD LABELS = "lh_01 rh_01 lh_02 rh_02" # Search string for hemispheres (adjust based on your data) search_string = 'lh' # Loop through selected labels and group labels do for [selected_label in LABELS] { if ( strstrt( selected_label, search_string ) > 0 ) { # 使用新变量存储后缀,避免修改循环迭代变量 suffix = substr( selected_label, strlen( search_string ) + 1, strlen( selected_label ) ) # Set column names left = "lh".suffix right = "rh".suffix # 打印当前处理的列名 print sprintf("Processing columns: %s:%s", left, right) # 清空并重新初始化临时表 unset table $Temp << EOD EOD # Store temporary table set table $Temp # 使用column()函数通过列名获取数据,替代错误的宏替换 plot $Data using (column(left)):(column(right)) unset table print "--- Temp data start ---" print $Temp print "--- Temp data end ---" pause -1 } }
关键修复点说明
- 避免篡改循环变量:新增
suffix变量存储截取后的列名后缀,不修改循环迭代变量selected_label,保证循环序列正常遍历。 - 正确获取列数据:用
column(left)和column(right)函数直接通过列名字符串获取对应列的值,替代错误的宏替换方式,解决语法报错。 - 重置临时表:每次循环前通过
$Temp << EOD清空临时数据集,确保每次循环存储的都是当前列的新数据。 - 移除多余语法:删除
plot命令中的with table,因为set table已经指定输出到临时表,无需额外声明。
内容的提问来源于stack exchange,提问作者magfan
相关产品推荐
相关产品推荐

