Вы можете легко создать собственный дискретный цветной балл, используя BoundaryNorm в качестве нормализатора для вашего разброса. Причудливый бит (в моем методе) делает вывод 0 серым.
Для изображений я часто использую cmap.set_bad() и преобразую свои данные в массив с маской размером. Это было бы намного проще сделать 0 серым, но я не мог заставить это работать с разбросом или пользовательским cmap.
В качестве альтернативы вы можете сделать свой собственный cmap с нуля или прочитать существующий и переопределить только некоторые конкретные записи.
# setup the plot
fig, ax = plt.subplots(1,1, figsize=(6,6))
# define the data
x = np.random.rand(20)
y = np.random.rand(20)
tag = np.random.randint(0,20,20)
tag[10:12] = 0 # make sure there are some 0 values to showup as grey
# define the colormap
cmap = plt.cm.jet
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# force the first color entry to be grey
cmaplist[0] = (.5,.5,.5,1.0)
# create the new map
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)
# define the bins and normalize
bounds = np.linspace(0,20,21)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
# make the scatter
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,20),cmap=cmap, norm=norm)
# create a second axes for the colorbar
ax2 = fig.add_axes([0.95, 0.1, 0.03, 0.8])
cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i')
ax.set_title('Well defined discrete colors')
ax2.set_ylabel('Very custom cbar [-]', size=12)
Я лично считаю, что с 20 различных цветов его немного трудно читать определенное значение, но то до вас, конечно.
делает [это] (http://matplotlib.org/examples/api/colorbar_only.html) или [это] (http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations) помощь? –
спасибо за ссылки, но второй пример - это то, что я имею в виду о чрезвычайно сложных задачах для выполнения (казалось бы) тривиальной задачи. 1-я ссылка полезна – bph