Bạn có thể tạo một thanh màu rời rạc tùy chỉnh khá dễ dàng bằng cách sử dụng BoundaryNorm làm bộ chuẩn hóa cho phân tán của bạn. Bit kỳ quặc (trong phương pháp của tôi) đang làm cho 0 hiển thị thành màu xám.
Đối với hình ảnh, tôi thường sử dụng cmap.set_bad () và chuyển đổi dữ liệu của tôi thành một mảng ẩn có mặt nạ. Điều đó sẽ dễ dàng hơn nhiều để tạo ra 0 màu xám, nhưng tôi không thể làm cho điều này hoạt động với phân tán hoặc cmap tùy chỉnh.
Thay vào đó, bạn có thể tạo cmap của riêng mình từ đầu hoặc đọc ra một bản đồ hiện có và chỉ ghi đè một số mục cụ thể.
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)
Cá nhân tôi nghĩ rằng với 20 màu sắc khác nhau, hơi khó để đọc giá trị cụ thể, nhưng điều đó tất nhiên là tùy thuộc vào bạn.