Matplotlib Проблемы со столбчатым графиком Python

Рейтинг: 1Ответов: 1Опубликовано: 19.05.2023

Час добрый! Подскажите, пожалуйста, причину подобного отображения, и как все можно исправить:

На вход поступает следующее:

    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

Ответы

▲ 2Принят

Для вертикального положения текста на Х воспользуйтесь 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()