BoundaryNorm을 스 캐터에 대한 노멀 라이저로 사용하여 사용자 정의 이산 컬러 바를 매우 쉽게 만들 수 있습니다. 기발한 비트 (내 방법에서)는 0 표시를 회색으로 만들고 있습니다.
이미지의 경우 종종 cmap.set_bad ()를 사용하고 내 데이터를 numpy 마스크 배열로 변환합니다. 0을 회색으로 만드는 것이 훨씬 쉬울 것이지만 스 캐터 또는 사용자 정의 cmap과 함께 작동하도록 할 수는 없습니다.
대안으로 자신의 cmap을 처음부터 만들거나 기존 cmap을 읽고 일부 특정 항목 만 재정의 할 수 있습니다.
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(6, 6)) # setup the plot
x = np.random.rand(20) # define the data
y = np.random.rand(20) # define the data
tag = np.random.randint(0, 20, 20)
tag[10:12] = 0 # make sure there are some 0 values to show up as grey
cmap = plt.cm.jet # define the colormap
# 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 = mpl.colors.LinearSegmentedColormap.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 = plt.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 가지 색상으로 특정 값을 읽기가 조금 어렵다고 생각하지만 물론 그것은 당신에게 달려 있습니다.