我有一个监控多个数据点的应用程序,我正在根据线性百分比fading between green, yellow and red执行着色。然而,这并不能准确地将问题可视化,因为数量越大,指数越差。范围是0 - > 30000,我怎样才能产生我认为会被称为对数百分比值而不是线性百分比值?
答案 0 :(得分:7)
我假设您通过“对数百分比”将数据以对数为基础映射到范围[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);
}
答案 1 :(得分:3)
使用以下形式的功能。
f(x)= s b x / 30000 + t
我们知道0应映射到0%,30000应映射到100%。
f(0)= 0
f(30000)= 100
这些意味着以下方程组。
s + t = 0
s b + t = 100
解决方案(关于b)如下。
s = 100 /(b - 1)
t = -100 /(b - 1)
选择特定的b&gt; 1个值(比如b = 10)。然后你得到以下解决方案。
s = 100/9
t = -100 / 9
即,函数f(x)如下。
f(x)=(100 10 x / 30000 - 100)/ 9
您可以在此处查看此功能的图表: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;
答案 2 :(得分:1)
改善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);
}
答案 3 :(得分:0)
使用Math.Log(double)
(或Math.Log(double, double)
如果你想玩基数)来获取你的值的对数,你可以映射到一个颜色值。