<p>你的<a href="http://protracted-matter.blogspot.co.nz/2012/08/nonlinear-colormap-in-matplotlib.html" rel="nofollow noreferrer">link</a>为colormap提供了很好的解决方案。我编辑了一点,但里面包含了所有必要的东西。你需要为你的非线性颜色映射选择一些合理的级别。我使用了两个以平均值为中心的范围,介于样本的标准偏差之间。通过将其更改为另一个数字,可以获得两个平均值周围颜色的不同局部渐变。</p>
<p>对于颜色条,你</p>
<ul>
<li>或者用线性间隔的标签使颜色保持非线性间隔</li>
<li>有带非线性间隔标签的线性间隔颜色。</li>
</ul>
<p>第二种方法可以在查看数据时获得更高的分辨率,看起来更好,实现方式如下:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
x = y = np.linspace(1, 10, 10)
t1mean, t2mean = 2, 9
sigma1, sigma2 = .3, .01
t1 = np.random.normal(t1mean, sigma1, 10)
t2 = np.random.normal(t2mean, sigma2, 10)
class nlcmap(object):
def __init__(self, cmap, levels):
self.cmap = cmap
self.N = cmap.N
self.monochrome = self.cmap.monochrome
self.levels = np.asarray(levels, dtype='float64')
self._x = self.levels
self.levmax = self.levels.max()
self.transformed_levels = np.linspace(0.0, self.levmax,
len(self.levels))
def __call__(self, xi, alpha=1.0, **kw):
yi = np.interp(xi, self._x, self.transformed_levels)
return self.cmap(yi / self.levmax, alpha)
tmax = max(t1.max(), t2.max())
#the choice of the levels depends on the data:
levels = np.concatenate((
[0, tmax],
np.linspace(t1mean - 4 * sigma1, t1mean + 4 * sigma1, 5),
np.linspace(t2mean - 4 * sigma2, t2mean + 4 * sigma2, 5),
))
levels = levels[levels <= tmax]
levels.sort()
cmap_nonlin = nlcmap(plt.cm.jet, levels)
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, edgecolors=cmap_nonlin(t1), s=15, linewidths=4)
ax2.scatter(x, y, edgecolors=cmap_nonlin(t2), s=15, linewidths=4)
fig.subplots_adjust(left=.25)
cbar_ax = fig.add_axes([0.10, 0.15, 0.05, 0.7])
#for the colorbar we map the original colormap, not the nonlinear one:
sm = plt.cm.ScalarMappable(cmap=plt.cm.jet,
norm=plt.Normalize(vmin=0, vmax=tmax))
sm._A = []
cbar = fig.colorbar(sm, cax=cbar_ax)
#here we are relabel the linear colorbar ticks to match the nonlinear ticks
cbar.set_ticks(cmap_nonlin.transformed_levels)
cbar.set_ticklabels(["%.2f" % lev for lev in levels])
plt.show()
</code></pre>
<p>在结果中,请注意,颜色栏的刻度不是等距的:</p>
<p><img src="https://i.stack.imgur.com/HDgNz.png" alt="enter image description here"/></p>