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

Localization gnuplot:如何启用千位分隔符(数字分组)?,localization,plot,gnuplot,Localization,Plot,Gnuplot,我使用的是德国Windows 8.1 64位,gnuplot 4.6.5,使用的是svg终端。如果我绘制有大数字的数据文件,比如“一百万”,gnuplot不会打印数字分组符号 例如,如果我的数据文件的值约为一百万,我希望y轴上的数字显示为1.000.000(其中是组号,而不是小数!),但gnuplot只给我1000000 选项set decimalsign locale仅更改小数点(整数和小数部分之间的分隔符,如1+1/2=1,5,其中为小数点)。但无论是设置小数点符号,还是根本不调用此命令,都

我使用的是德国Windows 8.1 64位,gnuplot 4.6.5,使用的是
svg
终端。如果我绘制有大数字的数据文件,比如“一百万”,gnuplot不会打印数字分组符号

例如,如果我的数据文件的值约为一百万,我希望y轴上的数字显示为
1.000.000
(其中
是组号,而不是小数!),但gnuplot只给我
1000000

选项
set decimalsign locale
仅更改小数点(整数和小数部分之间的分隔符,如
1+1/2=1,5
,其中
为小数点)。但无论是设置
小数点符号,还是根本不调用此命令,都不会在绘图中显示数字分组符号。我只得到了丑陋的
1000000
1500000
而不是
1.000.000
1.500.000

我也试过了

set decimal locale
set format y "%'f"
这给了我一个标签“%'f”,而不是数字!每个议会都只有一次又一次的“%”f“。它只是按原样将格式字符串打印到绘图中,根本没有数字。控制台输出为
十进制\u sign in locale为,
,这对于德语locale是正确的,因此gnuplot可以正确识别它。在我的Windows控制面板中,千位分隔符被正确设置为
,小数点也被正确设置为

手动设置tic不是选项。也就是说,
set ytics add('1.000.000'1e6)
for dozenz of dozenz tics对我来说不是选项


如何在gnuplot中自动获得千个分隔符?

不是最吸引人的解决方案,尤其是如果您有很多
tics
,但您可以执行以下操作

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

我很想听到更好的消息

这在Windows上似乎不起作用。从gnuplot文档中

国际化(语言环境设置):Gnuplot使用C运行时库例程setlocale()控制输入和输出数字、时间和日期字符串的语言环境特定格式。可用的区域设置以及对区域设置功能(如“千位分组分隔符”)的支持级别取决于您的个人计算机提供的国际化支持

从这样的问题来看,这是不可能的,因为格式字符串中的撇号是Unix的特长,而不是C标准

我认为在Windows上使用自动缩放没有解决办法

请注意:以下脚本在Linux上运行良好:

set format "%'.0f"
set xrange [0:1e6]
plot x

只是为了好玩和实用。。。如果您绝对需要数千个分隔符,您可以为Windows构建一个解决方案(具有一些复杂性和限制)。使用gnuplot 5.2.6进行测试

基本配方:

  • 定义一个函数,该函数使用千个分隔符将数字转换为文本
  • 使用带有千个分隔符的文本自行设置tic标签
  • 通过尝试“模仿”gnuplot的tic标签设置来放置tic标签。为此,使用gnuplot关于缩放的建议,首先绘制到虚拟终端。对于这一点,这是非常有帮助的 代码:

    ### 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
    
    ###为Windows的tic标签添加1000个分隔符
    重置会话
    #千位分隔符的设置
    ts=“”#千位分隔符
    千分位分离器(a,ts)=绝对值(a)>=1000?(TS_a=sprintf(“%.0f”,a),TS_b=strlen(TS_a)\
    ":"(sum[tsu i=tsu c:tsu b]\
    (TS_d=((TS_b-TS_i)%3==0&&(TS_i40?0.05:posns(轴)>20?0.1:posns(轴)>10?0.2:posns(轴)>4\
    0.5:posns(轴)>2?1:posns(轴)>0.5?2:ceil(范围(轴))
    ticstep(轴)=tics(轴)*功率(轴)
    设置X范围[0:1e6]
    设置终端推送#保存当前终端
    设置终端未知
    地块x lc rgb“web绿色”
    设置终端弹出#恢复终端
    #集合xtics
    [i=0:ceil(范围(“x”)/ticstep(“x”))+1]的do{
    设置xtics add(千位分隔符(GPVAL\u X\u MIN+i*ticstep(“X”),“'))GPVAL\u X\u MIN+i*ticstep(“X”))
    }
    #设置ytics
    [i=0:ceil(范围(“y”)/ticstep(“y”)+1]的do{
    设置ytics add(千位分隔符(GPVAL_Y_MIN+i*ticstep(“Y”),“'))GPVAL_Y_MIN+i*ticstep(“Y”))
    }
    雷普特
    ###代码结束
    
    限制:

    如果轴的起点(例如,GPVAL_X_MIN)与第一个tic标签不一致,则上述程序不起作用(尚未)。 但是,我还没有找到gnuplot设置为第一个tic值的值。似乎没有用于此的
    GPVAL\uu…
    变量。也许可以以某种方式提取它

    示例1:(正常工作)

    设置xrange[0:1e6]

    示例2:(不起作用,因为
    GPVAL\u X\u MIN=-50000
    ,但第一个tic应该在
    0

    设置xrange[-50000:1e6]


    谢谢,但是如果你使用自动缩放,这就不起作用了。我正在用完全相同的脚本绘制许多类似的图形,不需要调整任何东西。只有tic数字不起作用。手动设置它们在自动设置中不是解决方案。谢谢,那么我已经猜到了这一点。这样的情况有可能发生吗该功能将以某种方式在gnuplot中实现(例如,自己的实现而不是在C库中实现)?我不知道。您可以尝试在提交一个功能请求,但不幸的是,这在Ubuntu 20.04上的5.2 patchlevel 8中不起作用。幸运的是,添加
    设置小数点区域设置;设置小数点“.”
    在您发布命令之前(在Ubuntu 20.04、gnuplot 5.2、德语地区)。