====== Графики ====== Самым популярным модулем для построения графиков в Python является ''matplotlib''[pip].
===== Бекенды ===== Модуль ''matplotlib'' предоставляет стандартное API для построение графиков и, так называемые, бекенды, которые отвечают за вывод результатов пользователю. Они бывают как интерактивные (открываются в отдельном окне, позволяют заимодействовать с графиком, например ''Qt5Agg''), так и неинтерактивные, результатом работы которых является картинка. В средах использующих IPython (например Spyder) имеется дополнительный неинтерактивные бекенд ''inline'', для вывода графиков в среду. Неинтерактивные бекенды удобны для создания большого числа графиков. Выбор бекенда осуществляется в настройках среды или в коде: import matplotlib matplotlib.use('Qt5Agg')
===== Глобальный объект pyplot ===== Модуль ''matplotlib'' содержит глобальный объект ''pyplot'', который выступает в роли стандартного холста: import numpy as np import matplotlib.pyplot as plt # рисуем plt.plot([1,2,3],[5,3,7]) # отображаем или сохраняем plt.show() plt.savefig('filename.png') Хорошие форматы для сохранения графиков: векторные: ''.svg'', ''.eps'' и растровые без потерь: ''.png'', ''.tiff''. При запуске по ячейкам среды автоматически вызывают ''plt.show()'' если в ячейке что-то было нарисовано для отображения результата. После отображения или сохранения результата глобальный объект ''pyplot'' очищается.
===== Рисование с использованием объекта plt (в стиле MATLAB) ===== t = np.arange(0.0, 2.0, 0.01) s = 1 + np.sin(2*np.pi*t) plt.plot(t, s, color="blue", label="s(t)") plt.xlabel('время, с') plt.ylabel('значение, мВ') plt.title('Заголовок слайда') plt.grid() plt.legend()
===== Рисование с использованием объекта plt (в стиле matplotlib) ===== t = np.arange(0.0, 2.0, 0.01) s = 1 + np.sin(2*np.pi*t) fig = plt.figure() ax = fig.add_subplot() ax.plot(t, s, color="blue", label="s(t)") ax.set_xlabel('время, с') ax.set_ylabel('значение, мВ') ax.set_title('Заголовок слайда') ax.grid() ax.legend()
===== Рисование с использованием объекта Figure ===== import matplotlib t = np.arange(0.0, 2.0, 0.01) s = 1 + np.sin(2*np.pi*t) fig = matplotlib.figure.Figure() ax = fig.add_subplot() ax.plot(t, s, color="blue", label="s(t)") ax.set_xlabel('время, с') ax.set_ylabel('значение, мВ') ax.set_title('Заголовок слайда') ax.grid() ax.legend() fig.savefig('file.png')
===== Анатомия графика ===== {{:calc:anatomy.png?600|}}
===== Популярные типы графиков - основные ===== ^ Метод ^ Назначение ^ | ''%%errorbar(x, y, yerr, xerr)%%'' | Точки с усами ошибок | | ''%%plot(x, y)%%'' | Кривая | | ''%%scatter(x, y)%%'' | Точки | ===== Некоторые аргументы plot и scatter ===== ^ Аргумент ^ Назначение ^ Примеры значений ^ | ''%%color%%'' | Цвет линии | ''%% "black", "#f000f0"%%'' | | ''%%label%%'' | Текст в легенде | ''%%"синус икс"%%'' | | ''%%linestyle%%'' | Стиль линии | ''%%"", "-", "--", "dotted"%%'' | | ''%%linewidth%%'' | Ширина линии | ''%%6.5%%'' | | ''%%marker%%'' | Форма маркера | ''%%"", "+", "o", "4"%%'' | | ''%%markerfacecolor%%'' | Цвет маркера | ''%%"black", "#f000f0"%%'' | | ''%%markeredgecolor%%'' | Цвет обводки маркера | ''%%"black", "#f000f0"%%'' | | ''%%markeredgewidth%%'' | Ширина обводки маркера | ''%%0.5%%'' | | ''%%markersize%%'' | Размер маркера | ''%%2.5%%'' |
==== Теплокарты и контуры ==== ^ Метод ^ Назначение ^ Пример ^ | ''%%plt.pcolor%%'' | Рисование теплокарты | ''%%plt.pcolor(data, vmin=0, vmax=3)%%'' | | ''%%plt.imshow%%'' | Рисование изображения | ''%%plt.imshow(data, extent=[-3, 3, -3, 3], vmin=-1, vmax=1)%%'' | | ''%%plt.contour%%'' | Рисование контуров | ''%%cnt_data = plt.contour(data, levels = [1,2,3], colors = 'white')%%'' | | ''%%plt.contourf%%'' | Рисование контуров | ''%%cnt_data = plt.contour(data, levels = [1,2,3], colors = 'white')%%'' | ==== Дополнительные методы для теплокарт ==== ^ Метод ^ Назначение ^ Пример ^ | ''%%plt.colorbar%%'' | Рисование шкалы цвета | ''plt.colorbar()'' | | ''%%plt.clabel%%'' | Рисование меток на контурах | ''%%plt.clabel(cnt_data, inline=True, fontsize=10, fmt = '%2.0f', colors = 'white')%%'' | ==== Гистограммы и барплоты ==== ^ Метод ^ Назначение ^ Пример ^ | ''%%plt.hist%%'' | Гистограмма | ''%%plt.hist(x, np.arange(0,3,1/5))%%'' | | ''%%plt.bar%%'' | Барплот | ''%%plt.bar(ind, values, width)%%'' |
===== Вспомогательные функции - надписи и подписи ===== ^ Функция ^ Назначение ^ Пример использования ^ | ''%%ax.set_xlabel%%'' | Подпись оси X | ''%%plt.xlabel("Подпись Х")%%'' | | ''%%ax.set_ylabel%%'' | Подпись оси Y | ''%%plt.ylabel("Подпись Y")%%'' | | ''%%ax.set_title%%'' | Заголовок графика | ''%%plt.title("Заголовок")%%'' | | ''%%ax.legend%%'' | Показать легенду | ''%%plt.legend(loc='upper left')%%'' | | ''%%ax.annotate%%'' | Добавить аннотацию к точке xy | ''%%ax.annotate('Максимум', xy=(2, 1))%%'' | В тексте можно использовать команды на TeXе окружая их знаками долларов: ''$4\pi^2$''.
===== Вспомогательные функции - оси ===== ^ Функция ^ Назначение ^ Пример использования ^ | ''%%ax.set_xlim%%'' | Границы по оси X | ''%%plt.xlim(-4.0, 4.0)%%'' | | ''%%ax.set_ylim%%'' | Границы по оси Y | ''%%plt.ylim(-3.0, 10.0)%%'' | | ''%%ax.set_xticks%%'' | Отсчеты по оси X | ''%%plt.xticks([1, 2, 3, 4, 5])%%'' | | ''%%ax.set_yticks%%'' | Отсчеты по оси Y | ''%%plt.yticks([1,2,3,], ['1a','2a','3a'])%%'' | | ''%%ax.grid%%'' | Включить сетку | ''%%plt.grid(True)%%'' | |''%%ax.hlines%%'' | Горизонтальные линии | ''%%ax.hlines(3, -10, 10)%%'' | |''%%ax.vlines%%'' | Вертикальные линии | ''%%ax.vlines(3, -10, 10)%%'' |
===== Функции объекта pyplot - Масштабы осей ===== ^ Функция ^ Назначение ^ Пример использования ^ | ''%%ax.set_xscale%%'' | Масштаб по оси X | ''%%ax.set_xscale("log")%%'' | | ''%%ax.set_yscale%%'' | Масштаб по оси Y | ''%%ax.set_yscale("linear")%%'' | | ''%%fig.add_subplot(polar=True)%%'' | Создать систему полярных координат | |
===== Специальные построения: несколько систем координат ===== Использование модуля ''matplotlib.gridspec''. # Задаем сетку для деления 2 строки 3 столбца grsp = matplotlib.gridspec.GridSpec(2, 3) # Получаем указатели на отельные оси с помощью слайсов axis1 = fig.add_subplot(grsp[0, :]) # Вся верхняя строка axis2 = fig.add_subplot(grsp[1, 0:2]) # Нижняя строка две левых клетки axis3 = fig.add_subplot(grsp[1, 2]) # Нижняя строка правый угол
==== Пример ==== {{ :calc:figure_1-3.png |}}
===== Специальные построения: Теплокарты ===== Для построения теплокарты необходимо иметь двумерный массив с данными. plt.imshow(data, extent=[-3, 3, -3, 3], origin='lower', cmap='YlGnBu') plt.colorbar() Выбираем нужный тип палитры [[https://matplotlib.org/stable/tutorials/colors/colormaps.html|на сайте matplotlib]].
==== Пример ==== {{ :calc:figure_1-7.png |}}
===== Управление расположением цветовой шкалы ===== from mpl_toolkits.axes_grid1 import make_axes_locatable # находим нашу систему коордит в рамках Figure divider = make_axes_locatable(ax) # определяем новую область для рисования цветовой шкалы color_ax = divider.new_horizontal(size="3%", pad=0.1, axes_class=plt.Axes) # добавляем к фигуре новую область для цветовой шкалы fig.add_axes(color_ax) #рисуем шкалу fig.colorbar(im, cax=color_ax)
===== Специальные построения: Контуры ===== Для построения контуров необходимо иметь: два одномерных массива с равномерными интервалами между точками и двумерный массив с данными. Ключевые методы ''plt.contour'' и ''plt.contourf''. ==== Подготовка ==== # Источник данных — функция двух переменных def f(x, y): return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 -y ** 2) # Создаем массивы для осей: n = 256 x = np.linspace(-3, 3, n) y = np.linspace(-3, 3, n) # Делаем мешгрид gridX, gridY = np.meshgrid(x, y) data = f(gridX, gridY)
==== Рисование ==== #Раскрашивание контуров цветами (палитра 'jet') cntrf = plt.contourf(gridX, gridY, data, 8, alpha=.75, cmap='jet') #Разграничение контуров линиями cntr = plt.contour(X, Y, f(X, Y), 8, colors='black') #Добавляем подписи на контуры plt.clabel(cntr, inline=1, fontsize=10) #Добавляем цветовую легенду plt.colorbar(cntrf)
==== Пример ==== {{ :calc:figure_1-6.png |}}