2

我有一个监控多个数据点的应用程序,我正在根据绿色、黄色和红色之间的线性衰减百分比进行着色。然而,这并不能准确地将问题可视化,因为数字越大,问题越严重。范围是 0 -> 30000,我怎样才能生成我认为被称为对数百分比值而不是线性的值?

4

4 回答 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 回答