【发布时间】: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。
标签: string format gnuplot scientific-notation