Matplotlib. Урок 4.1. Визуализация данных. Линейный график

Автор: | 17.10.2019

Линейный график – это один из наиболее часто используемых видов графика для визуализации данных. Он использовался нами для демонстрации возможностей 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”.
Книга: Линейная алгебра на Python
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas.  Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

Поделиться
Share on VK
VK
Tweet about this on Twitter
Twitter
Share on Facebook
Facebook

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *