我正在尝试使用matplotlib从字典中构建一个条形图,但它似乎正在重新排列条形图。我该如何解决这个问题?
import numpy as np
import string
char_dict = {}
for char in string.lowercase:
char_dict[char] = char_dict.get(char, 0) + np.random.randint(1, 10)
plt.bar(range(len(char_dict)), char_dict.values(), align = 'center')
_ = plt.xticks(range(len(char_dict)), char_dict.keys())
plt.margins(0.05, 0)
答案 0 :(得分:1)
Python dicts没有订购:
https://docs.python.org/2/library/stdtypes.html#dict.items说
键和值以任意顺序列出,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。
要解决此问题,您应该使用collections.OrderedDict来存储您的数据:https://docs.python.org/2/library/collections.html#ordereddict-objects
答案 1 :(得分:1)
如果您想要对值进行排序,请不要使用dict
。返回可以是完全随机的。
OrderedDict
(在集合库中)基本上是一个排序的字典。并且看起来/工作完全一样。
或者您可以使用两个列表作为键,一个列表作为值。
答案 2 :(得分:1)
普通词典没有订单。您可以使用Ordered dictionary。或者在绘制之前对结果进行排序:
import numpy as np
import matplotlib.pyplot as plt
input_str = 'testdstasdtaetsts'
char_dict = {}
for char in input_str.lower():
char_dict[char] = char_dict.get(char, 0) + np.random.randint(1, 10)
result_list = sorted([[chars, counts] for chars, counts in char_dict.items()], key = lambda x: x[0])
characters = [x[0] for x in result_list]
counts = [x[1] for x in result_list]
plt.bar(range(len(char_dict)), counts, align = 'center')
_ = plt.xticks(range(len(char_dict)), characters)
plt.margins(0.05, 0)
plt.show()