Проблема в том, что вы принимаете plotx
как список меток, которые будут нанесены на ось X в указанном порядке.Фактически, plotx
- это список абсолютных местоположений на оси X, на которых будут отображаться соответствующие значения Y.Так как ось X по умолчанию поднимается слева направо, порядок, в котором вы перечисляете местоположения в plotx
, не имеет значения.
Рассмотрим следующую функцию печати, которая позволяет сортировать plotx
в порядке убывания или возрастания поустановка параметра reverse
на True
или False
:
def plot_bar(data, reverse):
data = sorted(data.items(), key=lambda x:x[1], reverse=reverse)
plotx =[]
ploty =[]
for item in data:
plotx.append(item[0])
ploty.append(item[1])
plt.figure()
plt.bar(plotx, ploty)
plt.show()
График с plotx
в порядке возрастания:
plot_bar({1: 1, 2: 2, 3: 3}, False)
Теперь строим график с plotx
в порядке убывания:
plot_bar({1: 1, 2: 2, 3: 3}, True)
Как видите, порядок расположенияв plotx
не имеет значения.
Чтобы отобразить значения Y в том порядке, в котором они перечислены в ploty
, вы можете создать новый список местоположений locs
для использования в plt.bar()
и использоватьplotx
как метки для этих мест:
def plot_bar_new(data, reverse):
data = sorted(data.items(), key=lambda x:x[1], reverse=reverse)
plotx, ploty = zip(*data) # replaces the for-loop from plot_bar()
locs = range(0, len(ploty))
plt.figure()
plt.bar(locs, ploty)
plt.xticks(locs, plotx)
plt.show()
plot_bar_new({1: 1, 2: 2, 3: 3}, False)
plot_bar_new({1: 1, 2: 2, 3: 3}, True)