有没有办法使用直接来自dict的数据使用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 :(得分:125)
首先绘制条形图,然后设置相应的刻度线,您可以分两行进行:
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()
请注意,倒数第二行应该在python3中读取plt.xticks(range(len(D)), list(D.keys()))
,因为D.keys()
返回一个生成器,matplotlib不能直接使用。
答案 1 :(得分:29)
为了将来参考,上面的代码不适用于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()
答案 2 :(得分:7)
这比大多数答案所建议的要简单一些:
import matplotlib.pyplot as plt
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
plt.bar(*zip(*D.items()))
plt.show()
答案 3 :(得分:6)
使用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()
此外,可以在不使用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()
答案 4 :(得分:5)
答案 5 :(得分:3)
我经常将dict加载到pandas DataFrame中,然后使用DataFrame的plot函数。
这是单行:
pandas.DataFrame(D, index=['quantity']).plot(kind='bar')
答案 6 :(得分:0)
为什么不只是:
k=1