使用字典使用matplotlib绘制条形图


92

有没有办法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

您能具体分享什么无效吗?你有例外吗?什么例外 共享尽可能多的信息。
Inbar Rose

@InbarRose很抱歉,我已用显示的错误更新了问题...有关字符串或缓冲区的内容...我不理解此错误消息。
otmezger

2
目前尚不清楚您要实现什么目标,但ax.bar(D,range(1,len(D)+1,1),0.5)在您的情况下,第一个参数应为数字列表D.values()
adrianp

2
至少就我所知,这是不可能的。
adrianp

1
您可能想要为此向github站点提交功能请求,因为它确实有用。
tacaswell

Answers:


154

您可以通过首先绘制条形图然后设置适当的刻度来分两行进行:

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
您当然可以将这两行
合并

2
如果您使用图形对象和轴对象,ax.set_xticklabels
标记

2
谢谢!但是我在plt.xticks方面存在一些审美问题,能否请您告诉我们如何从水平方向垂直移动它们。
摩尔多瓦2014年

2
字典未排序时,键值对是否对齐?
2015年

2
Python字典无法排序。因此,顺序始终是任意的。但是,键和值始终与上面的代码对齐。
David Zwicker

36

它比这里的大多数答案建议的要简单一些:

import matplotlib.pyplot as plt

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

在此处输入图片说明


34

为了将来参考,以上代码不适用于Python3。对于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()

8

最佳实现方式是使用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()

在此处输入图片说明

此外,无需使用即可生成相同的图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

我经常将字典加载到熊猫DataFrame中,然后使用DataFrame的plot函数。
这是单线:

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

结果图


3

为什么不只是:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.