Matplotlib Проблемы со столбчатым графиком Python
Час добрый! Подскажите, пожалуйста, причину подобного отображения, и как все можно исправить:
На вход поступает следующее:
matplotlib.use('Agg')
mounts = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Агуст', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']
counter = ['0', '0', '1188898', '4935575', '747766', '0', '0', '0', '0', '0', '0', '0']
plt.bar(mounts, counter)
plt.savefig('post_diagram.png')
plt.close()
Подскажите, пожалуйста, как исправить следующие вещи:
- Как сделать вертикальное положение текста на оси Х [РЕШЕНО]
- Как "починить" ось y, чтобы высота столбцов отображалась верно
Апрель - 4935575 (должен быть самым крупным, а он средний)
Март - 1188898 (должен быть средним, а он самый маленький)
Май - 747766 (должен быть самым маленьким, а он самый высокий)
EDITED
Результат если передавать значения высоты в списке числами
Можете еще теперь подсказать по поводу увеличения длины/высоты самой диаграммы? Чтобы значения влезали, чтобы отображались введенные числа, а не 0-5
Ответы (1 шт):
Для вертикального положения текста на Х воспользуйтесь rotation:
plt.bar(mounts, counter)
plt.xticks(rotation=90)
Неправильный размер столбцов, полагаю, связан с тем, что вы передали не int, а str, поэтому он их воспринимает не как число и просто увеличивает bar на одинаковую длину в том порядке, в котором числа идут в списке. Попробуйте убрать кавычки у чисел из counter.
Вот в целом код, который должен все исправить:
import matplotlib.pyplot as plt
mounts = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']
counter = [0, 0, 1188898, 4935575, 747766, 0, 0, 0, 0, 0, 0, 0]
plt.bar(mounts, counter)
plt.xlabel('Месяцы')
plt.ylabel('Количество')
plt.title('График')
plt.yticks(range(0, max(counter) + 1))
plt.xticks(rotation=90)
plt.show()
Но так как там огромные числа, это может очень долго строить график, поэтому я бы воспользовался нормализацией данных в counter:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 10))
s = 100 # верхняя граница нормализации
mounts = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']
counter_orig = [0, 0, 1188898, 4935575, 747766, 0, 0, 0, 0, 0, 0, 0]
counter = []
for i in counter_orig:
if i == 0:
counter.append(0)
else:
counter.append(int(round(s*i/max(counter_orig), 0)))
plt.bar(mounts, counter)
plt.xlabel('Месяцы')
plt.ylabel('Количество')
plt.title('График')
plt.yticks(range(0, max(counter) + 1))
plt.xticks(rotation=90)
plt.show()
