将线性刻度转换为对数刻度

Convert linear scale to logarithmic scale

我正在从二维线图的绘图中获取数据,并尝试将其绘制在给定尺寸的纸上。 (纸张大小可以改变)为了让线条图适合纸张,我需要缩放它。不幸的是,该图上的一些腿很短,而另一些腿非常长,因此简单的线性比例会导致区域太小而无法看到,单条线通常会占据纸张的一半。我正在尝试使用对数缩放来对此进行补偿,因此整个绘图都在纸上并且最长的长度比最短的长度衰减得更多。我似乎无法在这里解决数学问题。如果我能理解数学,我可以将其翻译成我需要的 C++ 代码。

我看过这里:Convert Linear scale to Logarithmic
这里:https://math.stackexchange.com/questions/970094/convert-a-linear-scale-to-a-logarithmic-scale

基础知识:
我需要将线性 x,y 值转换为从 1-paperWidth 到 1-paperHeight 的对数值。
我的 x 和 y 值将始终为正值,范围从 x-min 到 x-max,以及 y-min 到 y-max。

谁能解释一下这个数学对我来说?
我真的很感激!

让您有范围 xmin..xmax 并希望将其对数映射到 canvas 坐标 X0..X1。等式是:

X = a + b * ln (x)

如果需要,您可以使用十进制对数 log10(此更改仅缩放 b 系数)

替换起点和终点:

X0 = a + b * ln(xmin)
X1 = a + b * ln(xmax)

要找到ab参数,您需要求解上面的方程组。从第二个方程中减去第一个方程

X1 - X0 = b *(ln(xmax) - ln(xmin))  = b * ln(xmax / xmin) 
so
b = (X1 - X0) / ln(xmax / xmin)

现在把这个b值代入第一个方程得到a

a = X0 - b * ln(xmin)

示例:

xmin = 0.01
xmax = 100
X0 = 20
X1 = 800
b = (X1 - X0) / ln(xmax / xmin) = 780/9.21 = 84.7
a = 20 - 84.7 * (-4.6)= 410

所以转换是:

X = 410 + 84.7 * ln(x)

检查一些中间点(在对数 space 中应该均匀 spaced):

x = 0.01 => X = 20
x = 0.1 =>  X = 215
x = 1  =>   X = 410    (OK, this is (20+800)/2)
x = 10 =>   X = 605
x = 100 =>  X = 800

关于评论中的问题:

对数函数 y=ln(x) 将范围 x1..x2(长度 x2-x1)转换为长度范围 ln(x2)-ln(x1)
但是如果我们想要有特定的结果范围长度(例如,canvas大小的绘图),我们应该引入scale系数b.
如果我们希望结果范围从特定的值开始(例如canvas坐标从0开始),我们应该引入shift系数a.

所以我们将结果线性变换到需要的范围内。