计算对数百分比
我有一个监控大量数据点的应用程序,我正在根据绿色,黄色和红色之间的线性百分比衰落进行着色。 然而,这并不能准确地将问题可视化,因为数量越大,指数越差。 范围是0 – > 30000,我怎样才能生成我认为对数百分比值而不是线性百分比值?
使用以下forms的function。
f(x)= sb x / 30000 + t
我们知道0应映射到0%,30000应映射到100%。
f(0)= 0
f(30000)= 100
这些意味着以下方程组。
s + t = 0
sb + t = 100
解决方案(关于b)如下。
s = 100 /(b – 1)
t = -100 /(b – 1)
选择一个特定的b> 1值(比如b = 10)。 然后,您将获得以下解决方案。
s = 100/9
t = -100 / 9
也就是说,函数f(x)如下。
f(x)=(100 10 x / 30000 – 100)/ 9
你可以在这里看到这个function的情节: Wolfram Alpha
在C#中,这将如下所示。
double x = ...; double b = 10.0; double s = 100.0 / (b - 1); double t = -100.0 / (b - 1); double f = s * Math.Pow(b, x / 30000.0) + t;
我假设通过“对数百分比”,您希望以对数为基础将数据映射到范围[0,100]。 你可以尝试这样的事情:
double Scale(int val) { if (val <= 1) return 0; // log is undefined for 0, log(1) = 0 return 100 * Math.Log(val) / Math.Log(30000); }
使用Math.Log(double)
(或Math.Log(double, double)
如果你想使用基数)来获得你的值的对数,你可以映射到一个颜色值。
改进bmm6o的答案:
public static double Scale(long value, long maxInputValue, long maxOutputValue) { if (value <= 1) return 0; // log is undefined for 0, log(1) = 0 return maxOutputValue * Math.Log(value) / Math.Log(maxInputValue); }
如果你正在寻找线性和对数之间的东西,以下可能会有所帮助:
public static double Scale(long value, long maxInputValue, long maxOutputValue, double scaleFactor) { if (value <= 1) return 0; // log is undefined for 0, log(1) = 0 return maxOutputValue * Math.Pow(Math.Log(value), scaleFactor) / Math.Pow(Math.Log(maxInputValue), scaleFactor); }