Localization gnuplot:如何启用千位分隔符(数字分组)?
我使用的是德国Windows 8.1 64位,gnuplot 4.6.5,使用的是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,其中为小数点)。但无论是设置小数点符号,还是根本不调用此命令,都
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进行测试 基本配方:
### 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、德语地区)。