python - 在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)
但同样,对于多个变量,一个会覆盖前一个。我是否需要以相同的方式订购所有字典来绘制它们,或者是否有另一种方法可以做到这一点而不必重做我的所有代码?
解决方案
您可以通过使用一个 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]
>>>
推荐阅读
- java - 按下电子邮件链接后,如何使 Android 重定向到特定活动?
- qt - QThread 如何从它自己的线程发送一个带有枚举作为 QML 消费参数的信号?
- vb.net - 我正在尝试将 Any+Time DatePicker/TimePicker 中的值传递给后面的 asp.net 代码
- react-native - 如何解决这个错误,Uncaught Error: 36.0.0 is not a valid SDK version。选项为 35.0.0、34.0.0、33.0.0、未版本
- ios - 使用 Flutter for iOS 检索订阅 IAP 产品列表
- python - 查找两个熊猫数据框之间的差异,并将所有内容添加到新的 DF
- android - Google Nearby - 连接 API - 发现不起作用
- c# - 插值逐字字符串文字中的 C# 预处理器指令
- amazon-cloudformation - 当参数更改时,如何使 Cloudformation 使用宏重新处理模板?
- ruby-on-rails - 每周一午夜执行相同的功能