给定一行X
像素,如下所示:
0-------|---V---|-------|-------|-------max
如果0 <= V <= max
,在线性尺度下V
的位置将是X/max*V
个像素。在
我如何计算一个对数刻度的像素位置,从像素位置开始,我如何得到V的值?在
对数刻度具有“缩放”刻度左侧的效果。有没有可能对右侧做同样的事情?在
[更新]
谢谢你的数学课!在
最后我没有使用对数。我只是用平均值(在一组值中)作为刻度的中心。此控件用于为将用于绘制choropleth chart的一组值选择组边界百分位。在
如果用户选择对称比例(红色标记=平均值,绿色标记=中心,黑暗表示值的出现次数):
不对称的规模使细粒度调整更容易:
(B为对数底)
显然,您必须确保V>;=1(V=1对应于pos=0,V=0..1对应于-inf..0,对于V<;0,没有定义对数)。在
所以你有一些任意值
V
,你知道0<;=V
<;=Vmax
。你想计算一个像素的x坐标,称之为X
,其中“screen”的x坐标为0到Xmax
。正如你所说,要用“正常”的方式来做,你应该这样做我喜欢这样想,就像我首先通过计算
V / Vmax
将值规范化为介于0和1之间,然后将这个值乘以最大值,得到一个介于0和那个最大值之间的值。在要在逻辑上执行相同的操作,您需要为
^{pr2}$V
值设置一个不同的下限。如果V曾经是<;=0,则得到一个ValueError
。假设0<;Vmin
<;=V
<;=Vmax
。然后你需要找出使用什么对数,因为对数是无穷多的。通常会遇到三种情况,即基数为2、e和10的情况下,x轴如下所示:所以原则上,如果我们能从左边的表达式中得到指数,我们可以用同样的原理来得到一个介于0和
Xmax
之间的值,当然这就是log的来源。假设您使用baseb
,则可以使用以下表达式来回转换:这几乎是相同的思维方式,只是需要首先确保
log(somevalue, b)
将给您一个非负值。通过在log
函数中除以Vmin
来实现这一点。现在你可以除以表达式所能产生的最大值,当然是log(Vmax / Vmin, b)
,你将得到一个介于0和1之间的值,与之前一样。在另一种方法我们需要首先规范化(
X / Xmax
),然后再次放大(* logmax
)到逆函数所期望的最大值。顺便说一下,相反的方法是将b
提高到某个值。现在如果X
为0,b ** (logmax * X / Xmax)
将等于1,所以为了得到正确的下限,我们将Vmin
相乘。或者换一种说法,因为我们做的第一件事就是用Vmin
除,所以我们现在做的最后一件事就是用Vmin
相乘。在要“缩放”方程的“右侧”,您只需切换方程,这样您就可以从}进行幂运算,并将对数取反方向。原则上,就是这样。因为你还得做一些事情,因为
V
到{X
可以是0:这可以很容易地扩展到其他功能。我对空间的度量是用字符而不是像素来表示的(这就是max==chars(或pixels))的原因。
只适用于正值。在
希望以上不是FOO plotlib。但该死的!真是这样!:-)
相关问题 更多 >
编程相关推荐