gnuplot:如何获得数字 1-999 的 %c 零空间?

问题描述 投票:0回答:2

据我了解,数字和单位之间应该有一个空格。

但是,在 gnuplot 中,1-999 之间数字的前缀

%c
(参见
 help format specifiers
)显然似乎是
' '
而不是
''
。 因此,在下面的示例图中,xtic 标签和 ytic 标签都不正确。 您有一些带有 zero 空格或带有 two 空格的 tic 标签,但并非全部带有 one。这是一个细节,也许有些人不会注意到,但如果可能的话我更愿意以正确的方式来做。

不久前我提交了错误报告,但到目前为止还没有回复。 是否有立即解决方法?

代码:

### wrong prefix for %c 1-999
reset session

set size ratio -1
set logscale xy

set format x "%.0s%cΩ"    # no  space
set format y "%.0s %cΩ"   # one space
set xrange [1e-3:1e12]
set grid x, y
plot x
### end of code

结果:

enter image description here

补充:

基于@maij指向源代码的答案,这里是一个gnuplot尝试“修复”这个问题,它应该很容易转移到C。

代码:

### gnuplot "fix" for prefix for %c 1-999

prefix(power) = "yzafpnum kMGTPEZY"[(power+24)/3+1 : (power+24)/3 + sgn(abs(power))]

do for [power=-24:24:3] {
    print sprintf("% 3g  '%s'", power, prefix(power))
}
### end of code

结果:

-24  'y'
-21  'z'
-18  'a'
-15  'f'
-12  'p'
 -9  'n'
 -6  'u'
 -3  'm'
  0  ''   # zero length
  3  'k'
  6  'M'
  9  'G'
 12  'T'
 15  'P'
 18  'E'
 21  'Z'
 24  'Y'
 
gnuplot prefix
2个回答
3
投票

看起来像一个错误。

这是我想出的解决方法。这样,数字和单位之间总是有一个空格。

您可以使用

set xtics add
告诉 gnuplot 在哪里单独设置每个刻度线以及每个标签应该是什么。函数
gprintf
可以使用 gnuplot 说明符格式化数字。

因为我们已经知道每个刻度应该有什么值,所以很容易用循环设置它们。

# Function to choose the right label format.
f(x) = (x < 1000 && x >= 1) ? gprintf("%.0f Ω", x) : gprintf("%.0s %cΩ", x)

# Loop to set each tick mark and label.
do for [i=-2:12:2] {
    set xtics add (f(10**i) 10**i)
    set ytics add (f(10**i) 10**i)
}

set size ratio -1
set logscale xy
set xrange [1e-3:1e12]
set grid x, y

plot x


2
投票

修复源代码:

目前我只有 Debian Stretch gnuplot 版本 5.0.5 的源代码,行号等可能已经过时了。

问题出在第 868 行附近

gprintf
中的函数
util.c
中:

power = (power + 24) / 3;
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);

在这里我们看到以下内容:

  • yzafpnum kMGTPEZY
    中的字母是科学前缀。
  • 从 1 - 999,
    power = (0 + 24) / 3 = 8
  • yzafpnum kMGTPEZY"[8]
    是额外的空间

我不是 C 专家,但作为第一次尝试,我将其更改为

power = (power + 24) / 3;
if (power != 8) { 
   snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
} else { 
   snprintf(dest, remaining_space, "%s", "");
}

gprintf
函数期望至少打印一个终止空字符,很可能有更简单的解决方案。)

无需重新编译的解决方法:

手动设置 tic 标签怎么样?但我认为你以前就提出过这个想法并且不喜欢它。

© www.soinside.com 2019 - 2024. All rights reserved.