<p>这里有一个解决方案,只在RGB颜色空间中的颜色之间进行简单的插值。这有问题。。。RGB中颜色之间的欧几里得距离与人类的感知没有直接关系。所以。。。如果你真的想成为一个(以一种好的方式)关于你的颜色是如何被感知的专家,你可能想进入实验室或HCL做这样的事情。在</p>
<p>这些不是最好的裁判,但他们提供了一些关于这种现象的东西,我想。。。在</p>
<ul>
<li><a href="https://earthobservatory.nasa.gov/blogs/elegantfigures/2013/08/05/subtleties-of-color-part-1-of-6/" rel="nofollow noreferrer">https://earthobservatory.nasa.gov/blogs/elegantfigures/2013/08/05/subtleties-of-color-part-1-of-6/</a></li>
<li><a href="https://bl.ocks.org/mbostock/3014589" rel="nofollow noreferrer">https://bl.ocks.org/mbostock/3014589</a></li>
</ul>
<p>所以。。。把警告放在一边。。。这里有一个RGB的解决方案,但在实验室或HCL中可能更好。:)</p>
<p><strong>助手/设置</strong></p>
<pre><code>import numpy as np
# hex (string) to rgb (tuple3)
def hex2rgb(hex):
hex_cleaned = hex.lstrip('#')
return tuple(int(hex_cleaned[i:i+2], 16) for i in (0, 2 ,4))
# rgb (tuple3) to hex (string)
def rgb2hex(rgb):
return '#' + ''.join([str('0' + hex(hh)[2:])[-2:] for hh in rgb])
# weighted mix of two colors in RGB space (takes and returns hex values)
def color_mixer(hex1, hex2, wt1=0.5):
rgb1 = hex2rgb(hex1)
rgb2 = hex2rgb(hex2)
return rgb2hex(tuple([int(wt1 * tup[0] + (1.0 - wt1) * tup[1]) for tup in zip(rgb1, rgb2)]))
# create full palette
def create_palette(start_color, mid_color, end_color, num_colors):
# set up steps
# will create twice as many colors as asked for
# to allow an explicit "mid_color" with both even and odd number of colors
num_steps = num_colors
steps = np.linspace(0, 1, num_steps)[::-1]
# create two halves of color values
pt1 = [color_mixer(first_color, mid_color, wt) for wt in steps]
pt2 = [color_mixer(mid_color, last_color, wt) for wt in steps[1:]]
# combine and subsample to get back down to 'num_colors'
return (pt1 + pt2)[::2]
</code></pre>
<p><strong>创建调色板</strong></p>
^{pr2}$
<p>看起来像这样:</p>
<p><a href="https://i.stack.imgur.com/NuUwN.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NuUwN.png" alt="enter image description here"/></a></p>