Python 离散颜色映射无法正常工作?

Python 离散颜色映射无法正常工作?,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我有一个从0到450的值范围,我想制作一个离散的颜色映射,其中一个值范围将始终由特定的颜色表示 我这样定义我的颜色: red = np.array([0, 0, 221, 239, 235, 248, 239, 234, 228, 222, 205, 196, 161, 147, 126, 99, 87, 70, 61]) / 256. green = np.array([16, 217, 242, 240, 255, 225, 190, 160, 128, 87, 72, 59, 33, 21

我有一个从0到450的值范围,我想制作一个离散的颜色映射,其中一个值范围将始终由特定的颜色表示

我这样定义我的颜色:

red = np.array([0, 0, 221, 239, 235, 248, 239, 234, 228, 222, 205, 196, 161, 147, 126, 99, 87, 70, 61]) / 256.
green = np.array([16, 217, 242, 240, 255, 225, 190, 160, 128, 87, 72, 59, 33, 21, 29, 30, 30, 29, 26]) / 256.
blue = np.array([255, 255, 243, 82, 11, 1, 63, 37, 39, 21, 27, 23, 22, 26, 29, 28, 27, 25, 22]) / 256.
colors = np.array([red, green, blue]).T

cmap = mpl.colors.ListedColormap(colors)
bounds = np.arange(0,450,23) # as I understand need to be num colors + 1
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

plot = iplt.contourf(to_plot, red.size, cmap=cmap)\
# as many contours as there are colours
从上面看,如果我的理解是正确的,则需要为值0到23映射第一种颜色(深蓝色)。然而,我看到的是:

0-23的范围没有出现在这个图上,所以深蓝色也不应该出现,是吗?我做错了什么

编辑:以下是添加标准功率时发生的情况:

垃圾箱搞砸了

最终编辑:现在可以工作了,下面是我所做的:

#No changes here:
new_cols = np.load(os.path.expanduser('~/Desktop/dl/colormap.npy'))
new_cmap = mpl.colors.ListedColormap(new_cols)
new_bounds = np.linspace(0,420,21)
new_norm = mpl.colors.BoundaryNorm(new_bounds,new_cmap.N)
plot = iplt.contourf(to_plot, 20, cmap=new_cmap, norm=new_norm)

#This is different:
cax, kw = mpl.colorbar.make_axes(ax, orientation='horizontal')
cbar = mpl.colorbar.ColorbarBase(cax, cmap=new_cmap, norm=new_norm,
spacing='proportional', ticks=new_bounds, boundaries=new_bounds, format='%1i', **kw)
请注意,颜色栏中的可映射的kwarg已消失。由于我将其映射到一个在norm范围内没有值的图像,因此它重新缩放了我的颜色栏以适合该图像。上述方法现在可以使用了。我也对配色方案做了一些更改,所以不要被不同的颜色弄糊涂:)

(更新:
clim

让我们举一个简单的例子:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

# create very simple image data
img = np.linspace(-1.9,1.9,100).reshape(1,-1)

# create a very simple color palette
colors = [[1,.5,.5], [1,0,0], [0,1,0], [0,0,1], [0,0,0], [0, .5, .5]]
cm = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm([-3,-2,-1,0,1,2,2], cm.N)

# draw the image
f = plt.figure()
ax = f.add_subplot(111)
im = ax.imshow(img, extent=[-1.9,1.9,0,1], cmap=cm, norm=norm)
im.set_clim(-3, 3)

# draw the color bar
plt.colorbar(im)
这使得:


因此,如果您按照
GWW
在他们的评论中的建议去做(添加
norm=norm
kw参数),那么您的代码似乎没有什么错误。如果要显示整个颜色栏,需要为图像设置
clim

是否尝试添加
plot=iplt.contourf(to_plot,red.size,cmap=cmap,norm=norm)
或可能指定
vmin
vmax
值?您好,我确实试过了,它确实在某种程度上起了作用,但是我的颜色箱被弄乱了。。。我将在我的第一篇博文中再次添加一个例子,我设法使它工作!我的问题是,我将颜色栏设置为可映射到图像,图像本身不包含clim指定的完整范围。我已经在一个单独的轴上绘制了颜色条,没有设置可映射的参数,现在它可以工作了。我已经更新了我原来的帖子,以便将来有兴趣的人参考。