使用 matplotlib 和字典绘制条形图
- 2025-04-16 08:57:00
- admin 原创
- 13
问题描述:
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
解决方案 1:
您可以通过两行来完成:首先绘制条形图,然后设置适当的刻度:
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:
这比这里的大多数答案建议的要简单一些:
import matplotlib.pyplot as plt
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
plt.bar(*zip(*D.items()))
plt.show()
解决方案 3:
供将来参考,上述代码不适用于 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()
解决方案 4:
为什么不只是:
names, counts = zip(*D.items())
plt.bar(names, counts)
解决方案 5:
实现它的最佳方法是使用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()
解决方案 6:
我经常将字典加载到 pandas DataFrame 中,然后使用 DataFrame 的 plot 函数。
代码如下:
pandas.DataFrame(D, index=['quantity']).plot(kind='bar')
解决方案 7:
为什么不只是:
import seaborn as sns
sns.barplot(list(D.keys()), list(D.values()))
解决方案 8:
在 python 中从字典创建条形图的最简单方法是使用 python 的内置函数来检索字典数据,因此如果我们有这样的字典:
values = {"foo":1,"bar":2,"hey":3}
我们可以创建这样的条形图:
fig,ax = plt.subplots()
ax.bar(values.keys(),values.values())
完整代码及图
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD