繁体   English   中英

如何将整数值映射到列表中的字符串?

[英]How to map an integer value to a string in a list?

我想使用 Python 执行以下操作:

我有一个从绿色到红色渐变的“十六进制代码颜色”字符串列表。

colorGradient = ['#00a500', '#1ea500', '#3ca500', '#5ab400', '#78b400', '#96c300',
                 '#b4d200', '#d2d200', '#f0e100', '#fff000', '#ffd200', '#ffb400',
                 '#ff9600', '#ff7800', '#ff5a00', '#f04b00', '#ff3c00', '#f02d00',
                 '#e11e00', '#d20f00', '#b40000']

现在我有一个整数值序列。 比如这个..

integer_values = [1, 8, 5, 3, 6, 9]

我想将此序列中的每个值映射到我的“colorGradient”列表中的字符串之一。 值越高,它应该越红,相反:它越低,它应该越绿。

你们中有人知道如何实现这一点吗? Python 标准库中是否已经有一个函数可以做到这一点?

您需要插入:

def gradient_at(x):
    return colorGradient[round(len(colorGradient) - 1) * x)]

def colorize(integer_values):
    max_value = max(integer_values)  # or a known maximal value
    min_value = max(integer_values)  # or a known minimal value

    def color_iter():
        for value in integer_values:
            if min_value != max_value:  # avoid divide by zero
                f = (value - min_value) / (max_value - min_value)
            else:
                f = 0.5

            yield gradient_at(f)

    return zip(integer_values, color_iter())

您可能希望重写gradient_at以代数生成一种颜色,以便过渡是连续的。

如果要将任意整数序列映射到颜色值,首先需要限制:

minValue, maxValue = min(integer_values), max(integer_values)

您现在可以通过在[minValue, maxValue]范围内查找值的相对位置来计算颜色索引:

round( ( len( colorGradient ) - 1 ) * float( v - minValue ) / ( maxValue - minValue ) )

v是您想要颜色的值时。

我建议您使用一个函数将值映射到所需范围内的颜色,而不是使用固定大小的colorGradient表:

# value range
MIN_VAL, MAX_VAL = 0, 10
DELTA_VAL = MAX_VAL - MIN_VAL

# color range
START_COLOR = (0xff,    0, 0)
END_COLOR   = (   0, 0xff, 0)
DELTA_RED   = END_COLOR[0] - START_COLOR[0]
DELTA_GREEN = END_COLOR[1] - START_COLOR[1]
DELTA_BLUE  = END_COLOR[2] - START_COLOR[2]

def color_gradient(val):
    f = float(val-MIN_VAL) / DELTA_VAL
    r = START_COLOR[0] + f*DELTA_RED
    g = START_COLOR[1] + f*DELTA_GREEN
    b = START_COLOR[2] + f*DELTA_BLUE
    return int(r), int(g), int(b)

integer_values = [1, 8, 5, 3, 6, 9]

for val in integer_values:
    print '{} -> #{:02x}{:02x}{:02x}'.format(val, *color_gradient(val))

输出:

1 -> #e51900
8 -> #33cc00
5 -> #7f7f00
3 -> #b24c00
6 -> #669900
9 -> #19e500

还有其他方法可以在 RGB 颜色之间进行插值。 请参阅我对题为“ Python - Range values to pseudocolor ”问题的插图回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM