gnuplot 千百万米微纳米微微中的后缀符号
Posted
技术标签:
【中文标题】gnuplot 千百万米微纳米微微中的后缀符号【英文标题】:suffix notation in gnuplot kilo mega mili micro nano pico 【发布时间】:2015-05-12 09:12:33 【问题描述】:我知道如何在 gnuplot 轴中使用后缀符号:
set ytics format "%.1s%c"
但是在 sprintf 中没有考虑到这一点...
gnuplot> pr sprintf("%s", 2e+3) f_sprintf: attempt to print numeric value with string format
所以我做了自己的功能:
suffixNotation(x)=sprintf("%g%s",\
(x>=1e+9&&x<1e+12 ) ? x*1e-9 :\
(x>=1e+6&&x<1e+9 ) ? x*1e-6 :\
(x>=1e+3&&x<1e+6 ) ? x*1e-3 :\
(x>=1e-3&&x<1 ) ? x*1e+3 :\
(x>=1e-6&&x<1e-3 ) ? x*1e+6 :\
(x>=1e-9&&x<1e-6 ) ? x*1e+9 :\
(x>=1e-12&&x<1e-9) ? x*1e+12 : x\
,\
(x>=1e+6&&x<1e+12 ) ? "G" :\
(x>=1e+6&&x<1e+9 ) ? "M" :\
(x>=1e+3&&x<1e+6 ) ? "k" :\
(x>=1e-3&&x<1 ) ? "u" :\
(x>=1e-6&&x<1e-3 ) ? "n" :\
(x>=1e-9&&x<1e-6 ) ? "p" :\
(x>=1e-12&&x<1e-9) ? "f" : ""\
)
# gnuplot> i=4.321e-13 ; while (i<10e6) pr suffixNotation(i); i=i*10;
# 4.321e-13 4.321f 43.21f 432.1f 4.321p 43.21p 432.1p 4.321n 43.21n 432.1n 4.321u 43.21u 432.1u 4.321 43.21 432.1 4.321k 43.21k 432.1k 4.321G
问题 1 ?有谁知道这个函数是否已经存在于 gnuplot 中?
问题 2? gnuplot 开发者是否计划将其添加到 sprintf 中?
问题 3 ?我们如何处理 gnuplot 中的“包”,例如 load("$GNUPLOTPATH/suffixNotation.gp"),我的意思是正确的。
【问题讨论】:
我只为您的问题 1 和 2 添加了答案。关于“包裹”,我建议您提出一个新问题,因为它与其他问题无关。另外,你应该更清楚你对“正确”的理解。 谢谢克里斯托夫,你知道相反的功能吗?打印 "2k"+0 #==> 2.0 这是错误的。我会调用这个函数 string2float("2.3k") ==> 2.3e+3。有些软件甚至可以解释2.3n+3p,这很棒。我希望 gnuplot 可以做到这一点。 不,gnuplot 中没有解析字符串的功能。这是一个自己的实现:scan_scival(s) = s[:strlen(s)]*(strstrt("munpaz", s[strlen(s):]) > 0 ? 10**(-3.0*strstrt("munpaz", s[strlen(s):])) : (strstrt("kMGTP", s[strlen(s):]) > 0 ? 10**(3.0*strstrt("kMGTP", s[strlen(s):])) : 0))
。这包含一些重复,但更干净,因为 gnuplot 函数没有本地范围,并且函数内部定义的任何变量在调用函数后都是可见的。 print scan_scival("3.44e4k")
给34400000.0
。
【参考方案1】:
Gnuplot 提供了自己的格式化函数gprintf
,它支持所有这些 gnuplot 特定的格式说明符
print gprintf('%.1s%c', 2e+3)
打印
2.0k
引用官方文档:
字符串函数
gprintf("format", x)
使用gnuplot 自己的格式说明符,gnuplot 命令set format、set timestamp 等也是如此。这些格式说明符与 标准 C 语言例程sprintf()
。gprintf()
只接受一个要格式化的变量。
【讨论】:
以上是关于gnuplot 千百万米微纳米微微中的后缀符号的主要内容,如果未能解决你的问题,请参考以下文章