我想创建一个函数colfunc
,该函数接收0
和1
之间的数字并返回蓝色和红色之间的颜色,其中蓝色对应于{{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))
,它应该返回一条紫色调的颜色行,该行更接近蓝色而不是红色,依此类推。
答案 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)之内(包括最小值和最大值)产生的不同值所产生的颜色范围: