如何从数据文件取值生成gnuplot图例?语法错误求助
解决gnuplot系统调用提取数据并设置图例的语法问题
问题根源
你遇到的语法错误是双引号嵌套冲突:gnuplot的system()命令用双引号包裹外部shell命令,而awk的printf里又使用了双引号,导致gnuplot提前解析完system()的闭合引号,出现括号不匹配的错误。
修正后的命令
场景1:所有数据块共用文件第二行的参数
如果4He-processed的第二行(文件首行是标题,第二行是参数)是所有绘图数据共用的projectile能量和角度,用以下命令:
plot for [i=20:30:1] '4He-processed' index i u 8:($22>0.2&&$22<2?$9:1/0):10 w yerr t system("head -2 4He-processed | tail -1 | awk '{printf \"E=%.3f, Angle=%.3f\", $3, $4}'")
- 核心调整:awk内部的双引号前加
\转义,避免和gnuplot的system()外层双引号冲突 - 效果:提取第二行的第3、4列,格式化为
E=0.150, Angle=60.000这样的图例文本
场景2:每个数据块有独立的参数行
如果每个index i对应的数据块自己有参数行(比如每个块的第二行是参数),需要定位到对应数据块的行:
plot for [i=20:30:1] '4He-processed' index i u 8:($22>0.2&&$22<2?$9:1/0):10 w yerr t system("awk 'BEGIN{block=0; line=0} /^$/{block++; line=0; next} {line++} block==".i." && line==2 {printf \"E=%.3f, Angle=%.3f\", $3, $4; exit}' 4He-processed")
- 逻辑:用awk遍历文件,按空行计数数据块,找到第
i个块的第二行,提取$3和$4后退出 - 注意:gnuplot变量
i通过.i.拼接进awk命令,实现循环中动态定位数据块
额外说明
- 如果需要自定义图例文本格式,直接修改awk的
printf格式串即可,比如"%s %.3f, %s %.3f", "Energy:", $3, "Angle:", $4 - 避免在
system()中混用未转义的单双引号,优先用转义或切换嵌套层级(比如外层用单引号,内层双引号转义)
内容的提问来源于stack exchange,提问作者Donal Day
相关产品推荐
相关产品推荐

