2013-04-15 4 views
42

Есть ли способ построить график штриховки с использованием matplotlib, используя данные непосредственно из dict?python: построить панель с использованием 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 
+0

Можете ли вы поделиться, что конкретно не работает? Вы получаете исключение? Какое исключение? Поделитесь как можно больше информации. –

+0

@InbarRose извините, я обновил вопрос с ошибкой, которую он показывает ... что-то касающееся строки или буфера ... Я не понимаю это сообщение об ошибке. – otmezger

+2

Непонятно, чего вы хотите достичь, но в 'ax.bar (D, range (1, len (D) +1,1), 0.5)' Первый аргумент должен быть списком чисел, в вашем случае ' D.values ​​() '. – adrianp

ответ

81

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

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 не может использовать напрямую.

+2

вы можете, конечно, обернуть эти две строки в функции, а затем он станет однострочным;) – tacaswell

+2

Если вы используете объекты с цифрами и осями, это 'ax.set_xticklabels ' – Mark

+1

спасибо! Но у меня есть некоторые эстетические проблемы с plt.xticks, не могли бы вы рассказать нам, как перемещать их по вертикали из горизонтали. – moldovean

21

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

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

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

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

0

я часто загрузить Dict в панд DataFrame затем использовать функцию участок в DataFrame.
Вот один вкладыш:

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

resulting plot

Смежные вопросы