如何在gnuplot中用k/m/b/t自定义Y轴数值格式替代科学计数法?
Gnuplot自定义Y轴单位(千k/百万m/十亿b/万亿t)
现有以下Gnuplot柱状图代码,当前Y轴用的是默认科学计数法前缀(比如M、G),想改成用
k代表千、m代表百万、b代表十亿、t代表万亿的格式:
$Data << EOD 2021-09-30 83360000000.0000 2021-12-31 123945000000.0000 2022-03-31 97278000000.0000 2022-06-30 82959000000.0000 2022-09-30 90146000000.0000 2022-12-31 117154000000.0000 2023-03-31 94836000000.0000 2023-06-30 81797000000.0000 2023-09-30 89498000000.0000 EOD set xdata time set timefmt "%Y-%m-%d" set format y "%.0s %c" plot $Data using 1:2 with boxes
当然可以实现,核心是写一个自定义格式函数替换默认的%c前缀逻辑,直接看修改后的代码:
$Data << EOD 2021-09-30 83360000000.0000 2021-12-31 123945000000.0000 2022-03-31 97278000000.0000 2022-06-30 82959000000.0000 2022-09-30 90146000000.0000 2022-12-31 117154000000.0000 2023-03-31 94836000000.0000 2023-06-30 81797000000.0000 2023-09-30 89498000000.0000 EOD set xdata time set timefmt "%Y-%m-%d" # 自定义单位转换函数:根据数值大小匹配对应单位 my_y_format(y) = y >= 1e12 ? sprintf("%.1f t", y/1e12) : \ y >= 1e9 ? sprintf("%.1f b", y/1e9) : \ y >= 1e6 ? sprintf("%.1f m", y/1e6) : \ y >= 1e3 ? sprintf("%.1f k", y/1e3) : \ sprintf("%.0f", y) # 把Y轴格式绑定到自定义函数 set format y "%s" my_y_format # 可选:手动设置Y轴刻度间隔,让显示更规整(这里按200亿间隔,可按需调整) set ytics 20e9 plot $Data using 1:2 with boxes title "季度数值"
关键说明:
- 自定义函数
my_y_format会自动判断数值量级:- 1万亿及以上 → 除以1e12,后缀
t - 1十亿及以上 → 除以1e9,后缀
b - 1百万及以上 → 除以1e6,后缀
m - 1千及以上 → 除以1e3,后缀
k - 小于1千的数值直接显示原数
- 1万亿及以上 → 除以1e12,后缀
set format y "%s" my_y_format是核心,让Gnuplot用你写的函数来格式化Y轴刻度- 如果觉得自动生成的刻度太零散,就用
set ytics手动指定间隔,比如示例里的20e9就是200亿
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

