обзор
August 18, 2021

Графика на Python с Matplotlib

Рассмотрим, как визуализировать результаты анализа средствами библиотеки Matplotlib.

Наиболее часто для этого применяют модуль matplotlib.pyplot, который предоставляет как функциональный, так и объектный интерфейс. Как правило, первый применяют, если требуется нарисовать один график, а второй - несколько. Общепринято импортировать данный модуль под псевдонимом plt:

import matplotlib.pyplot as plt

В демонстрационных целях зададим точки, соответствующие графику логарифма:

x = np.linspace(1,20,10)
y = np.log(x)

Теперь зададим простейшие настройки:

plt.plot(x,y, label = 'название графика')
plt.title('Заголовок')
plt.xlabel('Подпись оси x')
plt.ylabel('Подпись оси y', rotation=90)
plt.legend()

В первой строке задается тип графика и на вход функции plot передаются точки, здесь же указывается название кривой. Далее:

plt.title - задает название всего рисунка; plt.xlabel - подпись оси x;
plt.ylabel - подпись оси y, по желанию для поворота можно использовать аргумент rotation;
plt.legend - инициирует отображение названия графика и различных надписей на нем.

При задании тех же параметров для столбцовой диаграммы получается следующий результат:

plt.bar(x,y , label = 'название графика')
plt.title('Заголовок')
plt.xlabel('Подпись оси x')
plt.ylabel('Подпись оси y', rotation=90)
plt.legend()

Подписи и метки на осях

Не очень красиво выглядят метки на оси x, так как выбраны автоматически и не соответствуют значениям x. Чтобы это исправить, можно задать:

plt.xticks(x, np.round(x,2))

В качестве первого параметра задается положение меток, второго - их наименования. Если задан один параметр, то и положение, и наименования будут заполняться этими значениями:

plt.xticks(x, np.round(x,2))
plt.yticks(y)

Если добавить такие строки, то:

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

Когда не требуется выводить метки по оси, можно задать пустой список в xticks/yticks:

plt.xticks([])

Границы значений по осям

Также иногда полезно задавать границы отображения графика по осям с помощью plt.xlim/plt.ylim (также вернем метки, чтобы было понятно):

plt.xticks(x, np.round(x,2))
plt.xlim([5,10])

Отобразить дополнительную надпись на полотне

Для этих целей можно воспользоваться таким трюком - добавить пустой график с заданным значением свойства label:

plt.scatter([],[],label='Дополнительная надпись')

Сохранение

Воспользуйтесь функцией savefig:

plt.savefig('pict.png')

Если на одном рисунке несколько графиков

В этом случае используется объектный интерфейс. Распространенный способ его применения выглядит следующим образом:

fiq, ax = plt.subplots(2,3, sharex=True, sharey=True)

С помощью plt.subplots получаем объект рисунка и массив подграфиков, где первое число - количество строк, второе - столбцов, sharex, sharey задают нужно ли разделять ось между подграфиками. Затем в цикле заполняются подграфики:

fig, ax = plt.subplots(2,3, sharex=True, sharey=True)

data_l = ['Данные 1','Данные 2','Данные 3','Данные 4','Данные 5','Данные 6']

for ax_i, data in zip(ax.flatten(),data_l):
    ax_i.plot(x,y, label=data)
    ax_i.set_xticks(x)
    ax_i.set_xticklabels(np.round(x))
    ax_i.set_xlim([0,6])
    ax_i.legend()

ax[1,1].set_xlabel('Название по оси x')
ax[1,0].set_ylabel('Название по оси y')
fig.subplots_adjust(hspace=0.1, wspace=0.4)
fig.suptitle('Название рисунка')

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

plt.title -> fig.suptitle
             ax.set_title (для заголовка подграфика)
plt.xlabel -> ax_i.set_xlabel
plt.xticks -> ax_i.set_xticks, ax_i.set_xticklabels
plt.xlim -> set_xlim
plt.legend -> ax_i.legend

fig.subplots_adjust - используется для задания размеров полей между подграфиками. Вынесенные за пределы цикла методы set_xlabel и set_ylabel позволяют задать заголовки осей, начиная с определенных подграфиков.

Для сохранения графиков в файле можно воспользоваться методом savefig объекта рисунка:

fig.savefig('pict.png')