Графика на 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')