我正在使用 matplotlib 1.3.0,我有以下内容:
import matplotlib.pyplot as plt
cmap = plt.cm.jet
plt.contourf([[.12, .2], [.8, 2]], levels=[0, .1, .3, .5, 1, 3], cmap=cmap, vmin=0, vmax=3)
plt.colorbar()
产生:
我不明白的是所有其他颜色都去哪儿了?据我了解,通过指定vmin=0
,颜色条应使用此图像中vmax=3
的全部范围:cmap
它是在没有给出vmin
,vmax
和levels
参数的情况下产生的。那么......我在这里错过了什么?
编辑 1
作为对 tom10 和 tcaswell 的回应。我原以为会像你说的那样,但是……不幸的是,事实并非如此。看看这个:
plt.contourf([[.12, .2], [.8, 3.2]], levels=[0, .1, .3, .5, 1, 3], cmap=cmap, vmin=0, vmax=3)
plt.colorbar()
和:
也许要澄清一下:假设我有数据,它的重要特征在 0.1 左右,但有一些在 3 左右。所以我给它一个levels=[0, 0.005, 0.075, 0.1, 0.125, 0.15, 0.2, 1, 2.5, 2.75, 3, 3.25]
and vmin=0, vmax=3.25
。现在我希望看到全范围的颜色,但所有重要的数据点 0.005 到 0.125 最终都在蓝色区域(通过使用标准plt.cm.jet
颜色图)。我想说的是……如果我给出levels=[0, 1, 2, 3], vmin=0, vmax=3
一些从 0 到 3 的数据,我希望看到给定颜色图中的所有颜色,但如果我给出levels=[0, 0.9, 0.1, 0.11, 1, 3], vmi=0, vmax=3
相同的结果,我希望看到所有给定颜色图中的颜色,除了映射到正确的间隔,相反,我看到一堆蓝色为 0-0.11 区域着色,一些绿色/黄色为该区域的其他部分着色。希望这使它...有点清楚。
编辑 2
即使我不给任何norm
或,也会发生同样的情况vmin, vmax
。
编辑 3
参考 tcaswell 的评论,行为方式......至少对我来说是违反直觉的。我希望颜色在某种程度上独立于数据点。我希望始终使用颜色图中的全部颜色(除非vmin, vmax
大于/小于levels
最小值、最大值)。换句话说,看看我不久前做过的这段代码(Python 3):
import matplotlib.colors as mc
def addNorm(cmapData):
cmapData['norm'] = mc.BoundaryNorm(cmapData['bounds'], cmapData['cmap'].N)
return True
def discretize(cmap, bounds):
resCmap = {}
resCmap['cmap'] = mc.ListedColormap( \
[cmap(i/len(bounds[1:])) for i in range(len(bounds[1:]))]
)
resCmap['bounds'] = bounds
addNorm(resCmap)
return resCmap
然后将其用作:
levels = [0, .1, .3, .5, 1, 3]
cmapData = discretize(plt.cm.jet, bounds=levels)
plt.contourf([[.12, .2], [.8, 3.2]], levels=levels, cmap=cmapData['cmap'], norm=cmapData['norm'])
plt.colorbar()
它给出了您可以实际区分特征(0.1-0.5)的图,即通过使用上述方法,它们不再位于蓝色区域plt.cm.jet
:
我的意思是,我知道我解决了这个问题,而且不久前也解决了......但我想我的问题是......为什么 matplotlib 中的默认值不是这个?我本来希望它是这种方式......或者它可能只是一个配置/参数/默认情况下启用它的东西,我错过了?