<p><strong>编辑:</strong>Matplotlib现在有很好的循环颜色映射,请参阅下面@andras deak的答案。他们使用类似于这个答案的颜色映射方法,但是在亮度上平滑边缘。</p>
<p>“色调外壳”颜色映射的问题是,从中读取角度是不直观的。因此,我建议你自己制作彩色地图。以下是一些可能性:</p>
<ul>
<li>对于<em>线性分段颜色映射</em>,我们定义了一些颜色。然后,颜色映射是颜色之间的线性插值。这有视觉扭曲。</li>
<li>对于<em>亮度HSLUV map</em>,我们使用HUSL(“HSLUV”)空间,但是我们使用两种颜色和亮度通道,而不仅仅是色调通道。这个有<a href="http://www.hsluv.org/comparison/" rel="nofollow noreferrer">distortions in the chroma</a>,但有明亮的颜色。</li>
<li>在亮度HPLUV图中,我们使用HPLUV颜色空间(根据@mwaskom的评论)。这是唯一一种真正没有视觉扭曲的方法,但是颜色是不饱和的
这就是他们的样子:</li>
</ul>
<p><a href="https://i.stack.imgur.com/rjOQg.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/rjOQg.png" alt="colormap with simple function"/></a></p>
<p>在我们的自定义颜色图中,白色代表0,蓝色代表1i,等等。
在右上角,我们可以看到色调外壳图进行比较。在这里,颜色角度指定是随机的。</p>
<p><a href="https://i.stack.imgur.com/4qpmh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4qpmh.png" alt="enter image description here"/></a></p>
<p>另外,当绘制一个更复杂的函数时,当使用我们的一个颜色映射时,可以直接读取结果的阶段。</p>
<p>下面是情节的代码:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as col
import seaborn as sns
import hsluv # install via pip
import scipy.special # just for the example function
##### generate custom colormaps
def make_segmented_cmap():
white = '#ffffff'
black = '#000000'
red = '#ff0000'
blue = '#0000ff'
anglemap = col.LinearSegmentedColormap.from_list(
'anglemap', [black, red, white, blue, black], N=256, gamma=1)
return anglemap
def make_anglemap( N = 256, use_hpl = True ):
h = np.ones(N) # hue
h[:N//2] = 11.6 # red
h[N//2:] = 258.6 # blue
s = 100 # saturation
l = np.linspace(0, 100, N//2) # luminosity
l = np.hstack( (l,l[::-1] ) )
colorlist = np.zeros((N,3))
for ii in range(N):
if use_hpl:
colorlist[ii,:] = hsluv.hpluv_to_rgb( (h[ii], s, l[ii]) )
else:
colorlist[ii,:] = hsluv.hsluv_to_rgb( (h[ii], s, l[ii]) )
colorlist[colorlist > 1] = 1 # correct numeric errors
colorlist[colorlist < 0] = 0
return col.ListedColormap( colorlist )
N = 256
segmented_cmap = make_segmented_cmap()
flat_huslmap = col.ListedColormap(sns.color_palette('husl',N))
hsluv_anglemap = make_anglemap( use_hpl = False )
hpluv_anglemap = make_anglemap( use_hpl = True )
##### generate data grid
x = np.linspace(-2,2,N)
y = np.linspace(-2,2,N)
z = np.zeros((len(y),len(x))) # make cartesian grid
for ii in range(len(y)):
z[ii] = np.arctan2(y[ii],x) # simple angular function
z[ii] = np.angle(scipy.special.gamma(x+1j*y[ii])) # some complex function
##### plot with different colormaps
fig = plt.figure(1)
fig.clf()
colormapnames = ['segmented map', 'hue-HUSL', 'lum-HSLUV', 'lum-HPLUV']
colormaps = [segmented_cmap, flat_huslmap, hsluv_anglemap, hpluv_anglemap]
for ii, cm in enumerate(colormaps):
ax = fig.add_subplot(2, 2, ii+1)
pmesh = ax.pcolormesh(x, y, z/np.pi,
cmap = cm, vmin=-1, vmax=1)
plt.axis([x.min(), x.max(), y.min(), y.max()])
cbar = fig.colorbar(pmesh)
cbar.ax.set_ylabel('Phase [pi]')
ax.set_title( colormapnames[ii] )
plt.show()
</code></pre>