Построение нескольких переменных в 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}

Поэтому я создал список, содержащий все номинальные значения для х и попытался построить все вместе с

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)

но опять же, с несколькими переменными, одна перезаписывает предыдущую. Нужно ли упорядочивать все словари одним и тем же способом для их построения, или есть ли другой способ сделать это без необходимости повторять все мои коды?

Всего 1 ответ


Вы можете убедиться в том, что порядок для двух осей y одинаков, используя ключи из одного dict для извлечения значений из обеих. Вот один из способов сделать это.

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]
>>> 

Есть идеи?

10000