Correction des tiques du matplotlib colorbar

J'ai placé une barre de couleur à côté d'un choropleth carte. Parce que les données reportées sont discrètes plutôt que des valeurs continues, j'ai utilisé un LinearSegmentedColormap (à l'aide de la recette de la scipy livre de recettes), que j'ai initialisé avec mon max compté valeur + 1, afin de montrer une couleur pour 0. Cependant, j'ai maintenant deux problèmes:

Correction des tiques du matplotlib colorbar

  1. Les étiquettes de graduation sont correctement espacées (sauf pour les 5, plus ou moins) – ils doivent être situés dans le milieu de la couleur qu'ils auront à identifier; c'est à dire 0 - 4 devrait être déplacé vers le haut, et 6 - 10 doit être déplacé vers le bas.
  2. Si je l'initialisation de la barre de couleur avec drawedges=Trueafin que je puisse le style de ses dividers propriétés, j'obtiens ceci:

Correction des tiques du matplotlib colorbar

Je crée ma palette de couleurs et de barre de couleur comme suit:

cbmin, cbmax = min(counts), max(counts)
# this normalises the counts to a 0,1 interval
counts /= np.max(np.abs(counts), axis=0)
# density is a discrete number, so we have to use a discrete color ramp/bar
cm = cmap_discretize(plt.get_cmap('YlGnBu'), int(cbmax) + 1)
mappable = plt.cm.ScalarMappable(cmap=cm)
mappable.set_array(counts)
# set min and max values for the colour bar ticks
mappable.set_clim(cbmin, cbmax)
pc = PatchCollection(patches, match_original=True)
# impose our colour map onto the patch collection
pc.set_facecolor(cm(counts))
ax.add_collection(pc,)
cb = plt.colorbar(mappable, drawedges=True)

Alors je me demandais si ma conversion le compte d'un intervalle de 0,1 est l'un des problèmes.

Mise à jour :

Avoir essayé, ce qui Accro suggéré, le 0-valeur est correcte, mais les valeurs suivantes sont progressivement, de plus, au point où 9 est où 10:

Correction des tiques du matplotlib colorbar

Voici le code que j'ai utilisé:

cb = plt.colorbar(mappable)
labels = np.arange(0, int(cbmax) + 1, 1)
loc = labels + .5
cb.set_ticks(loc)
cb.set_ticklabels(labels)

Et juste pour confirmer, labels a certainement les valeurs correctes:

In [3]: np.arange(0, int(cbmax) + 1, 1)
Out[3]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

source d'informationauteur urschrei