Sie können ganz einfach eine benutzerdefinierte diskrete Farbleiste erstellen, indem Sie ein BoundaryNorm als Normalisierer für Ihre Streuung verwenden. Das skurrile Bit (in meiner Methode) lässt 0 als grau erscheinen.
Für Bilder verwende ich oft cmap.set_bad () und konvertiere meine Daten in ein numpy maskiertes Array. Das wäre viel einfacher, 0 grau zu machen, aber ich konnte dies nicht mit der Streuung oder der benutzerdefinierten cmap zum Laufen bringen.
Alternativ können Sie Ihre eigene cmap von Grund auf neu erstellen oder eine vorhandene vorlesen und nur einige bestimmte Einträge überschreiben.
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)
Ich persönlich denke, dass es mit 20 verschiedenen Farben etwas schwierig ist, den spezifischen Wert zu lesen, aber das liegt natürlich bei Ihnen.