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

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.


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


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()

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


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


3

Warum nicht einfach:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.