คุณสามารถสร้างแถบสีแยกที่กำหนดเองได้อย่างง่ายดายโดยใช้ BoundaryNorm เป็น normalizer สำหรับการกระจายของคุณ บิตที่เล่นโวหาร (ในวิธีการของฉัน) ทำให้การแสดง 0 เป็นสีเทา
สำหรับรูปภาพฉันมักจะใช้ cmap.set_bad () และแปลงข้อมูลของฉันเป็นอาร์เรย์ที่มาสก์จำนวนมาก นั่นจะง่ายกว่ามากในการสร้าง 0 สีเทา แต่ฉันไม่สามารถทำให้สิ่งนี้ทำงานกับการกระจายหรือ cmap ที่กำหนดเองได้
อีกทางเลือกหนึ่งคือคุณสามารถสร้าง cmap ของคุณเองตั้งแต่เริ่มต้นหรืออ่านข้อมูลที่มีอยู่แล้วลบล้างเฉพาะบางรายการ
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)

โดยส่วนตัวแล้วฉันคิดว่าด้วยสีที่แตกต่างกัน 20 สีมันยากที่จะอ่านค่าเฉพาะเล็กน้อย แต่ก็ขึ้นอยู่กับคุณแน่นอน