我有一个监控多个数据点的应用程序,我正在根据绿色、黄色和红色之间的线性衰减百分比进行着色。然而,这并不能准确地将问题可视化,因为数字越大,问题越严重。范围是 0 -> 30000,我怎样才能生成我认为被称为对数百分比值而不是线性的值?
问问题
7501 次
4 回答
9
我假设您希望通过“对数百分比”以对数方式将数据映射到范围 [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);
}
于 2013-11-04T19:16:21.437 回答
4
使用以下形式的函数。
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
你可以在这里看到这个函数的图: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;
于 2013-11-05T18:30:51.400 回答
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);
}
于 2016-12-23T11:08:35.130 回答
0
使用Math.Log(double)
(或者Math.Log(double, double)
如果您想使用基数)来获取您的值的对数,然后您可以将其映射到颜色值。
于 2013-11-04T10:54:47.823 回答