我想使用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标准库中是否已有一个可以执行该操作的函数?
感谢您的帮助!
答案 0 :(得分:1)
您需要插值:
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
以代数方式生成颜色,以便过渡是连续的。
答案 1 :(得分:0)
如果要将任意整数序列映射到颜色值,首先需要限制:
minValue, maxValue = min(integer_values), max(integer_values)
现在,您可以通过查找[minValue, maxValue]
范围内值的相对位置来计算颜色索引:
round( ( len( colorGradient ) - 1 ) * float( v - minValue ) / ( maxValue - minValue ) )
v
是您想要颜色的值。
答案 2 :(得分:0)
我建议您使用函数将值映射到所需范围内的颜色,而不是使用固定大小的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”。