Зарегистрируйтесь, чтобы продолжить обучение

Модуль Pyplot Python: Визуализация данных

Модуль Pyplot — это часть библиотеки Matplotlib, которая помогает создавать графики, диаграммы, линии, оси и другие визуальные объекты. Он позволяет гибко конфигурировать параметры отображения и создавать холсты с множеством областей визуализации.

В этом уроке мы познакомимся с практическими примерами использования модуля Pyplot:

  • Типами данных, с использованием которых можно строить графики и диаграммы
  • Доступными типами графиков и диаграмм
  • Параметрами конфигурации и настройки линий, подписей, меток
  • Методами создания нескольких областей визуализации на одном холсте и их настройкой

Импорт модуля Pyplot и построение простого графика

Чтобы использовать модуль Pyplot, импортируем его:

import matplotlib.pyplot as plt

Сокращение plt принято в среде разработчиков. Рекомендуется придерживаться его. Начнем с базового примера — линейного графика. В качестве аргумента по оси x и зависимой переменной по оси y используются соответствующие списки:

x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y)
plt.show()

align=center

Чтобы построить график, мы воспользовались методом самого модуля plt. Для более сложной настройки используют метод plt.subplots(), который возвращает объекты холста (Figure) и области визуализации (Axes). На холсте может располагаться несколько областей визуализации или одна, как в примере ниже:

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

align=center

Добавим на холст название, подписи осей, координатную сетку и название графика:

fig, ax = plt.subplots()
fig.set_size_inches(5, 3)
fig.suptitle("Polynomial", fontsize=12)

ax.plot(x, y, label="Square")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.grid()
ax.legend()

plt.show()

align=center

Мы рассмотрели примеры на простом линейном графике. При этом Pyplot поддерживает широкий спектр графиков для работы с разными типами данных.

Использование различных типов данных

Для работы с большими объемами данных и быстрыми вычислениями над ними в Python используются библиотеки Numpy и Pandas. Импортируем их, чтобы использовать массивы numpy.ndarray и pandas.DataFrame:

import numpy as np
import pandas as pd

Преобразуем исходные списки значений в массивы:

np_x = np.array(x)
np_y = np.array(y)

print(np_x)
print(type(np_x))
# [0 1 2 3 4 5]
# <class 'numpy.ndarray'>

В выводе выше видно, что значения остались прежними, но при этом тип изменился со списка на numpy.ndarray. Модуль Pyplot может работать с этими массивами без каких-либо дополнительных преобразований:

# 4
fig, ax = plt.subplots()
fig.set_size_inches(5, 3)
fig.suptitle("Polynomial from numpy array", fontsize=12)

ax.plot(np_x, np_y, label="Square")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.grid()
ax.legend()

plt.show()

align=center

В примере выше мы передали массивы в функцию plt.plot() по аналогии со списками значений. Если значения для визуализации записаны в словарь, то правила их передачи в графики меняются. Для примера запишем исходные данные в словарь data:

data = {"x_values": x, "y_values": y}

print(data)
# {
#   'x_values': [0, 1, 2, 3, 4, 5],
#   'y_values': [0, 1, 4, 9, 16, 25]
# }

Чтобы передать значения словаря в метод plot(), укажем в нужном порядке ключи для используемых данных. Также обратим внимание на параметр data метода plot() и укажем в нем наш источник данных. В нашем случае это одноименный словарь data:

# 5
fig, ax = plt.subplots()
fig.set_size_inches(5, 3)
fig.suptitle("Polynomial from data dict", fontsize=12)

ax.plot("x_values", "y_values", data=data, label="Square")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.grid()
ax.legend()

plt.show()

align=center

Если вы работаете с табличными данными в формате pandas.DataFrame, визуализация работает по аналогии с данными, представленными в формате словаря. Для примера инициализируем массив pandas со значениями словаря data:

dataframe = pd.DataFrame(data)
print(dataframe)
#    x_values  y_values
# 0         0         0
# 1         1         1
# 2         2         4
# 3         3         9
# 4         4        16
# 5         5        25

Чтобы построить график, укажем соответствующие названия столбцов, а в параметр data передадим объект dataframe:

# 6
fig, ax = plt.subplots()
fig.set_size_inches(5, 3)
fig.suptitle("Polynomial from DataFrame", fontsize=12)

ax.plot("x_values", "y_values", data=dataframe, label="Square")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.grid()
ax.legend()

plt.show()

align=center

Мы рассмотрели различные типы данных, которые можно передавать в методы визуализации Pyplot. Далее рассмотрим наиболее часто популярные типы графиков.

Типы графиков и диаграмм

Один из базовых графиков — линейный, с которым вы уже знакомы. Приведем пример визуализации затухающих колебаний:

# 7
x = np.linspace(0, 6, 100)
y = np.exp(-x) * np.sin(10 * x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.grid()

plt.show()

align=center

Чтобы настроить формы и размеры линий и точек на графиках используем такие параметры:

  • color — цвет
  • marker — форма маркеров, точки по которым строится график
  • linestyle — стиль линий, в примере ниже используется пунктир
  • linewidth — ширина линии
  • markersize — размер маркеров

Доработаем предыдущий график с этими параметрами:

# 8
x = np.linspace(0, 6, 100)
y = np.exp(-x) * np.sin(10 * x)

fig, ax = plt.subplots()
ax.plot(x, y, color="green", marker="o", linestyle="dashed", linewidth=1, markersize=5)
ax.grid()

plt.show()

align=center

Чтобы представить данные в виде столбчатой диаграммы, воспользуемся методом bar(). Рассмотрим пример использования этого метода с настройками:

  • width — ширина столбца
  • color — его цвет
  • edgecolor — цвет границы столбца
  • align — выравнивание относительно значений по оси x, в примере ниже столбец будет располагаться по центру относительно метки оси
# 9
x = np.arange(0, 10)
y = x**2 - 2 * x + 5

# plot
fig, ax = plt.subplots()
ax.bar(x, y, width=1, color="green", edgecolor="white", align="center")
ax.grid()

plt.show()

align=center

В примерах выше мы рассмотрели ситуации, когда одному значению x соответствует единственное значение y — график не возвращается при отрисовке. Но в данных не всегда есть взаимооднозначное соответствие. В таких ситуациях мы не строим график, а просто наносим множество точек на область визуализации. Для этого используется метод scatter():

# 10
np.random.seed(3)
x = np.arange(0, 100)
y = x + np.random.normal(0, 10, len(x))

fig, ax = plt.subplots()

ax.scatter(x, y, color="green")
ax.grid()

plt.show()

align=center

Если для каждой точки на плоскости существует числовое значение, которое ее характеризует, можно визуализировать данные методом scatter(). В примере ниже для точек плоскости с координатами x и y есть значение s, равное сумме координат. Передавая все три массива в метод scatter(), точки отрисовываются с диаметром, который соответствует значению s. Чем больше значение, тем больше точка:

# 11
x = np.arange(0, 100)
y = x + np.random.normal(0, 10, len(x))
s = x + y

fig, ax = plt.subplots()

ax.scatter(x, y, s)
ax.grid()

plt.show()

align=center

Помимо работы с зависимостями и точками Pyplot поддерживает визуализацию изображений в черно-белом формате. Данный формат представляет изображение в виде таблицы, в каждой ячейки которой стоит значения светимости от 0 до 255. Значение 0 соответствует черному цвету, а значение 255 — белому. Все промежуточные значения представляют всевозможные оттенки серого.

В качестве практического примера рассмотрим изображения, доступные в модуле datasets библиотеки для машинного обучения Sklearn. Каждая картинка — это рукописная цифра, представленная таблицей размером 8 на 8. Импортируем нужные модули и выведем на экран размер и пиксельные значения одной из картинок:

from sklearn.datasets import load_digits

digits = load_digits()
image = digits.images[0]
print(image.shape)
print(image)
# (8, 8)
# [[ 0.  0.  5. 13.  9.  1.  0.  0.]
#  [ 0.  0. 13. 15. 10. 15.  5.  0.]
#  [ 0.  3. 15.  2.  0. 11.  8.  0.]
#  [ 0.  4. 12.  0.  0.  8.  8.  0.]
#  [ 0.  5.  8.  0.  0.  9.  8.  0.]
#  [ 0.  4. 11.  0.  1. 12.  7.  0.]
#  [ 0.  2. 14.  5. 10. 12.  0.  0.]
#  [ 0.  0.  6. 13. 10.  0.  0.  0.]]

Для визуализации черно-белой картинки используется метод imshow():

# 12
fig, ax = plt.subplots()

ax.imshow(image)
plt.show()

align=center

Как правило, координатные оси не несут какой-либо полезной информации, поэтому их отключают при отрисовки. Для этого в параметрах объекта визуализации Axes используют метод set_visible() для нужной оси. Для использования нужной оси требуется обратиться к методу get_xaxis() или get_yaxis():

# 13
fig, ax = plt.subplots()

ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
ax.imshow(image)
plt.show()

align=center

Мы рассмотрели базовые и наиболее употребимые на практике типы графиков. Вне нашего внимания остались графики для статистического анализа данных, но это выходит за рамки данного урока. Пример выше показывает, что видимые объекты на холсте можно гибко конфигурировать. Эти объекты называются Artists. Далее рассмотрим некоторые подходы по работе с ними.

Конфигурирование объектов визуализации на графиках и диаграммах

Мы уже умеем настраивать типы линий, столбцов и точек на графиках. Также вставлять подписи к ним и скрывать координатные оси. Но если оси нужны, то для читаемости графика необходимо качественно настроить подписи к ним и метки соответствующих значений. Метки в Matplotlib конфигурируются с использованием модуля ticker. Его метод MultipleLocator() позволяет указывать подписи с нужной периодичностью.

В примере ниже мы настроим метки major и minor с периодичностью значений 2 и 0,5 соответственно. Для настройки длины метки воспользуемся методом tick_params() с нужным параметром length. Дополним пример затухающих колебаний настройками визуализации:

# 14
from matplotlib.ticker import MultipleLocator

x = np.linspace(0, 6, 100)
y = np.exp(-x) * np.sin(10 * x)

fig, ax = plt.subplots()
ax.set_title("All artists on a figure")
ax.plot(x, y, label="Damped vibrations")

ax.xaxis.set_major_locator(MultipleLocator(2))
ax.xaxis.set_major_formatter("{x:.0f}")

ax.xaxis.set_minor_locator(MultipleLocator(0.5))
ax.xaxis.set_minor_formatter("{x:.1f}")

ax.tick_params(which="major", length=7)
ax.tick_params(
    which="minor",
    length=4,
)

ax.grid(which="major", color="gray", linewidth=1)
ax.grid(which="minor", color="gray", linewidth=0.5)

ax.set_xlabel("x")
ax.set_ylabel("y")

plt.show()

align=center

Помимо настроек методов мы нанесли решетку методом grid(). Она существенно упрощает оценку значений точек на графике, если они расположены далеко от координатных осей. Дополнительно сделали более толстые линии для major-значений и узкие для minor.

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

В случае нескольких областей визуализации каждая из них конфигурируется по отдельности рассмотренными выше примерами. Перейдем к примеру.

Создание нескольких областей на одном холсте

На холсте ниже мы построим четыре графика, с которыми ранее уже встречались. Расположим графики по сетке размера 2 на 2, указав эти значения в методе subplots().

Каждая из четырех областей визуализации будет настраиваться с использованием нужного объекта axes. Так для настройки левого верхнего графика необходимо работать с axes[0][0], а с левым нижним — axes[0][1]. Первый индекс указывает на номер строки, а второй — на номер столбца в сетке на холсте. Нумерация идет слева направо и сверху вниз:

# 15
fig, axes = plt.subplots(2, 2)
fig.set_size_inches(12, 6)
fig.suptitle("Subplots example", fontsize=12)

x = np.linspace(0, 6, 100)
y = np.exp(-x) * np.sin(10 * x)
axes[0][0].plot(
    x, y, color="green", marker="o", linestyle="dashed", linewidth=1, markersize=5
)
axes[0][0].grid()

x = np.arange(0, 10)
y = x**2 - 2 * x + 5
axes[0][1].bar(x, y, width=1, color="green", edgecolor="white", align="center")
axes[0][1].grid()

x = np.arange(0, 100)
y = x + np.random.normal(0, 10, len(x))
s = x + y
axes[1][0].scatter(x, y, s)
axes[1][0].grid()

axes[1][1].imshow(image)
axes[1][1].get_xaxis().set_visible(False)
axes[1][1].get_yaxis().set_visible(False)

plt.show()

align=center

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

Выводы

В этом уроке мы на практических примерах разобрали основной перечень методов визуализации данных с использованием модуля Pyplot библиотеки Matplotlib. Мы познакомились с типами данных и графических представлений, которые поддерживают данный модуль. С использованием настроек конфигурации создали холст с несколькими областями визуализации и по отдельности их настроили.

Рассмотренный перечень приемов удовлетворяет большинство потребностей при аналитической работе и формированию отчетов о ней. Однако в некоторых случаях требуются более сложные инструменты и тонкие настройки, о которых можно узнать из документации Matplotlib.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff