如何在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内部会自动近似,直接格式化会丢失精度。此时需要手动指定刻度标签,步骤如下:
- 先将数据保存到临时文件,避免管道传递时的精度损失
- 在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
相关产品推荐
相关产品推荐

