gnuplot:如何为数字1-999获取%c零空间?
据我所知,数字和单位之间应该有一个空格 但是,在gnuplot中,1-999之间的数字的前缀gnuplot:如何为数字1-999获取%c零空间?,gnuplot,prefix,Gnuplot,Prefix,据我所知,数字和单位之间应该有一个空格 但是,在gnuplot中,1-999之间的数字的前缀%c(请参阅帮助格式说明符)显然是',而不是'。 因此,在下面的示例图中,xtic标签和HYCLY标签都不正确。 要么你有一些tic标签是零空格,要么有两个空格,但不是所有标签都有一个空格。这是一个细节,也许有些人甚至不会注意到,但如果可能的话,我更愿意用正确的方式 很久以前,我提出了一个建议,但到目前为止没有回应。 是否有可能立即解决的办法 代码: ### wrong prefix for %c 1-9
%c
(请参阅帮助格式说明符
)显然是'
,而不是'
。
因此,在下面的示例图中,xtic标签和HYCLY标签都不正确。
要么你有一些tic标签是零空格,要么有两个空格,但不是所有标签都有一个空格。这是一个细节,也许有些人甚至不会注意到,但如果可能的话,我更愿意用正确的方式
很久以前,我提出了一个建议,但到目前为止没有回应。
是否有可能立即解决的办法
代码:
### 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
### 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'
结果:
### 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
### 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'
添加:
### 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
### 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'
根据@maij指向源代码的答案,这里有一个gnuplot尝试“修复”这个问题,它应该可以很容易地转移到C
代码:
### 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
### 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'
结果:
### 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
### 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'
修复源代码:
### 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
### 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的源代码,行号等可能已经过时
问题出在第868行附近的util.c
中的函数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]
power = (power + 24) / 3;
if (power != 8) {
snprintf(dest, remaining_space, temp, "yzafpnum kMGTPEZY"[power]);
} else {
snprintf(dest, remaining_space, "%s", "");
}
(gprintf函数要求至少打印一个终止的空字符,很可能有更简单的解决方案。)
无需重新编译的解决方法:
### 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
### 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'
手动设置tic标签怎么样?但我想你以前就想到了这个主意,但你不喜欢它。它看起来像个bug
这是我想出的解决办法。有了这个,数字和单位之间总是有一个空格
您可以使用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
#函数选择正确的标签格式。
f(x)=(x<1000&&x>=1)?gprintf(“%.0fΩ”,x):gprintf(“%.0s%cΩ”,x)
#循环设置每个记号和标签。
为[i=-2:12:2]执行{
设置xtics添加(f(10**i)10**i)
设置ytics添加(f(10**i)10**i)
}
设置大小比率-1
设置对数刻度xy
设置X范围[1e-3:1e12]
设置网格x,y
图x
谢谢!现在我明白了。这解释了为什么它是
'
而不是'
,因为它的功能很简单。我同意,这应该很容易修复。我希望这将在“官方“源代码,而不是由每个人单独编写。我根本不懂C,所以我在我的问题中添加了一个gnuplot尝试,尽管它不会解决这个问题。但我相信这可以很容易地翻译成C。谢谢你的建议!是的,这修复了它,尽管如果您在gnuplot中有autoscale和autoticlabel,手动设置tics并不好。因为我要求立即解决问题,所以我会接受这个答案。尽管如此,我希望它能像@maij建议的那样在源代码中得到修复。