十六进制颜色代码究竟如何工作? /如何实现像热图这样的东西

时间:2011-12-18 07:26:03

标签: python colors turtle-graphics

我正在开发一个简单的程序,只需使用Python龟包在一些固定点周围绘制圆圈;然而,我想让它有点像热图,当颜色越来越远离原始点时,颜色越来越冷。我的想法是采用基本的白色#FFFFFF,然后根据远处的颜色减去一个百分比。

我假设十六进制颜色代码的工作方式是,当颜色变得“更冷”时,它的十六进制值越低,但我现在读到前两个代表它的红色值,第二个代表它的绿色,最后一个代表它的蓝色。我将如何以我希望的方式实施热图?

我确信距离是正确的,我只是认为我正在以错误的方式使用颜色代码。我写的函数用于颜色计算:

def findColor(dist):
    base = "FFFFFF"
    num = int(base, 16)
    percent = dist/800 #800 is the max distance away
    newNum = (num - (num*percent))
    color = hex(int(newNum))
    return color

我得到的地图是:

circle heat map

有了Ignacio Vazquez-Abrams关于HSV的帮助,我看起来像这样:):

Updated color algorithm

3 个答案:

答案 0 :(得分:4)

您希望使用HSV代替RGB作为颜色;在距离的色调维度上滑动。 colorsys可以提供帮助。

答案 1 :(得分:1)

诀窍是单独处理三个字节 。我会按照我认为它应该工作的方式重新编写你的功能:

def findColor(dist):
    base = 0xFFFFFF
    percent = dist/800 #800 is the max distance away
    hexpercent = 0xFF - (percent * 0xFF)
    first = (base & 0xFF0000) >> 16
    second = (base & 0xFF00) >> 8
    third = base & 0xFF
    color = hex(((first - hexpercent) << 16) | ((second - hexpercent) << 8) | (third - hexpercent))
    return color

我隔离每个字节,从每个字节中减去百分比,然后将字节重新组合成一个整数。可能有一种更聪明的方法可以做到这一点,但它应该给你一个稳定的灰度梯度。 (如果您想要稳定的红色,绿色或蓝色渐变,请只使用0xFF00000xFF000xFF

请注意,这不会考虑任何physiological properties of color - 可能有更多赏心悦目的方法来解决此问题。 (实际的颜色专家对计算机科学家选择的web-safe colors感到非常不满,因为数字涉及到... ...

答案 2 :(得分:1)

这是将插入任何多色渐变的代码。它设置为白色&gt;红色&gt;绿色&gt;蓝色&gt;黑色,但很容易将其更改为任何其他渐变。

'd'参数的范围是0到1,因此如果您有更大的距离,您可能希望将它们缩小以用于此功能。

代码采用RGB中的颜色,但将它们转换为HSV以进行更好的插值。

import colorsys
import math

GRADIENT_SPEC = [
    (1.0, 1.0, 1.0),  # white
    (1.0, 0.0, 0.0),  # red
    (0.0, 1.0, 0.0),  # green
    (0.0, 0.0, 1.0),  # blue
    (0.0, 0.0, 0.0)]  # black

def gradient(d, spec=GRADIENT_SPEC):
    N = len(spec)
    idx = int(d * (N - 1))
    t = math.fmod(d * (N - 1), 1.0)
    col1 = colorsys.rgb_to_hsv(*spec[min(N - 1, idx)])
    col2 = colorsys.rgb_to_hsv(*spec[min(N - 1, idx + 1)])
    hsv = tuple(a * (1 - t) + b * t for a, b in zip(col1, col2))
    r, g, b = colorsys.hsv_to_rgb(*hsv)
    return '#%02X%02X%02X' % (r * 255, g * 255, b * 255)

for x in xrange(12):
    print x, gradient(x / 10.0)