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:
- 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.
- Si je l'initialisation de la barre de couleur avec
drawedges=True
afin que je puisse le style de sesdividers
propriétés, j'obtiens ceci:
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:
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
Vous devez vous connecter pour publier un commentaire.
Vous souffrez de l'une-par-une erreur. Vous avez 10 ticklabels répartis entre 11 couleurs. Vous pourriez être en mesure de corriger l'erreur en utilisant
np.linspace
au lieu denp.arange
. À l'aide denp.linspace
le troisième argument est le nombre de valeurs souhaitée. Cela réduit la quantité de gymnastique mentale nécessaire pour éviter le hors-par-une erreur:Vous pouvez contrôler l'emplacement et les étiquettes à la main. Je vais commencer avec un linéaire de la cmap généré à partir de
cmap_discretize
sur la page liée: