Beim Balkenplotten mit matplotlib wird das Mappable-Objekt nicht zurückgegeben, sodass kein Farbbalken hinzugefügt werden kann.
>>> import matplotli.pyplot as plt
>>> plt.bar(0, 1)
<Container object of 1 artists>
Aber ich möchte irgendwie einen Farbbalken hinzufügen! Also habe ich es versucht.
Lassen Sie uns zunächst die entsprechenden Daten erstellen. Hier werden Daten unter der Annahme erstellt, dass ein Diagramm erstellt wird, in dem Balken mit den Höhen 1 bis 3 gestapelt werden.
>>> 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]
Dieses Mal färben wir entsprechend dem Wert der Variablen, die hier als Daten bezeichnet wird.
Nachdem wir die entsprechenden Daten erstellt haben, können wir endlich mit dem Zeichnen beginnen.
Zunächst werden in der Farbleiste von matplotlib Farben in der Farbkarte definiert, die den Werten zwischen 0 und 1 entsprechen. Wenn Sie also wie diesmal nach den Werten 1 bis 5 malen möchten, benötigen Sie eine Funktion (wie ein Objekt) zur Standardisierung. Eine Klasse namens Normalize kann es erstellen.
>>> 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
Wie Sie durch die tatsächliche Eingabe eines Werts sehen können, wird dieses Objekt, wenn Sie diesem Objekt den Namen Norm geben, standardisiert, sodass vmin 0 und vmax 1 ist.
Erstellen Sie als Nächstes ein zuordnbares Objekt. Dieses Mal erstellen wir eine Zuordnung nach Jet, die die Standardfarbkarte von matplotlib ist.
>>> from matplotlib.cm import ScalarMappable, get_cmap
>>> cmap = get_cmap('jet')
>>> mappable = ScalarMappable(cmap=cmap, norm=norm)
>>> mappable._A = []
Sobald Sie fertig sind, können Sie die Daten tatsächlich zeichnen.
>>> 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)
Da die diesmal aufgezeichneten Daten [1 1 1 4 5 2 1 2 2 4] sind, kann der Farbbalken problemlos gezeichnet werden, wenn sich die diesem Wert entsprechende Farbe in der Farbleiste befindet.
Zum Schluss ein Etikett anbringen und ausfüllen. Dieses Mal wird das Etikett angebracht, indem die Daten zwischen dem Minimalwert und dem Maximalwert in fünf Teile geteilt werden.
>>> 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>]
Das ist das Ende.
>>> plt.show()
Sicher wurde die Farbe gezeichnet, die dem Wert von [1 1 1 4 5 2 1 2 2 4] entspricht.
Recommended Posts