Визуализация является неотъемлемой частью науки о данных. Крайне важно использовать ее на всех этапах обработки данных  —  от исследовательского анализа до получения результатов.

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

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

В этой статье мы рассмотрим 3 функции Matplotlib, которые позволяют настраивать графики, повышая их информативность и привлекательность.

В конечном счете, форма представления так же важна, как и содержимое.

Образцы наборов данных о продажах и скидках можно загрузить из репозитория Github. Вы можете использовать любой набор, а для этой статьи мы выберем sales_vs_discount.csv.

Начнем с импорта библиотек и чтения набора данных. Сначала создадим фрейм данных Pandas, прочитав csv-файл.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("sales_vs_discount.csv")

df.head()
Изображение автора

Для анализа данных временных рядов почти всегда используются линейные графики. Вот простой линейный график, который показывает, как суммы продаж меняются с течением времени.

df["date"] = df["date"].astype("datetime64[ns]")

plt.figure(figsize=(12,6))
plt.plot(df["date"], df["sales_amount"])
Изображение автора

Примечание: при построении графика зависимости количества от времени лучше иметь информацию о времени с соответствующим типом данных. В данном файле типом данных столбца даты был “объект”. В первой строке он был изменен на “datetime” (“дата-время”).


Исходя из пиков ежедневных объемов продаж, можно предположить, что они вызваны скидками. Подтвердить это поможет построение визуализации, отражающей как суммы продаж, так и показатели скидок. Если линии, отображающие эти данные, совпадут, значит, предположение верно.

Построим их на одном графике, как показано ниже:

plt.figure(figsize=(12,6))
plt.plot(df["date"], df["sales_amount"])
plt.plot(df["date"], df["discount"])
Изображение автора

Помещаем суммы продаж и скидки в одну визуализацию. Однако такое изображение ни о чем не говорит. Дело в том, что диапазоны значений слишком разные. Скидки изменяются от 0 до 1, в то время как суммы продаж находятся на уровне тысяч.

Решить эту проблему можно, добавив вторичную ось.


Добавление вторичной оси y

Создать несколько осей, в частности добавить вторичную ось y, можно с помощью функции twinx.

fig, ax1 = plt.subplots(figsize=(12,6))
ax2 = ax1.twinx()

ax1.plot(df["date"], df["sales_amount"])
ax2.plot(df["date"], df["discount"], color="r")

ax1.set_ylabel("sales amount", fontsize=18)
ax1.set_ylim([0,6000])

ax2.set_ylabel("discount rate", fontsize=18)
ax2.set_ylim([0,1])

Рассмотрим этот код построчно, чтобы понять, что происходит на каждом шагу.

  • Строка 1: создаем объект Figure и Axes (Фигура и Оси). Объект Figure выполняет роль контейнера для хранения всех частей изображения. Мы можем поместить несколько объектов Axes в Figure.
  • Строка 2: создаем второй объект Axes со вторичной осью y.
  • Строки 3–4: создаем линейные графики на объектах Axes.
  • Оставшаяся часть кода создает метки для оси y и настраивает диапазоны значений.
Изображение автора

Сейчас график выглядит намного лучше. Мы ясно видим, как скидка положительно влияет на объемы продаж.


Xticks и yticks

Эта функция предназначена для того, чтобы сделать визуализацию более привлекательной. Matplotlib позволяет изменять значения xticks и yticks, а также то, как они отображаются.

plt.figure(figsize=(12,6))

plt.plot(df["date"], df["sales_amount"])

plt.xticks(fontsize=14, rotation=45)
plt.yticks(ticks=np.arange(0,6000,500), fontsize=14)

plt.ylabel("Sales Amount", fontsize=18)
  • Строка 1: создаем объект Figure. Размер изображения задается с помощью параметра figsize.
  • Строка 2: создаем линейный график.
  • Строка 3: изменяем размер шрифта xticks и поворачиваем его на 45 градусов. 
  • Строка 4: меняем значения тиков. Теперь тик есть на каждой отметке 500, который раньше был только на отметках тысяч.
  • В последней строке добавляется метка для оси y.

Вот график, созданный приведенным выше фрагментом кода.

Изображение автора

Примечание: вероятно, вы заметили, что в предыдущем примере мы использовали функцию set_ylabel. При работе с объектами Figure эти функции не начинаются с set, например ylabel, xlabel, ylim и так далее. Однако при выполнении настроек на объектах Axes эти функции начинаются с set, например set_ylabel, set_xlabel, set_ylim и так далее.


Создание сетки подграфиков в одном окне

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

Вспомните визуализацию, созданную ранее и отражающую как показатели скидок, так и суммы продаж. Другой версией такой визуализации может быть наложение двух линейных графиков друг на друга. Наличие у них общей оси x позволит увидеть влияние скидки на сумму продаж.

Для создания сетки подграфиков можно использовать функцию subplots. Параметры nrows и ncols определяют количество подграфиков и их расположение.

Так, nrows=2 и ncols=2 создают сетку, которая выглядит следующим образом:

Изображение автора

У нас будет два подграфика, расположенных друг над другом. Таким образом, нужно установить nrows=2 и ncols=1.

fig, (ax1, ax2) = plt.subplots(
   nrows=2, ncols=1, sharex=True, figsize=(12,6)
)

fig.tight_layout(pad=2)

ax1.plot(df["date"], df["sales_amount"])
ax2.plot(df["date"], df["discount"])

ax1.set_ylabel("Sales", fontsize=18)
ax2.set_ylabel("Discount", fontsize=18)

Если ось x является общей, можно задать параметр sharex как true, чтобы ось x отображалась только внизу. В противном случае под каждым подграфиком будет ось x.

Функция tight_layout используется для создания пространства между подграфиками. Это предотвращает их наложение друг на друга.

Вот сетка из двух подграфиков.

Изображение автора

Примечание: в этом примере мы явно определяем имена подграфиков, передавая их в кортеж.

  • (ax1, ax2)

Можно также определять подграфики с помощью индексов.

  • axs, axs[0], axs[1] и так далее.

Приведенный ниже код создает ту же визуализацию, что указана выше.

fig, axs = plt.subplots(
   nrows=2, ncols=1, sharex=True, figsize=(12,6)
)

fig.tight_layout(pad=2)

axs[0].plot(df["date"], df["sales_amount"])
axs[1].plot(df["date"], df["discount"])

axs[0].set_ylabel("Sales", fontsize=18)
axs[1].set_ylabel("Discount", fontsize=18)

Заключение

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

Создавать и использовать визуализации данных очень важно. Но гораздо важнее сделать их понятными и лаконичными для других. Приведенные в этой статье примеры помогут вам в этом.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Soner Yıldırım: 3 Features of Python Matplotlib That Make Data Visualizations More Appealing and Informative

Предыдущая статьяWebSocket для получения автоматически обновляющихся криптографических данных
Следующая статьяСоздание рекомендательного движка статей на основе ИИ/МО