Dağılımınız için normalleştirici olarak bir BoundaryNorm kullanarak oldukça kolay bir şekilde özel bir ayrı renk çubuğu oluşturabilirsiniz. Tuhaf bit (benim yöntemimde) 0'ın gri olarak görünmesini sağlıyor.
Görüntüler için genellikle cmap.set_bad () kullanıyorum ve verilerimi uyuşmuş bir maskelenmiş diziye dönüştürüyorum. Bunu 0 gri yapmak çok daha kolay olurdu, ancak bunu scatter veya özel cmap ile çalıştırmayı başaramadım.
Alternatif olarak sıfırdan kendi cmap'inizi oluşturabilir veya mevcut olanı okuyabilir ve sadece bazı belirli girdileri geçersiz kılabilirsiniz.
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
fig, ax = plt.subplots(1, 1, figsize=(6, 6))
x = np.random.rand(20)
y = np.random.rand(20)
tag = np.random.randint(0, 20, 20)
tag[10:12] = 0
cmap = plt.cm.jet
cmaplist = [cmap(i) for i in range(cmap.N)]
cmaplist[0] = (.5, .5, .5, 1.0)
cmap = mpl.colors.LinearSegmentedColormap.from_list(
'Custom cmap', cmaplist, cmap.N)
bounds = np.linspace(0, 20, 21)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
scat = ax.scatter(x, y, c=tag, s=np.random.randint(100, 500, 20),
cmap=cmap, norm=norm)
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)
Şahsen, 20 farklı renkle belirli bir değeri okumanın biraz zor olduğunu düşünüyorum, ama bu elbette size kalmış.