gpt4 book ai didi

python - 线性 X 对数刻度

转载 作者:太空狗 更新时间:2023-10-29 20:40:05 32 4
gpt4 key购买 nike

给定一条线 X像素长如:

0-------|---V---|-------|-------|-------max

如果0 <= V <= max , 线性刻度 V位置将是 X/max*V像素。

如何计算对数标度的像素位置,并从像素位置开始如何取回 V 的值?

  1. 这不是家庭作业
  2. 我想知道数学(请不要评论“使用 FOO-plotlib”)
  3. 我喜欢 Python

对数刻度具有“缩放”刻度左侧的效果。是否可以对右侧做同样的事情?

[更新]

感谢您的数学课!

我最终没有使用对数。我只是使用平均值(在一组值中)作为刻度的中心。此控件用于为将用于绘制 choropleth chart 的一组值选择组边界百分位数。 .

如果用户选择对称刻度(红色标记=平均,绿色标记=中心,深色代表一个值出现的次数): enter image description here

不对称比例使细粒度调整更容易: enter image description here

最佳答案

所以你有一些任意值 V ,你知道 0 <= V <= Vmax .你想计算一个像素的 x 坐标,称之为 X ,其中您的“屏幕”的 x 坐标从 0 到 Xmax .正如您所说,要以“正常”方式执行此操作,您会这样做

X = Xmax * V / Vmax
V = Vmax * X / Xmax

我喜欢把它想象成我首先通过计算 V / Vmax 将值归一化到 0 和 1 之间。 ,然后我将此值乘以最大值以获得介于 0 和最大值之间的值。

要以对数方式执行相同操作,您需要为 V 设置不同的下限值(value)。如果 V <= 0,你会得到一个 ValueError .所以假设 0 < Vmin <= V <= Vmax .然后您需要找出要使用的什么对数,因为对数有无穷多个。三个是常见的,基数为 2 的 e 和 10,这导致 x 轴看起来像这样:

------|------|------|------|----      ------|------|------|------|----
2^-1 2^0 2^1 2^2 == 0.5 1 2 4

------|------|------|------|---- ------|------|------|------|----
e^-1 e^0 e^1 e^2 == 0.4 1 2.7 7.4

------|------|------|------|---- ------|------|------|------|----
10^-1 10^0 10^1 10^2 == 0.1 1 10 100

所以原则上,如果我们可以从左边的表达式中得到指数,我们可以使用与上面相同的原理得到一个介于 0 和 Xmax 之间的值。 , 这当然是日志的用武之地。假设你使用 base b ,你可以使用这些表达式来回转换:

from math import log
logmax = log(Vmax / Vmin, b)
X = Xmax * log(V / Vmin, b) / logmax
V = Vmin * b ** (logmax * X / Xmax)

这几乎是相同的思维方式,除了你需要首先确保 log(somevalue, b)会给你一个非负值。您可以通过除以 Vmin 来做到这一点在log里面功能。现在你可以除以表达式可以产生的最大值,这当然是 log(Vmax / Vmin, b) , 你会得到一个介于 0 和 1 之间的值,和以前一样。

另一种方法是我们需要先归一化 (X / Xmax),然后再次放大 (* logmax) 到逆函数预期的最大值。反之就是提高b顺便说一句,有些值(value)。现在如果X是 0,b ** (logmax * X / Xmax)将等于 1,因此为了获得正确的下限,我们乘以 Vmin .或者换句话说,因为我们做的第一件事就是除以Vmin。 ,我们需要乘以 Vmin作为我们现在做的最后一件事。

要“缩放”等式的“右侧”,您需要做的就是切换等式,这样您就可以从 V 取幂。至 X并以另一种方式取对数。原则上是这样的。因为你还必须对 X 的事实做些什么。可以是 0:

logmax = log(Xmax + 1, b)
X = b ** (logmax * (V - Vmin) / (Vmax - Vmin)) - 1
V = (Vmax - Vmin) * log(X + 1, b) / logmax + Vmin

关于python - 线性 X 对数刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8586216/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com