Sözlük kullanarak matplotlib kullanarak bir çubuk çizin


95

matplotlibDoğrudan bir dikteden alınan verileri kullanarak bir çubuk grafiği çizmenin herhangi bir yolu var mı ?

Benim sözüm şuna benziyor:

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

bekliyordum

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)

çalışmak, ama değil.

İşte hata:

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

Özellikle neyin işe yaramadığını paylaşabilir misiniz? Bir istisna mı yaşıyorsun? Hangi istisna? Mümkün olduğunca çok bilgi paylaşın.
Inbar Rose

@InbarRose üzgünüm, soruyu gösterdiği hatayla güncelledim ... dize veya tamponla ilgili bir şey ... Bu hata mesajını anlamıyorum.
otmezger

2
Neye ulaşmak istediğiniz belli değil, ancak ax.bar(D,range(1,len(D)+1,1),0.5)ilk argümanda sizin durumunuzda sayıların bir listesi olmalıdır D.values().
adrianp

2
En azından benim bildiğim kadarıyla bunun için tek hat mümkün değil.
adrianp

1
Bunun için github sitesine bir özellik isteği göndermek isteyebilirsiniz, çünkü bu yararlı görünmektedir.
tacaswell

Yanıtlar:


161

Önce çubuk grafiği çizip ardından uygun işaretleri ayarlayarak bunu iki satırda yapabilirsiniz:

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

Sondan bir önceki satırın plt.xticks(range(len(D)), list(D.keys()))python3'te okunması gerektiğine dikkat edin, çünkü D.keys()matplotlib'in doğrudan kullanamayacağı bir jeneratör döndürür.


2
); kurs bir fonksiyonu bu iki satırı tamamlamayı ve daha sonra bunun tek astar olur
tacaswell

2
Şekil ve eksen nesnelerini kullanıyorsanız, buax.set_xticklabels
Mark

2
Teşekkürler! Ama plt.xticks ile ilgili bazı estetik sorunlarım var, lütfen bunları yataydan dikey olarak nasıl hareket ettireceğimizi söyler misiniz?
moldovean

2
dikte sıralanmadığında anahtar / değer çiftleri hizalı mı?
ssm

2
Python dicts sıralanamaz. Sonuç olarak, sıra her zaman keyfidir. Ancak, anahtarlar ve değerler her zaman yukarıdaki kodla hizalanır.
David Zwicker

41

Buradaki çoğu yanıtın önerdiğinden biraz daha basit:

import matplotlib.pyplot as plt

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

görüntü açıklamasını buraya girin


35

İleride D.keys()başvurmak için , yukarıdaki kod Python 3 ile çalışmaz. Python 3 için, bir listeye dönüştürülmesi gerekir.

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

matplotlib.pyplot.bar(range, height, tick_label)Aralığın, grafikte karşılık gelen çubuğun konumlandırılması için skaler değerler sağladığı yerlerde bunu kullanmanın en iyi yolu . tick_labelile aynı işi yapıyor xticks(). Bir tamsayı ile de değiştirebilir ve çoklu kullanabilir plt.bar(integer, height, tick_label). Ayrıntılı bilgi için lütfen belgelere bakın .

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

görüntü açıklamasını buraya girin

Ek olarak aynı grafik kullanılmadan da oluşturulabilir range(). Ancak karşılaşılan sorun tick_label, son plt.bar()aramada işe yaramış olmasıydı . Bu nedenle xticks()etiketleme için kullanıldı:

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

görüntü açıklamasını buraya girin


4

Genellikle dikteyi bir pandalar DataFrame'e yüklerim ve ardından DataFrame'in plot işlevini kullanırım.
İşte tek satırlık:

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

ortaya çıkan olay örgüsü


4

Neden sadece:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.