将数字标准化到 0-100% 的范围

Normalizing Numbers to a 0-100% Range

我的最终目标是创建一个简单的水平条形图,根据它们的相对差异将一组值从绿色到红色着色。

当存在较大的值差距时它工作正常,例如它可以看起来像这样(在这种情况下最高值是 37,底部是 10).

但是,如果我尝试使用一组都在同一范围内的数字进行此操作,它将不再显示我要查找的内容,因为它们都是 "green" 因为它们非常接近彼此。

这是范围从 6662:

时的样子

我试过用0-1归一化函数,比如:

x = a + (X - A) * (b - a) / (B - A)

在我的 C# 中,它看起来像这样:

    private static int Normalize(List<int> list, int currentValue) {

        int endOfScale = 1;
        int topOfScale = 100;
        int min = list.Min();
        int max = list.Max();

        var normalized = endOfScale + (currentValue - min) * (topOfScale - endOfScale) / (max - min);

        return normalized;

    }

最后,这些值在客户端上 运行 到 JavaScript 通过以下方式生成 RGB 颜色值:

function getGreenToRed(percent){
    r = percent<50 ? 255 : Math.floor(255-(percent*2-100)*255/100);
    g = percent>50 ? 255 : Math.floor((percent*2)*255/100);
    return 'rgb('+r+','+g+',0)';
}

这也可能是问题所在,我正在尝试确定攻击哪一方。

将 62 标准化为 0 正是您想要的。只需根据归一化值对条形图进行着色,但使用原始值绘制长度。您的归一化值表示您的原始值在值顺序中的位置,但它不是用于绘制的值。

public Color ColorFromNormalized(int normalized)
{
    if(normalized == 100)
        return Color.Green;
    if(normalized > 70)
        return Color.Yellow;
    if(normalized > 30)
        return Color.Orange;
    return Color.Red
}

在这里回答我自己的问题,但接受@Sebastian 因为这是让我走上正确道路的原因。

他们的关键是这个声明:

Just color the bar in accordance to the normalized value, but draw the length with the original value.

这就是诀窍。我不喜欢 fixed-color 方法,所以我让它比那个更高级一点。但它有效。

原始范围 6266 没有标准化颜色:

之后,相同范围:

如果有帮助,原始问题中显示了 Normalize 函数。

客户端 JavaScript 相同,只是我现在将 标准化 值传递给 JavaScript RGB 函数。

这里,参数percent,是0-100归一化百分比

function getGreenToRed(percent){
    r = percent<50 ? 255 : Math.floor(255-(percent*2-100)*255/100);
    g = percent>50 ? 255 : Math.floor((percent*2)*255/100);
    return 'rgb('+r+','+g+',0)';
}