[英]Plot a bar using matplotlib using a dictionary
Is there any way to plot a bar plot using matplotlib
using data directly from a dict?有什么方法可以使用matplotlib
使用直接来自 dict 的数据绘制条形图吗?
My dict looks like this:我的字典是这样的:
D = {u'Label1':26, u'Label2': 17, u'Label3':30}
I was expecting我期待
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)
to work, but it does not.工作,但事实并非如此。
Here is the error:这是错误:
>>> 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
You can do it in two lines by first plotting the bar chart and then setting the appropriate ticks:您可以通过首先绘制条形图然后设置适当的刻度线来分两行完成:
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()
Note that the penultimate line should read plt.xticks(range(len(D)), list(D.keys()))
in python3, because D.keys()
returns a generator, which matplotlib cannot use directly.请注意, plt.xticks(range(len(D)), list(D.keys()))
倒数第二行应读取plt.xticks(range(len(D)), list(D.keys()))
,因为D.keys()
返回一个生成器,matplotlib 无法直接使用该生成器。
For future reference, the above code does not work with Python 3. For Python 3, the D.keys()
needs to be converted to a list.为了将来参考,以上代码不适用于 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()
The best way to implement it using matplotlib.pyplot.bar(range, height, tick_label)
where the range provides scalar values for the positioning of the corresponding bar in the graph.使用matplotlib.pyplot.bar(range, height, tick_label)
实现它的最佳方法,其中范围为图中相应条的定位提供标量值。 tick_label
does the same work as xticks()
. tick_label
的工作与xticks()
相同。 One can replace it with an integer also and use multiple plt.bar(integer, height, tick_label)
.也可以用整数替换它并使用多个plt.bar(integer, height, tick_label)
。 For detailed information please refer the 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()
Additionally the same plot can be generated without using range()
.此外,可以在不使用range()
情况下生成相同的图。 But the problem encountered was that tick_label
just worked for the last plt.bar()
call.但遇到的问题是tick_label
只适用于最后一次plt.bar()
调用。 Hence xticks()
was used for labelling:因此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()
Why not just:为什么不只是:
import seaborn as sns
sns.barplot(list(D.keys()), list(D.values()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.