首页 > 解决方案 > 如何在 python 中生成颜色模式/渐变?

问题描述

我正在根据范围设置颜色值0 to 100 (red to green)

到目前为止,一个简单的片段

value = 5
colour = ""
if value <= 25:
   colour = "#FF0000"  # red
elif value > 25 and value <= 50:
    colour = "FF8000" # orange
elif value > 50 and value <=75:
    colour = "#FFFF00"  # yellow
elif value > 75 and value < 100:
    colour = "#53d926" # light green

是否可以自动设置颜色(gradient pattern, from red > orange > yellow > not complete green)?为 100 表示完全成功(绿色)。

现在只有四种颜色。但是基于不同的百分比,它应该为任何value (combination of colours from red > orange > yellow > not complete green, with respective to values)聪明的方法来相应地设置颜色来处理这个?

标签: python-3.xpandasdataframe

解决方案


看来您有 5 个定义明确的点,并且您希望它们之间的值具有平滑的渐变。

  • 0:红色。
  • 25:橙色
  • 50:黄色
  • 75:浅绿色
  • 100:绿色

您可以使用线性插值来获取这些定义点之间的颜色。例如,恰好在两点之间的值就是这两种颜色的平均值。下面的函数lerp提供了这一点。

def all_channels2(func):
    def wrapper(channel1, channel2, *args, **kwargs):
        try:
            return func(channel1, channel2, *args, **kwargs)
        except TypeError:
            return tuple(func(c1, c2, *args, **kwargs) for c1,c2 in zip(channel1, channel2))
    return wrapper

@all_channels2
def lerp(color1, color2, frac):
    return color1 * (1 - frac) + color2 * frac

以下是您将如何使用它:

def hexcolor(rgb):
    return f'#{int(rgb[0]):0>2X}{int(rgb[1]):0>2X}{int(rgb[2]):0>2X}'

if value < 25:
   colour = hexcolor(lerp((0xff, 0x00, 0x00), (0xff, 0x80, 0x00), value / 25))
elif value < 50:
    colour = hexcolor(lerp((0xFF, 0x80, 0x00), (0xFF, 0xFF, 0x00), (value - 25) / 25))
elif value < 75:
    colour = hexcolor(lerp((0xFF, 0xFF, 0x00), (0x53, 0xd9, 0x26), (value - 50) / 25))
else:
    colour = hexcolor(lerp((0x53, 0xd9, 0x26), (0x00, 0xff, 0x00), (value - 75) / 25))

在此处输入图像描述


推荐阅读