Использование библиотеки Matplotlib. Как рисовать гистограммы

Оглавление

Для построения гистограмм (диаграмм в виде набора столбиков) в Matplotlib используются функция bar() и barh(), которые строят вертикальные или горизонтальные гистограммы соответственно. Эти функции, как и другие функции рисования, импортируются из модуля matplotlib.pyplot или pyplot. Функции bar и barh имеют множество необязательных параметров с дополнительными настройками, мы в данной статье мы рассмотрим только наиболее часто используемые возможности для настройки внешнего вида гистограмм.

График без настройки внешнего вида

Для начала сначала рассмотрим простейший пример, где используются только обязательные параметры, их всего два.

  • Список координат расположения столбиков по оси X для bar() или по оси Y для barh().
  • Значения, задающие высоту (длину) столбиков.

Длины этих двух списков должны быть равны.

Наш первый пример будет выглядеть так:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 4, 5, 8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata)
    plt.show()

После запуска программы мы увидим график:

Или аналогично для функции barh():

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 4, 5, 8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.barh(xdata, ydata)
    plt.show()

Выравнивание меток относительно столбцов

Как видно из примеров, по умолчанию метки на осях расположены по центру столбцов. Это поведение можно изменить с помощью именованного параметра align, который может принимать строковые значения 'center', что соответствует значению по умолчанию, или 'edge', в этом случае метки по осям будут расположены в начале столбиков. Добавим в нашем примере параметр align='edge' и посмотрим, что из этого получится:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 4, 5, 8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata, align='edge')
    plt.show()

Аналогично себя ведет и функция barh:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 4, 5, 8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.barh(xdata, ydata, align='edge')
    plt.show()

Результат выглядит следующим образом:

Изменение цвета столбцов

Чтобы изменить цвет столбиков, используется именованный параметр color, он может задавать единственное значение цвета в виде строки или быть списком, который задает цвет для каждого столбика отдельно. О том, как задаются цвета в Matplotlib, вы можете прочитать, например, .

Следующий пример показывает, как установить один цвет для всех столбиков:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata, color='green')
    plt.show()

Следующий пример устанавливает для каждого столбика свой цвет:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]
    colors = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']

    plt.bar(xdata, ydata, color=colors)
    plt.show()

Если же в списке цветов окажется меньше элементов, чем количество столбцов, то цвета начнут повторяться заново с нулевого элемента. Это показано в следующем примере:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]
    colors = ['green', 'blue', 'orange']

    plt.bar(xdata, ydata, color=colors)
    plt.show()

Результат будет выглядеть следующим образом:

Измерение обводки столбцов

С помощью именованных параметров linewidth и edgecolor функции bar() и barh() можно установить толщину линии обводки и ее цвет соответственно. В следующий пример добавляет к столбцам черную обводку толщиной 1.0 условная единица.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 4, 5, 8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata, linewidth=1.0, edgecolor='k')
    plt.show()

Теперь график будет выглядеть следующим образом:

Также цвета рамки можно задавать индивидуально для каждого столбика. Для этого нужно в качестве значения параметра edgecolor передать не один цвет, а список цветов, как показано в следующем примере. Для более наглядного представления, с помощью параметра linewidth толщина рамки задана как 2.0 условные единицы.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]
    edgecolors = ['orange', 'red', 'black', 'yellow', 'violet', 'blue']

    plt.bar(xdata, ydata, linewidth=2.0, edgecolor=edgecolors)
    plt.show()

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

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]
    edgecolors = ['orange', 'red', 'black']

    plt.bar(xdata, ydata, linewidth=2.0, edgecolor=edgecolors)
    plt.show()

В результате будет показано следующее окно:

Изменение ширины столбцов

По умолчанию ширины столбиков равны 0.8, поэтому, если шаг между отсчетами меньше этого значения, то столбики начнут пересекаться, и это вряд ли то, чего мы добивались:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 0.1, 0.2, 0.4, 0.5, 0.8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata, linewidth=1.0, edgecolor='k')
    plt.show()

Ширину столбиков можно задавать с помощью параметра width, который может быть целым числом (в этом случае все столбики будут иметь одинаковую ширину) или списком (тогда для каждого столбика можно задать свою ширину). Давайте для начала сделаем так, чтобы столбики примыкали друг к другу, т.е. их ширина должна равняться расстоянию между ними:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 0.1, 0.2, 0.4, 0.5, 0.8]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]

    plt.bar(xdata, ydata, linewidth=1.0, edgecolor='k', width=0.1)
    plt.show()

И посмотрим, как использовать параметр width, когда он задается в виде списка:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt


if __name__ == '__main__':
    xdata = [0, 1, 2, 3, 4, 5]
    ydata = [0.1, 0.2, 0.4, 0.8, 0.6, 0.1]
    width = [0.05, 0.1, 0.2, 0.4, 0.3, 0.05]

    plt.bar(xdata, ydata, linewidth=1.0, edgecolor='k', width=width)
    plt.show()

В данном примере ширины заданы таким образом, чтобы они были пропорциональны отображаемому значению.

На этом пока все, мы рассмотрели основные возможности для построения гистограмм, за кадром остался вопрос отображения границ погрешностей данных, но это тема для отдельной статьи.

Другие статьи про Matplotlib

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
4.5 stars

Рейтинг 4.5/5. Всего 16 голос(а, ов)



True 04.07.2016 - 17:01

Очень удобная справка. СПАСИБО!


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 969