You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

编辑补充:使用上述方案实现的最终效果:
峰值位置x轴刻度效果示例

内容的提问来源于stack exchange,提问作者Arch Stanton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:27:13