简体   繁体   English

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

[英]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 无法直接使用该生成器。

It's a little simpler than most answers here suggest:它比这里的大多数答案建议的要简单一点:

import matplotlib.pyplot as plt

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

在此处输入图片说明

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

在此处输入图片说明

I often load the dict into a pandas DataFrame then use the plot function of the DataFrame.我经常将 dict 加载到 Pandas DataFrame 中,然后使用 DataFrame 的绘图功能。
Here is the one-liner:这是单线:

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

结果图

Why not just:为什么不只是:

import seaborn as sns

sns.barplot(list(D.keys()), list(D.values()))

Why not just:为什么不只是:

names, counts = zip(*D.items())
plt.bar(names, counts)

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM