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

如何在gnuplot刻度标签中显示大整数?

在gnuplot 5.4中让大整数轴刻度显示为精确整数而非科学计数法

问题背景

在gnuplot 5.4绘制2D图表时,轴上的大整数刻度会自动切换为科学计数法显示。比如执行以下命令生成纳秒级时间戳绘图时,Y轴刻度就会出现科学计数法:

for i in 1 2 3; do date +%s%N; done | gnuplot --persist -e 'plot "-" with points'

尝试过set ytics format "%s"仅去除指数部分但显示的是不精确的double近似值;%u格式符不被识别;%lld会触发解析错误,无法得到精确的整数字符串。

解决方案

根据整数范围的不同,可采用两种处理方式:

1. 整数在double精确表示范围内(≤9e15,即2^53)

直接使用%.0f格式符强制以无小数的整数形式显示刻度,避免科学计数法:

set ytics format "%.0f"
plot "-" with points
# 输入数据
1690000000123456789
1690000001987654321
1690000002111222333

这种方式适用于未超出double精确存储范围的整数,能直接显示完整的整数值。

2. 整数超出double精确表示范围(如19位纳秒时间戳)

由于double无法精确存储超过2^53的整数,gnuplot内部会自动近似,直接格式化会丢失精度。此时需要手动指定刻度标签,步骤如下:

  1. 先将数据保存到临时文件,避免管道传递时的精度损失
  2. 在gnuplot中读取数据的极值,手动生成精确的整刻度标签

示例脚本:

# 生成数据并保存到文件
for i in 1 2 3; do date +%s%N; done > big_data.txt

# 用gnuplot处理
gnuplot --persist <<EOF
# 读取数据统计极值
stats "big_data.txt" using 1 nooutput
# 手动设置Y轴刻度,用sprintf将整数转为精确字符串
set ytics (sprintf("%d", STATS_min), sprintf("%d", STATS_max))
# 如果需要更多刻度,可根据极值间隔手动添加
set ytics add (sprintf("%d", (STATS_min + STATS_max)/2) (STATS_min + STATS_max)/2)
plot "big_data.txt" with points
EOF

另一种简化思路是将超大整数转换为相对偏移量,以减小数值范围,再在刻度标签中拼接基准值:

# 提取基准值(取第一个数据的前10位秒数,补全纳秒位)
base=$(head -n1 big_data.txt | awk '{print substr($1,1,10)"000000000"}')

gnuplot --persist <<EOF
set ylabel "时间戳(纳秒)"
# 用偏移量绘图,刻度标签显示完整时间戳
set ytics format "%s"
set ytics (sprintf("%d", $base) 0, sprintf("%d", $base + 1000000000) 1000000000)
plot "big_data.txt" using (\$1 - $base) with points
EOF

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 09:49:53