gnuplot如何在循环中迭代生成名称动态拼接的datablock数据块
gnuplot循环动态生成命名datablock的解决方案
你遇到的问题核心是gnuplot对datablock名称的识别规则:只有$直接出现在无引号的标识符开头时,才会被判定为内存datablock,通过字符串拼接生成的带引号内容会被统一识别为磁盘文件名。
解决方法:使用gnuplot宏展开功能
- 首先开启宏支持:
set macro
- 循环内先拼接带
$前缀的datablock名称字符串,再通过@符号宏展开后传入set table即可,完整示例如下:
set macro array namelist[3] = ['apple', 'banana', 'pineapple'] do for [i=1:|namelist|] { # 拼接完整的datablock名称 current_db = "$" . namelist[i] . "_data" # 宏展开后识别为datablock,而非文件 set table @current_db # 替换为你自己的读取、计算逻辑,比如读取长路径文件做using运算 plot sprintf("/your/long/file/path/%s_raw.csv", namelist[i]) using 1:($2*0.618 + log($3)) w l unset table }
效果验证
生成的datablock可以直接正常调用,比如:
# 统计苹果数据集 stats $apple_data # 绘制菠萝数据集 plot $pineapple_data using 1:2 w p pt 6
原写法失败的原因
- 第一种写法
set table '$'.namelist[i]."_data":拼接后的结果为带引号的字符串,gnuplot判定为磁盘文件名,因此生成了本地文件。 - 第二种写法
set table $.namelist[i]."_data":gnuplot中$后紧跟.会被识别为「取指定列数据」的语法,和datablock命名规则冲突,因此报错。
内容的提问来源于stack exchange,提问作者Eldrad
相关产品推荐
相关产品推荐

