python: построить панель с помощью matplotlib с помощью словаря



есть ли способ построить гистограмму с помощью matplotlib использование данных непосредственно из диктанта?



мой словарь выглядит так:



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


Я ожидал



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)


работать, но это не так.



здесь ошибка:



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

4 ответов:

вы можете сделать это в две строки, сначала построив гистограмму, а затем установив соответствующие тики:

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

обратите внимание, что предпоследняя строка должна читать plt.xticks(range(len(D)), list (D. keys ())) в python3, потому что D. keys () возвращает генератор, который matplotlib не может использовать напрямую.

для дальнейшего использования, приведенный выше код не работает с Python 3. Для Python 3, ключи D. () должны быть преобразованы в список.

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

лучший способ реализовать это с помощью matplotlib.pyplot.bar(range, height, tick_label) где диапазон предоставляет скалярные значения для позиционирования соответствующего бара на графике. tick_label делает то же самое, что и xticks(). Можно также заменить его целым числом и использовать несколько plt.bar(integer, height, tick_label). Для получения подробной информации, пожалуйста, обратитесь к документация.

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

enter image description here

кроме того, один и тот же сюжет может быть создан без использования range(). Но вот проблема слышал о том, что tick_label просто работал для последнего plt.bar() звонок. Отсюда xticks() используется для маркировки:

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

enter image description here

Я часто загружаю dict в фрейм данных pandas, а затем использую функцию plot фрейма данных.
Вот один-лайнер:

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

resulting plot

Comments

    Ничего не найдено.