Gnuplot如何使用变量存储的数值设置x轴刻度位置
问题说明
绘制7组数据集图像时,通过stats命令已将每组数据绝对最大值对应的x坐标存入7个变量,命名规则为grN_pos_max_y,N取值范围为1到7,需要将x轴刻度放置在这些变量指定的位置上。
初始尝试的实现代码如下:
首先创建存储变量名的数据块:
$maxima << EOD gr1_pos_max_y gr2_pos_max_y gr3_pos_max_y gr4_pos_max_y gr5_pos_max_y gr6_pos_max_y gr7_pos_max_y EOD
再通过绘图命令读取数据块设置刻度:
plot ..., \ $maxima u 1:(NaN):xticlabel(1) notitle
这套逻辑的问题在于,here-document写入的内容会被原样存为文本,不会自动解析其中的变量名,因此数据块里存的是变量名字符串,不是对应的坐标数值——只有手动把变量名替换成具体数值时,代码才能正常运行。
实现方案
不需要手动替换数值,两种方法可以直接实现需求:
方法1:直接配置x轴刻度(无需额外数据块)
直接通过循环读取所有变量值,追加到x轴刻度配置中,逻辑最简洁:
# 清空原有自定义x轴刻度配置 set xtics () # 循环读取7个变量的坐标值,逐个添加为x轴刻度 do for [i=1:7] { pos = value(sprintf("gr%d_pos_max_y", i)) set xtics add (sprintf("%.3g", pos) pos) }
配置完成后直接执行原有绘图命令即可,不需要在plot语句中额外添加刻度相关的绘制项。
方法2:写入数据块时提前解析变量值
如果希望沿用数据块传参的逻辑,不要直接把变量名写在EOD块中,在写入数据块阶段就把变量解析为实际数值:
# 定向输出到目标数据块,循环写入每个变量的实际坐标值 set print $maxima do for [i=1:7] { print value(sprintf("gr%d_pos_max_y", i)) } unset print # 绘图时正常调用数据块设置刻度即可 plot ..., \ $maxima u 1:(NaN):xtic(1) notitle
编辑补充:使用上述方案实现的最终效果:
内容的提问来源于stack exchange,提问作者Arch Stanton
相关产品推荐
相关产品推荐


