首页 > 解决方案 > 在matplotlib python中绘制多个变量

问题描述

我正在尝试绘制条形图,并且我有 xaxisn(n 从 1 到 5)和 yaxisn(1 到 5)的多个列表。每个xaxisn中的值最初映射到字典中yaxisn中的值,它们从1到5相同,但顺序不同。例如

dict1 = {'a': 80, 'c': 30, 'e': 52, 'b': 12, 'd': 67}
dict2 = {'c': 47, 'a': 73, 'e': 32, 'd': 35, 'b': 40}

因此,我创建了一个包含 x 的所有标称值的列表,并尝试将所有内容与

xaxis = ['a', 'b', 'c', 'd', 'e']
yaxis1 = dict1.values()
xaxis1 = dict1.keys()
yaxis2 = dict2.values()
xaxis2 = dict2.keys()
plt.bar(xaxis1,yaxis1)
plt.bar(xaxis2,yaxis2)
plt.xticks(range(len(xaxis)),xaxis)

但我注意到,尽管被映射在一起,但图中的 y 值并未与右 x 对齐。因此,它们没有按照 的频率顺序显示,而是xaxis保持与字典中相同的顺序。我试图将最后一行代码更改为

plt.xticks(range(len(xaxis)),xaxis1)
plt.xticks(range(len(xaxis)),xaxis2)

但同样,对于多个变量,一个会覆盖前一个。我是否需要以相同的方式订购所有字典来绘制它们,或者是否有另一种方法可以做到这一点而不必重做我的所有代码?

标签: pythondictionarymatplotlibplot

解决方案


您可以通过使用一个 dict 的键从两者中提取值来确保两个 y 轴的顺序相同。这是一种方法。

import operator

dict1 = {'a': 80, 'c': 30, 'e': 52, 'b': 12, 'd': 67}
dict2 = {'c': 47, 'a': 73, 'e': 32, 'd': 35, 'b': 40}

xs = dict1.keys()
f = operator.itemgetter(*xs)
y1 = f(dict1)
y2 = f(dict2)

>>> xs
dict_keys(['a', 'c', 'e', 'b', 'd'])
>>> y1
(80, 30, 52, 12, 67)
>>> y2
(73, 47, 32, 40, 35)
>>>

然后xs用于所有绘图。

plt.bar(xs,y1)
plt.bar(xs,y2)
plt.xticks(range(len(xs)),xs)
plt.show()
plt.close()

operator.itemgetter将按照给定的顺序获取实例化的每个项目。类似于这些列表推导。

>>> [dict1[k] for k in xs]
[80, 30, 52, 12, 67]
>>> [dict2[k] for k in xs]
[73, 47, 32, 40, 35]
>>> 

推荐阅读