【问题标题】:How to map an integer value to a string in a list?如何将整数值映射到列表中的字符串?
【发布时间】:2013-09-14 08:00:29
【问题描述】:

我想使用 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 标准库中是否已经有可以做到这一点的函数?

【问题讨论】:

  • 看看webcolors模块。
  • max(integer_values)有什么限制吗?
  • 实际上,知道interger_values 的最小和最大允许值会很有用。
  • 谢谢大家,对我来说效果很好!

标签: python list colors hex


【解决方案1】:

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

# 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”的问题的回答,并附有插图。

【讨论】:

    【解决方案2】:

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

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

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

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

    v 是您想要颜色的值时。

    【讨论】:

    • 你需要一个-1 和一轮,就像我的回答一样,否则你总是无法为最大条目着色
    • 是的,我错过了 -1。但我有round()?
    【解决方案3】:

    你需要插值:

    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 以代数方式产生一种颜色,从而使过渡是连续的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2018-07-09
      • 2016-05-12
      相关资源
      最近更新 更多