我有一系列从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)
请注意,colorbar中的 mappable kwarg消失了。由于我将其映射到 norm 中整个范围内没有值的图像,因此它重新调整了我的颜色条以适合图像。以上现在有效。我也改变了颜色方案,所以不要被不同的颜色弄糊涂:)。
答案 0 :(得分:1)
(更新: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
。