【问题标题】:How to generate colour pattern/gradient in python?如何在 python 中生成颜色模式/渐变?
【发布时间】:2021-03-15 14:07:39
【问题描述】:

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

到目前为止,一个简单的 sn-p

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 &gt; orange &gt; yellow &gt; not complete green)? 为 100 表示完全成功(绿色)。

目前只有四种颜色。但是根据不同的百分比,它应该为任何value (combination of colours from red &gt; orange &gt; yellow &gt; not complete green, with respective to values) 设置相应的颜色有什么聪明的方法来处理这个吗?

【问题讨论】:

  • 您可以使用线性插值来获得定义点之间的颜色。
  • @MarkRansom 对不起,我没有得到你。
  • @MarkRansom 你能帮帮我吗?
  • 请耐心等待。写一个正确的答案比快速评论要花更长的时间。
  • 谢谢@MarkRansom

标签: python-3.x pandas dataframe


【解决方案1】:

您似乎有 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))

【讨论】:

  • 谢谢马克。我需要时间来理解和分析。暂时执行此代码(值 = 5,int)但出现错误为 ValueError: Unknown format code 'X' for object of type of int/float' (Python 3.9.2)
  • 并且条件循环也可以根据需要修改,否则上面的sn-p总是遇到第一个'if'语句(值
  • @stack 根据format spec for f-strings X 应该产生大写的十六进制值,它在我的系统 Python 3.8 上也是如此。你有哪个版本的 Python?
  • @stack 当然你可以根据需要修改条件,但我在这里给出的并没有错。底部的示例是使用该代码生成的,贯穿所有值 0 到 99。
  • 我使用的是 Python 3.9.2
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 2011-01-01
  • 2011-03-31
  • 2014-10-29
  • 2022-07-28
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多