创建一个函数,将(0,1)中的数字映射为蓝色和红色之间的颜色

时间:2018-09-25 02:12:00

标签: python colors

我想创建一个函数colfunc,该函数接收01之间的数字并返回蓝色和红色之间的颜色,其中蓝色对应于{{1 }},红色为0。最终目标是执行以下操作

1

,它应该画一条蓝线 或者,如果我这样做

from matplotlib import pyplot as plt
a=[1,2,3]
plt.plot(a,color=colfunc(0)) 

它应该返回一条红线。这很简单,但是后来我也想能够做到,例如

plt.plot(a,color=colfunc(1)) 

,它应该返回一条紫色调的颜色行,该行更接近蓝色而不是红色,依此类推。

1 个答案:

答案 0 :(得分:1)

您要执行的操作称为Linear interpolation(有时缩写为“ LERP”)。在这种情况下,插值介于RGB colorspace中的两种颜色之间。

这里是如何对问题one answer of mine使用Range values to pseudocolor中的pseudocolor()函数来执行您想要的操作。 (根据您的问题,我已将其重命名为colfunc()。)

def colfunc(val, minval, maxval, startcolor, stopcolor):
    """ Convert value in the range minval...maxval to a color in the range
        startcolor to stopcolor. The colors passed and the one returned are
        composed of a sequence of N component values (e.g. RGB).
    """
    f = float(val-minval) / (maxval-minval)
    return tuple(f*(b-a)+a for (a, b) in zip(startcolor, stopcolor))


if __name__ == '__main__':
    RED, YELLOW, GREEN  = (1, 0, 0), (1, 1, 0), (0, 1, 0)
    CYAN, BLUE, MAGENTA = (0, 1, 1), (0, 0, 1), (1, 0, 1)
    steps = 10
    minval, maxval = 0.0, 1.0
    incr = (maxval-minval)/steps

    print('val       R      G      B')
    for i in range(steps+1):
        val = minval + round(i*incr, 1)
        print('{:.1f} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                    val, *colfunc(val, minval, maxval, BLUE, RED)))

输出:

val       R      G      B
0.0 -> (0.000, 0.000, 1.000)
0.1 -> (0.100, 0.000, 0.900)
0.2 -> (0.200, 0.000, 0.800)
0.3 -> (0.300, 0.000, 0.700)
0.4 -> (0.400, 0.000, 0.600)
0.5 -> (0.500, 0.000, 0.500)
0.6 -> (0.600, 0.000, 0.400)
0.7 -> (0.700, 0.000, 0.300)
0.8 -> (0.800, 0.000, 0.200)
0.9 -> (0.900, 0.000, 0.100)
1.0 -> (1.000, 0.000, 0.000)

以下是一个可视化图表,显示了它将在最小值和最大值(包括0.0-1.0)之内(包括最小值和最大值)产生的不同值所产生的颜色范围:

visualization showing the range of colors from blue to red