gnuplot:如何启用千位分隔符(数字分组)?

时间:2014-03-11 14:13:36

标签: localization plot gnuplot

我使用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或者根本不调用此命令都不会在图中显示数字分组符号。我只会变得丑陋10000001500000而不是1.000.0001.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中获取千位分隔符?

3 个答案:

答案 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

enter image description here

答案 1 :(得分:0)

不是最迷人的解决方案,特别是如果你有很多tics,但你可以做类似的事情

set ytics ("1.000.000" 1e6, "1.500.000" 1.5e6, etc.)

我有兴趣听到更好的事情!

答案 2 :(得分:0)

只是为了娱乐和便利...如果您绝对需要数千个分隔符,则可以构造Windows的解决方法(具有一定的复杂性和局限性)。经过gnuplot 5.2.6的测试。

基本食谱:

  1. 定义一个将数字转换为带有千位分隔符的文本的函数。
  2. 使用带有千位分隔符的文本自己设置tic标签
  3. 通过尝试“模仿” gnuplot的tic标签设置来放置tic标签。为此,请先使用gnuplot有关缩放的建议,方法是先绘制到虚拟端子。为此,此post of @Christoph非常有用。

代码:

### 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]

enter image description here

示例2:(无效,因为GPVAL_X_MIN=-50000,但第一个提示音应该在0上)

set xrange[-50000:1e6]

enter image description here