Как изменить оси (X, Y) на графике в модуле matplotlib python?
Иммется код, который генерирует график. Это соотношения ТОП1-10, и количество просмотров за которым они и сортировались в этот ТОП.
Какие данные на входе:
(Значения Y оси идут реверсно(с меньшего до большего, потому-что доставал их через .pop())
x = ['Top10', 'Top9', 'Top8', 'Top7', 'Top6', 'Top5', 'Top4', 'Top3', 'Top2', 'Top1']
y = [257034, 260972, 343206, 362693, 413886, 521024, 670460, 722834, 748542, 1217913]
После выполнения plt.bar(x.pop(), y.pop())(10 раз), получаю следующий график:
Как исправить отображения Y оси? Что за ошибка появилась 1е6 ?
Какие будут варианты решения?
P.S. Возможно ли сделать на Y оси отображения только тех чисел, которые я задаю при создание графика? То есть: 1217913, 748542 ...
UPDATE!!! Ответ от пользователя handowl
Можно использовать pandas.
import pandas as pd
df = pd.DataFrame({'positions':x, 'values':y})
ax = df.plot.bar(x='positions', y='values', rot=30)
#ax.bar_label(ax.containers[0])
#ax.get_legend().remove()
plt.ticklabel_format(style='plain', axis='y')
plt.show()
После выполнения вашего кода я получаю сделующий результат:
- Почему-то стали открываться 2 окна.
- Что это за синие продолжения на графике после ТОП5 и до ТОП1?
Код функции построения графика полностью:
Ответы (2 шт):
Можно использовать pandas.
import pandas as pd
df = pd.DataFrame({'positions':x, 'values':y})
ax = df.plot.bar(x='positions', y='values', rot=30)
#ax.bar_label(ax.containers[0])
#ax.get_legend().remove()
plt.ticklabel_format(style='plain', axis='y')
plt.show()
Кстати, зачем Вы попите? Можно вот так:
sorted_values = sorted(zip(x, y), key=lambda e: e[1], reverse=True)
x = [pair[0] for pair in sorted_values]
y = [pair[1] for pair in sorted_values]
или вот так:
x = x[::-1]
y.sort(reverse=True)
Всё можно сделать, но в таком варианте как вы хотите цифры будут наезжать друг на друга:
import matplotlib.pylab as plt
x = ['Top10', 'Top9', 'Top8', 'Top7', 'Top6', 'Top5', 'Top4', 'Top3', 'Top2', 'Top1']
y = [257034, 260972, 343206, 362693, 413886, 521024, 670460, 722834, 748542, 1217913]
x1 = x.copy()
y1 = y.copy()
for i in range(10):
plt.bar(x1.pop(), y1.pop());
plt.yticks(y); # выставляем только нужные нам метки на оси y
plt.ticklabel_format(style='plain', axis='y') # форматирование меток


