如何在对数Y轴上计算数据半高位置?求正确计算公式
对数Y轴条形图中间位置的正确计算方法
核心逻辑
对数刻度的本质是将数值转换为对数后呈现线性关系,所以条形的中间位置需要在对数空间取中点,再转换回原始数值空间。
通用公式
假设你的条形图在对数Y轴上,从基准值 b(通常是对数轴的起始有效值,比如1,因为对数无法处理0)延伸到目标值 y:
- 先计算两者的对数平均值:
log10(mid) = (log10(b) + log10(y)) / 2 - 转换回原始数值:
mid = 10^[(log10(b) + log10(y))/2]
可以简化为更直观的形式:
import math mid = math.sqrt(b * y)
常见场景简化
如果你的条形图底部对齐对数轴的最小刻度(通常是1),公式进一步简化为:
mid = math.sqrt(y)
验证示例
- 当
y=2,b=1时:mid=√2≈1.414。对应对数空间:log10(1)=0,log10(2)=0.3010,中点为0.1505,10^0.1505≈1.414,完全符合对数空间的中间位置。 - 当
y=100,b=1时:mid=√100=10。对数空间中点是(0+2)/2=1,对应10^1=10,正确。 - 当
y=0.5,b=0.1时:mid=√(0.1*0.5)=√0.05≈0.2236。对数空间中点是(-1 + (-0.3010))/2≈-0.6505,10^-0.6505≈0.2236,正确。
为什么你之前的公式无效?
y = sqrt(y / 2):这是在原始数值空间取一半的平方根,完全不符合对数空间的线性逻辑,比如y=2时得到1,是条形底部而非中间。y = 10 ** (log(y, 10) - log(2, 10)):等价于y/2,这是线性空间的中点,在对数空间中偏离真实中间位置。- 其他混合对数和原始数值的公式(如
sqrt(h) + log(0.5, 10)):单位不统一,对数和原始数值直接相加无意义。
内容的提问来源于stack exchange,提问作者mikezang
相关产品推荐
相关产品推荐

