Линейный график – это один из наиболее часто используемых видов графика для визуализации данных. Он использовался нами для демонстрации возможностей Matplotlib в предыдущих уроках, в этом уроке мы более подробно рассмотрим возможности настройки его внешнего вида.
- Построение графика
- Заливка области между графиком и осью
- Настройка маркировки графиков
- Обрезка графика
Построение графика
Для построения линейного графика используется функция plot(), со следующей сигнатурой:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)
Если вызвать функцию plot() с одним аргументом – вот так: plot(y), то мы получим график, у которого по оси ординат (ось y) будут отложены значения из переданного списка, по по оси абсцисс (ось x) – индексы элементов массива.
Рассмотрим аргументы функции plot():
- x, x2, …: array
- Набор данных для оси абсцисс первого, второго и т.д. графика.
- y, y2, …: array
- Набор данных для оси ординат первого, второго и т.д. графика.
- fmt: str
- Формат графика, задается в виде строки: ‘[marker][line][color]’.
- **kwargs – свойства класса Line2D, которые предоставляют доступ к большому количеству настроек внешнего вида графика, отметим наиболее полезные:
Свойство | Тип | Описание |
alpha | float | Прозрачность |
color или c | color | Цвет |
fillstyle | {‘full’, ‘left’, ‘right’, ‘bottom’, ‘top’, ‘none’} | Стиль заливки |
label | object | Текстовая метка |
linestyle или ls | {‘-‘, ‘–‘, ‘-.’, ‘:’, ”, (offset, on-off-seq), …} | Стиль линии |
linewidth или lw | float | Толщина линии |
marker | matplotlib.markers | Стиль маркера |
markeredgecolor или mec | color | Цвет границы маркера |
markeredgewidth или mew | float | Толщина границы маркера |
markerfacecolor или mfc | color | Цвет заливки маркера |
markersize или ms | float | Размер маркера |
Параметры аргумента fmt
marker: str
Определяет тип маркера, может принимать одно из значений, представленных в таблице ниже
Символ | Описание |
‘.’ | Точка (point marker) |
‘,’ | Пиксель (pixel marker) |
‘o’ | Окружность (circle marker) |
‘v’ | Треугольник, направленный вниз (triangle_down marker) |
‘^’ | Треугольник, направленный вверх(triangle_up marker) |
‘<‘ | Треугольник, направленный влево (triangle_left marker) |
‘>’ | Треугольник, направленный вправо (triangle_right marker) |
‘1’ | Треугольник, направленный вниз (tri_down marker) |
‘2’ | Треугольник, направленный вверх(tri_up marker) |
‘3’ | Треугольник, направленный влево (tri_left marker) |
‘4’ | Треугольник, направленный вправо (tri_right marker) |
‘s’ | Квадрат (square marker) |
‘p’ | Пятиугольник (pentagon marker) |
‘*’ | Звезда (star marker) |
‘h’ | Шестиугольник (hexagon1 marker) |
‘H’ | Шестиугольник (hexagon2 marker) |
‘+’ | Плюс (plus marker) |
‘x’ | Х-образный маркер (x marker) |
‘D’ | Ромб (diamond marker) |
‘d’ | Ромб (thin_diamond marker) |
‘|’ | Вертикальная линия (vline marker) |
‘_’ | Горизонтальная линия (hline marker) |
line: str
Стиль линии/ Может принимать одно из следующих значений:
Символ | Описание |
‘-‘ | Сплошная линия (solid line style) |
‘–‘ | Штриховая линия (dashed line style) |
‘-.’ | Штрих-пунктирная линия (dash-dot line style) |
‘:’ | Штриховая линия (dotted line style) |
color
Цвет графика. В рамках аргумента fmt цвет задается значением из следующей таблицы:
Символ | Описание |
‘b’ | Синий |
‘g’ | Зеленый |
‘r’ | Красный |
‘c’ | Бирюзовый |
‘m’ | Фиолетовый (пурпурный) |
‘y’ | Желтый |
‘k’ | Черный |
‘w’ | Белый |
Реализуем возможности plot() на примере:
x = [1, 5, 10, 15, 20] y1 = [1, 7, 3, 5, 11] y2 = [4, 3, 1, 8, 12] plt.figure(figsize=(12, 7)) plt.plot(x, y1, 'o-r', alpha=0.7, label="first", lw=5, mec='b', mew=2, ms=10) plt.plot(x, y2, 'v-.g', label="second", mec='r', lw=2, mew=2, ms=12) plt.legend() plt.grid(True)
Рассмотрим различные варианты использования линейного графика.
Заливка области между графиком и осью
Для заливки областей используется функция fill_between(). Сигнатура функции:
fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
Основные параметры функции:
- x : массив длины N
- Набор данных для оси абсцисс.
- y1 : массив длины N или скалярное значение
- Набор данных для оси ординат – первая кривая.
- y2 : массив длины N или скалярное значение
- Набор данных для оси ординат – вторая кривая.
- where: массив bool элементов (длины N), optional, значение по умолчанию: None
- Задает заливаемый цветом регион, который определяется координатами x[where]: интервал будет залит между x[i] и x[i+1], если where[i] и where[i+1] равны True.
- step: {‘pre’, ‘post’, ‘mid’}, optional
- Определяет шаг, если используется step-функция для отображения графика (будет рассмотрена в одном из следующих уроков).
- **kwargs
- Свойства класса Polygon
Создадим набор данных для эксперимента:
import numpy as np x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi)
Отобразим график с заливкой:
plt.plot(x, y, c = "r") plt.fill_between(x, y)
Изменим правила заливки:
plt.plot(x, y, c = "r") plt.fill_between(x, y, where = (y > 0.75) | (y < -0.75))
Используя параметры y1 и y2 можно формировать более сложные решения.
Заливка области между 0 и y, при условии, что y >= 0:
plt.plot(x, y, c = "r") plt.fill_between(x, y, where = (y > 0))
Заливка области между 0.5 и y, при условии, что y >= 0.5:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, 0.5, y, where=y>=0.5)
Заливка область между y и 1:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, y, 1)
Вариант двухцветной заливки:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, y, where=y>=0, color="g", alpha=0.3) plt.fill_between(x, y, where=y<=0, color="r", alpha=0.3)
Настройка маркировки графиков
В начале этого раздела мы приводили пример использования маркеров при отображении графиков. Сделаем это ещё раз, но уже в упрощенном виде:
x = [1, 2, 3, 4, 5, 6, 7] y = [7, 6, 5, 4, 5, 6, 7] plt.plot(x, y, marker="o", c="g")
В наборе данных, который создает код:
import numpy as np x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi)
количество точек составляет 500, поэтому подход, представленный выше уже будет не применим:
plt.plot(x, y, marker="o", c="g")
В этой случае нужно задать интервал отображения маркеров, для этого используется параметр markevery, который может принимать одно из следующих значений:
None – отображаться будет каждая точка;
N – отображаться будет каждая N-я точка;
(start, N) – отображается каждая N-я точка начиная с точки start;
slice(start, end, N) – отображается каждая N-я точка в интервале от start до end;
[i, j, m, n] – будут отображены только точки i, j, m, n.
Ниже представлен пример, демонстрирующий работу с markevery:
x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi) m_ev_case = [None, 10, (100, 30), slice(100,400,15), [0, 100, 200, 300], [10, 50, 100]] fig, ax = plt.subplots(2, 3, figsize=(10, 7)) axs = [ax[i, j] for i in range(2) for j in range(3)] for i, case in enumerate(m_ev_case): axs[i].set_title(str(case)) axs[i].plot(x, y, "o", ls='-', ms=7, markevery=case)
Обрезка графика
Для того, чтобы отобразить только часть графика, которая отвечает определенному условию используйте предварительное маскирование данных с помощью функции masked_where из пакета numpy.
x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi) y_masked = np.ma.masked_where(y < -0.5, y) plt.ylim(-1, 1) plt.plot(x, y_masked, linewidth=3)
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта. Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.