3 функции Python Matplotlib: повысьте информативность визуализации данных



Книга 3 функции Python Matplotlib: повысьте информативность визуализации данных



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


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


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, которые позволяют делать визуализации более привлекательными и информативными.


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



544   0  

Comments

    Ничего не найдено.