我使用gnuplot 4.6.5使用svg
终端使用德语版Windows 8.1 64Bit。如果我绘制具有大数字的数据文件,例如“一百万”,gnuplot不会打印数字分组符号。
例如,如果我的数据文件的值大约为一百万,我希望y轴上的数字显示为1.000.000
(.
是组符号,而不是小数签名!),但是gnuplot只给了我1000000
。
选项set decimalsign locale
只会更改小数点(整数和小数部分之间的分隔符,例如1+1/2 = 1,5
,其中,
是小数点)。但是,设置decimalsign
或者根本不调用此命令都不会在图中显示数字分组符号。我只会变得丑陋1000000
或1500000
而不是1.000.000
或1.500.000
。
我也试过
set decimal locale
set format y "%'f"
它只给了我所有的抽搐标签“%'f”,而不是数字!每次抽搐都是“%'f”,一次又一次。它只是将格式字符串打印到图中,根本没有数字。控制台输出为decimal_sign in locale is ,
,这对于德语区域设置是正确的,因此gnuplot可以正确识别它。在我的Windows控制面板中,千位分隔符正确设置为.
,小数点设置为,
。
手动设置tic是没有选择的。即set ytics add ('1.000.000' 1e6)
对于我来说,打击十几个抽搐是不可能的。
如何自动在gnuplot中获取千位分隔符?
答案 0 :(得分:4)
这似乎不适用于Windows。来自gnuplot文档
国际化(语言环境设置):Gnuplot使用C运行时库例程setlocale()来控制输入和输出数字,时间和日期字符串的特定于语言环境的格式。可用的语言环境以及对“千位分组分隔符”等语言环境功能的支持级别取决于您的单个计算机提供的国际化支持。
从How can I add a thousands separator to a double in C on Windows? Printing integers with thousands separators in Windows using C这样的问题来看,这是不可能的,因为格式字符串中的撇号是Unix专业而不是C标准。
我认为没有解决方法可以在Windows上使用自动缩放功能。
对于记录:以下脚本在Linux上运行正常:
set format "%'.0f"
set xrange [0:1e6]
plot x
答案 1 :(得分:0)
不是最迷人的解决方案,特别是如果你有很多tics
,但你可以做类似的事情
set ytics ("1.000.000" 1e6, "1.500.000" 1.5e6, etc.)
我有兴趣听到更好的事情!
答案 2 :(得分:0)
只是为了娱乐和便利...如果您绝对需要数千个分隔符,则可以构造Windows的解决方法(具有一定的复杂性和局限性)。经过gnuplot 5.2.6的测试。
基本食谱:
代码:
### add thousand separators to tic labels for Windows
reset session
# settings for thousand separator
ts = "'" # thousand separator
ThousandSeparator(a,ts) = abs(a)>=1000 ? (TS_a=sprintf("%.0f",a), TS_b=strlen(TS_a), \
TS_c=strstrt(TS_a,'-')+1, TS_d=TS_c>1?'-':'', (sum[TS_i=TS_c:TS_b] \
(TS_d=((TS_b-TS_i)%3==0&&(TS_i<TS_b)?TS_d.TS_a[TS_i:TS_i].ts:TS_d.TS_a[TS_i:TS_i]),\
0), TS_d)) : sprintf("%g",a)
# settings for (auto-)tics
range(axis) = axis eq "y" ? abs(GPVAL_Y_MAX-GPVAL_Y_MIN) : abs(GPVAL_X_MAX-GPVAL_X_MIN)
power(axis) = 10.**int(sprintf("%.15e",range(axis))[strstrt(sprintf("%.15e",range(axis)),"e")+1:])
rangenorm(axis) =range(axis)/power(axis)
posns(axis) = 20.0 / rangenorm(axis)
tics(axis) = \
posns(axis)>40?0.05:posns(axis)>20?0.1:posns(axis)>10?0.2:posns(axis)>4? \
0.5:posns(axis)>2?1:posns(axis)>0.5?2:ceil(range(axis))
ticstep(axis) = tics(axis) * power(axis)
set xrange[0:1e6]
set terminal push # save current terminal
set terminal unknown
plot x lc rgb "web-green"
set terminal pop # restore terminal
# set xtics
do for [i=0:ceil(range("x")/ticstep("x"))+1] {
set xtics add (ThousandSeparator(GPVAL_X_MIN+i*ticstep("x"),"'") GPVAL_X_MIN+i*ticstep("x"))
}
# set ytics
do for [i=0:ceil(range("y")/ticstep("y"))+1] {
set ytics add (ThousandSeparator(GPVAL_Y_MIN+i*ticstep("y"),"'") GPVAL_Y_MIN+i*ticstep("y"))
}
replot
### end of code
限制:
如果轴的起点(例如GPVAL_X_MIN
)与第一个tic标签不相同,则上述步骤无效(尚未)。
但是,我尚未找到gnuplot设置为第一个tic值的值。似乎没有GPVAL_...
变量。也许可以通过某种方式提取它?
示例1:(工作正常)
set xrange[0:1e6]
示例2:(无效,因为GPVAL_X_MIN=-50000
,但第一个提示音应该在0
上)
set xrange[-50000:1e6]