Lors du traçage de barres avec matplotlib, l'objet Mappable n'est pas renvoyé, il n'est donc pas possible d'ajouter une barre de couleur.
>>> import matplotli.pyplot as plt
>>> plt.bar(0, 1)
<Container object of 1 artists>
Mais je veux ajouter une barre de couleur en quelque sorte! Alors je l'ai essayé.
Tout d'abord, créons des données appropriées. Ici, les données sont créées en supposant qu'un diagramme sera créé dans lequel des barres de hauteurs 1 à 3 sont empilées.
>>> import numpy as np
>>> dheight = np.random.choice([1, 2, 3], size=10)
>>> data = np.random.choice([1, 2, 3, 4, 5], size=dheight.size)
>>> print data
[1 1 1 4 5 2 1 2 2 4]
Cette fois, nous colorerons en fonction de la valeur de la variable appelée data créée ici.
Maintenant que nous avons créé les données appropriées, nous pouvons enfin commencer à dessiner.
Tout d'abord, dans la barre de couleurs de matplotlib, les couleurs sont définies dans la palette de couleurs correspondant aux valeurs comprises entre 0 et 1. Par conséquent, si vous voulez peindre selon les valeurs 1 à 5 comme cette fois, vous avez besoin d'une fonction (comme un objet) pour la normalisation. Une classe appelée Normalize peut le créer.
>>> from matplotlib.colors import Normalize
>>> norm = Normalize(vmin=data.min(), vmax=data.max())
>>> print norm(1), norm(2), norm(3)
0.0 0.25 0.5
Comme vous pouvez le voir en entrant réellement une valeur, si vous donnez une valeur à cet objet appelé norm, il est normalisé de sorte que vmin est 0 et vmax est 1.
Ensuite, créez un objet mappable. Cette fois, nous allons créer un mappable en fonction de jet, qui est la carte de couleurs par défaut de matplotlib.
>>> from matplotlib.cm import ScalarMappable, get_cmap
>>> cmap = get_cmap('jet')
>>> mappable = ScalarMappable(cmap=cmap, norm=norm)
>>> mappable._A = []
Une fois que vous êtes prêt, vous pouvez réellement tracer les données.
>>> import matplotlib.pyplot as plt
>>> bottom = 0.
>>> for dh, v in zip(dheight, data):
... plt.bar(0, dh, width=1, bottom=bottom, color=cmap(norm(v)))
... bottom += dh
>>> cbar = plt.colorbar(mappable)
Puisque la donnée tracée cette fois est [1 1 1 4 5 2 1 2 2 4], si la couleur correspondant à cette valeur est dans la barre de couleur, la barre de couleur peut être dessinée sans aucun problème.
Enfin, attachez une étiquette et terminez. Cette fois, l'étiquette est attachée en divisant les données entre la valeur minimale et la valeur maximale en cinq parties.
>>> cbar = plt.colorbar(mappable)
>>> ticks = np.linspace(norm.vmin, norm.vmax, 5)
>>> cbar.set_ticks(ticks)
>>> cbar.ax.set_yticklabels([str(s) for s in ticks])
[<matplotlib.text.Text at 0x7f36ac9b01d0>,
<matplotlib.text.Text at 0x7f36ac9bb850>,
<matplotlib.text.Text at 0x7f36ac98e550>,
<matplotlib.text.Text at 0x7f36ac98ec50>,
<matplotlib.text.Text at 0x7f36ac996390>]
C'est la fin.
>>> plt.show()
En toute sécurité, la couleur correspondant à la valeur de [1 1 1 4 5 2 1 2 2 4] a été dessinée.
Recommended Posts