gnuplot:如何使数字 1-999 的 %c 为零 space?
gnuplot: How to get %c zero space for numbers 1-999?
据我了解,数字和单位之间应该空一个space。
然而,在 gnuplot 中,1-999 数字的前缀 %c
(参见 help format specifiers
)显然是 ' '
而不是 ''
。
因此,在下面的示例图中,xtic 标签和 ytic 标签都不正确。
要么你有一些带有 zero space 或 two spaces 的抽动标签,但并非所有标签都带有 一个。这是一个细节,也许有些人甚至不会注意到,但如果可能的话,我更愿意以正确的方式去做。
很久以前我发了一个bug report,但是至今没有任何反应。
是否有立即解决方法?
代码:
### 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
结果:
加法:
根据指向源代码的@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'
修复源码:
目前我只有 Debian Stretch gnuplot 5.0.5 版的源代码,行号等可能已过时。
问题出在 util.c
中第 868 行附近的函数 gprintf
中:
power = (power + 24) / 3;
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
在这里我们看到以下内容:
yzafpnum kMGTPEZY
中的字母是科学前缀。
- 从 1 - 999,
power = (0 + 24) / 3 = 8
- 和
yzafpnum kMGTPEZY"[8]
是额外的space
我不是 C 专家,但作为第一次尝试,我将其更改为
power = (power + 24) / 3;
if (power != 8) {
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
} else {
snprintf(dest, remaining_space, "%s", "");
}
(gprintf
函数要求至少打印一个终止空字符,很可能有更简单的解决方案。)
无需重新编译的解决方法:
手动设置抽动标签怎么样?但我想你以前想过这个主意,但不喜欢它。
它看起来像一个错误。
这是我想出的解决方法。有了这个,数字和单位之间总是有一个space。
您可以使用 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
据我了解,数字和单位之间应该空一个space。
然而,在 gnuplot 中,1-999 数字的前缀 %c
(参见 help format specifiers
)显然是 ' '
而不是 ''
。
因此,在下面的示例图中,xtic 标签和 ytic 标签都不正确。
要么你有一些带有 zero space 或 two spaces 的抽动标签,但并非所有标签都带有 一个。这是一个细节,也许有些人甚至不会注意到,但如果可能的话,我更愿意以正确的方式去做。
很久以前我发了一个bug report,但是至今没有任何反应。 是否有立即解决方法?
代码:
### 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
结果:
加法:
根据指向源代码的@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'
修复源码:
目前我只有 Debian Stretch gnuplot 5.0.5 版的源代码,行号等可能已过时。
问题出在 util.c
中第 868 行附近的函数 gprintf
中:
power = (power + 24) / 3;
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
在这里我们看到以下内容:
yzafpnum kMGTPEZY
中的字母是科学前缀。- 从 1 - 999,
power = (0 + 24) / 3 = 8
- 和
yzafpnum kMGTPEZY"[8]
是额外的space
我不是 C 专家,但作为第一次尝试,我将其更改为
power = (power + 24) / 3;
if (power != 8) {
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
} else {
snprintf(dest, remaining_space, "%s", "");
}
(gprintf
函数要求至少打印一个终止空字符,很可能有更简单的解决方案。)
无需重新编译的解决方法:
手动设置抽动标签怎么样?但我想你以前想过这个主意,但不喜欢它。
它看起来像一个错误。
这是我想出的解决方法。有了这个,数字和单位之间总是有一个space。
您可以使用 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