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

gnuplot:如何为数字1-999获取%c零空间?,gnuplot,prefix,Gnuplot,Prefix,据我所知,数字和单位之间应该有一个空格 但是,在gnuplot中,1-999之间的数字的前缀%c(请参阅帮助格式说明符)显然是',而不是'。 因此,在下面的示例图中,xtic标签和HYCLY标签都不正确。 要么你有一些tic标签是零空格,要么有两个空格,但不是所有标签都有一个空格。这是一个细节,也许有些人甚至不会注意到,但如果可能的话,我更愿意用正确的方式 很久以前,我提出了一个建议,但到目前为止没有回应。 是否有可能立即解决的办法 代码: ### wrong prefix for %c 1-9

据我所知,数字和单位之间应该有一个空格

但是,在gnuplot中,1-999之间的数字的前缀
%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]
    是额外的空间
我不是C专家,但作为第一次尝试,我将此更改为

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建议的那样在源代码中得到修复。