我试图用python创建一个热图。为此,我必须为可能值范围内的每个值指定一个RGB值。我想把颜色从蓝色(最小值)改为绿色(最大值)。
下面的图片示例解释了我对颜色组成的看法:我们有1(纯蓝色)到3(纯红色)的范围,2介于绿色之间。
我读了关于线性插值的文章,写了一个函数(或多或少)处理最小值和最大值之间某个值的计算,并返回一个RGB元组。它使用if
和elif
条件(这并不能让我完全满意):
def convert_to_rgb(minimum, maximum, value):
minimum, maximum = float(minimum), float(maximum)
halfmax = (minimum + maximum) / 2
if minimum <= value <= halfmax:
r = 0
g = int( 255./(halfmax - minimum) * (value - minimum))
b = int( 255. + -255./(halfmax - minimum) * (value - minimum))
return (r,g,b)
elif halfmax < value <= maximum:
r = int( 255./(maximum - halfmax) * (value - halfmax))
g = int( 255. + -255./(maximum - halfmax) * (value - halfmax))
b = 0
return (r,g,b)
不过,我想知道是否可以在不使用if
条件的情况下为每个颜色值编写一个函数。有人知道吗?非常感谢!
这里有另一种方法,虽然不尽可能短,但更一般,因为它没有硬编码为您的特定颜色集。这意味着它还可以用于在任意颜色的可变大小调色板上线性插值指定范围的值。
还要注意的是,颜色可以在其他颜色空间中进行插值,从而得到比其他颜色更令人满意的结果。这在我提交给一个名为Range values to pseudocolor的相关问题的两个独立答案中得到的不同结果中得到了说明。
数值输出:
下面是显示为水平渐变的输出:
您通常可以将带有索引的
if
消除为两个值的数组。Python缺少一个三元条件运算符,但这是有效的:将
*_curve_1
和*_curve_2
表达式分别替换为中点左侧或右侧的常数、斜率或曲线。我将把这些替代品留给你,但是例如:
red_curve_1
和blue_curve_2
只是0
green_curve_1
是255*(value-minimum)/(halfmax-minimum)
相关问题 更多 >
编程相关推荐