Zeichnen Sie einen Balken mit matplotlib mithilfe eines Wörterbuchs

91

Gibt es eine Möglichkeit, ein Balkendiagramm mithilfe matplotlibvon Daten direkt aus einem Diktat zu zeichnen ?

Mein Diktat sieht so aus:

D = {u'Label1':26, u'Label2': 17, u'Label3':30}

ich habe erwartet

fig = plt.figure(figsize=(5.5,3),dpi=300)
ax = fig.add_subplot(111)
bar = ax.bar(D,range(1,len(D)+1,1),0.5)

zu arbeiten, aber es tut nicht.

Hier ist der Fehler:

>>> ax.bar(D,range(1,len(D)+1,1),0.5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 4904, in bar
    self.add_patch(r)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 1570, in add_patch
    self._update_patch_limits(p)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/axes.py", line 1588, in _update_patch_limits
    xys = patch.get_patch_transform().transform(vertices)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/patches.py", line 580, in get_patch_transform
    self._update_patch_transform()
  File "/usr/local/lib/python2.7/site-packages/matplotlib/patches.py", line 576, in _update_patch_transform
    bbox = transforms.Bbox.from_bounds(x, y, width, height)
  File "/usr/local/lib/python2.7/site-packages/matplotlib/transforms.py", line 786, in from_bounds
    return Bbox.from_extents(x0, y0, x0 + width, y0 + height)
TypeError: coercing to Unicode: need string or buffer, float found
otmezger
quelle
Können Sie speziell mitteilen, was nicht funktioniert? Bekommst du eine Ausnahme? Welche Ausnahme? Teilen Sie so viele Informationen wie möglich.
Inbar Rose
@InbarRose Entschuldigung, ich habe die Frage mit dem angezeigten Fehler aktualisiert ... etwas bezüglich Zeichenfolge oder Puffer ... Ich verstehe diese Fehlermeldung nicht.
Otmezger
2
Es ist nicht klar, was Sie erreichen möchten, aber im ax.bar(D,range(1,len(D)+1,1),0.5)ersten Argument sollte in Ihrem Fall eine Liste von Zahlen stehen D.values().
Adrianp
2
Ein Einzeiler ist hierfür meines Wissens nicht möglich.
Adrianp
1
Möglicherweise möchten Sie hierfür eine Funktionsanforderung an die Github-Site senden, da dies nützlich erscheint.
Tacaswell

Antworten:

153

Sie können dies in zwei Zeilen tun, indem Sie zuerst das Balkendiagramm zeichnen und dann die entsprechenden Häkchen setzen:

import matplotlib.pyplot as plt

D = {u'Label1':26, u'Label2': 17, u'Label3':30}

plt.bar(range(len(D)), list(D.values()), align='center')
plt.xticks(range(len(D)), list(D.keys()))
# # for python 2.x:
# plt.bar(range(len(D)), D.values(), align='center')  # python 2.x
# plt.xticks(range(len(D)), D.keys())  # in python 2.x

plt.show()

Beachten Sie, dass die vorletzte Zeile plt.xticks(range(len(D)), list(D.keys()))in Python3 gelesen werden sollte, da D.keys()ein Generator zurückgegeben wird, den matplotlib nicht direkt verwenden kann.

David Zwicker
quelle
2
Sie können diese beiden Zeilen natürlich in eine Funktion einwickeln und dann wird es ein
Einzeiler
2
Wenn Sie Figuren- und Achsenobjekte verwenden, ist esax.set_xticklabels
Mark
2
Vielen Dank! Aber ich habe einige ästhetische Probleme mit plt.xticks. Können Sie uns bitte sagen, wie wir sie vertikal von horizontal verschieben können?
Moldau
2
Sind die Schlüssel-Wert-Paare ausgerichtet, wenn das Diktat nicht sortiert ist?
SSM
2
Python-Dikte können nicht sortiert werden. Folglich ist die Reihenfolge immer beliebig. Die Schlüssel und Werte sind jedoch immer auf den obigen Code ausgerichtet.
David Zwicker
34

Es ist etwas einfacher als die meisten Antworten hier vermuten lassen:

import matplotlib.pyplot as plt

D = {u'Label1':26, u'Label2': 17, u'Label3':30}
plt.bar(*zip(*D.items()))
plt.show()

Geben Sie hier die Bildbeschreibung ein

Wichtigkeit von BeEnest
quelle
33

Zum späteren Nachschlagen funktioniert der obige Code nicht mit Python 3. Für Python 3 muss der Code D.keys()in eine Liste konvertiert werden.

import matplotlib.pyplot as plt

D = {u'Label1':26, u'Label2': 17, u'Label3':30}

plt.bar(range(len(D)), D.values(), align='center')
plt.xticks(range(len(D)), list(D.keys()))

plt.show()
Michael T.
quelle
8

Der beste Weg, dies zu implementieren, indem matplotlib.pyplot.bar(range, height, tick_label)der Bereich Skalarwerte für die Positionierung des entsprechenden Balkens im Diagramm bereitstellt. tick_labelmacht die gleiche Arbeit wie xticks(). Man kann es auch durch eine ganze Zahl ersetzen und mehrere verwenden plt.bar(integer, height, tick_label). Detaillierte Informationen finden Sie in der Dokumentation .

import matplotlib.pyplot as plt

data = {'apple': 67, 'mango': 60, 'lichi': 58}
names = list(data.keys())
values = list(data.values())

#tick_label does the some work as plt.xticks()
plt.bar(range(len(data)),values,tick_label=names)
plt.savefig('bar.png')
plt.show()

Geben Sie hier die Bildbeschreibung ein

Zusätzlich kann derselbe Plot ohne Verwendung erzeugt werden range(). Das Problem war jedoch, dass es tick_labelnur beim letzten plt.bar()Anruf funktioniert hat . Daher xticks()wurde zur Kennzeichnung verwendet:

data = {'apple': 67, 'mango': 60, 'lichi': 58}
names = list(data.keys())
values = list(data.values())
plt.bar(0,values[0],tick_label=names[0])
plt.bar(1,values[1],tick_label=names[1])
plt.bar(2,values[2],tick_label=names[2])
plt.xticks(range(0,3),names)
plt.savefig('fruit.png')
plt.show()

Geben Sie hier die Bildbeschreibung ein

Swaraj Kumar
quelle
4

Ich lade das Diktat oft in einen Pandas-DataFrame und verwende dann die Plotfunktion des DataFrame.
Hier ist der Einzeiler:

pandas.DataFrame(D, index=['quantity']).plot(kind='bar')

resultierende Handlung

Anilbey
quelle
3

Warum nicht einfach:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
rwilsker
quelle