计算对数百分比

我有一个监控大量数据点的应用程序,我正在根据绿色,黄色和红色之间的线性百分比衰落进行着色。 然而,这并不能准确地将问题可视化,因为数量越大,指数越差。 范围是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); }