Работа с хребтами (ridge plot) в Seaborn
Введение
Визуализация данных является важной частью анализа данных, помогая нам лучше понять данные, выявлять закономерности и тенденции. Среди многих инструментов визуализации данных библиотека seaborn пользуется популярностью благодаря относительной простоте в использовании и настройке достаточно красивых и информативных графиков.
В этой статье рассматривается вопрос касающийся использования библиотеки seaborn для создания красивых графиков хребтов (ridge plot) и разъясняется их использование, а также показана гибкость библиотеки с помощью демонстрации кода.
Инициализация наборов данных и графиков
Первым нашим действием будет вызов необходимых библиотек numpy, pandas, seaborn и matplotlib.pyplot. В этом примере используется случайный набор данных. В приведенном ниже коде мы используем numpy для генерации 500 случайных чисел и присваиваем каждой точке данных маркер категории от A до J, образуя набор данных df.
# Импорт необходимых библиотек
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Установка стиля темы и прозрачности фона графиков Seaborn
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
# Создание набора данных df
rs = np.random.RandomState(1979)
x = rs.randn(500)
g = np.tile(list("ABCDEFGHIJ"), 50)
df = pd.DataFrame(dict(x=x, g=g))
m = df.g.map(ord)
df["x"] += m
Нарисовать графики хребта
На следующем шаге воспользуемся библиотекой Seaborn для составления графиков хребта. Код для вывода графика выглядит следующим образом:
# Инициализация объекта FacetGrid
# Используйте cubehelix_palette для создания цветовой палитры
pal = sns.cubehelix_palette(10, rot=-.25, light=.7)
g = sns.FacetGrid(df, row="g", hue="g", aspect=15, height=.5, palette=pal)
# Составление графиков в несколько этапов
g.map(sns.kdeplot, "x",
bw_adjust=.5, clip_on=False,
fill=True, alpha=1, linewidth=1.5)
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw_adjust=.5)
Этот код использует объект FacetGrid для группировки данных по маркерам категорий путем указания группировки строк и сопоставления цветов, а также создает цветовую палитру с помощью cubehelix_palette. Результат исполнения кода представлен на рисунке 1.
Рисунок 1
Добавим горизонтальные (направляющие) линии и улучшить маркеры
Как видно Рисунок 1 выглядит немного небрежно. Попробуем поиграться с настройками и подучить более приятный вид графиков. Чтобы увеличить объем информации в диаграмме, мы добавляем горизонтальные (направляющие) линии для каждого хребта и маркеры.
# Передайте в функции refline() значение color=None, чтобы использовать цветовое отображение
g.refline(y=0, linewidth=2, linestyle="-", color=None, clip_on=False)
# Определение и использование простой функции для маркировки графиков на осях
def label(x, color, label):
ax = plt.gca()
ax.text(0, .2, label, fontweight="bold", color="black",
ha="left", va="center", transform=ax.transAxes)
g.map(label, "x")
Эта часть кода рисует горизонтальную линию с помощью функции refline и определяет пользовательскую функцию label для добавления маркера на диаграмме изображены A, B, C… В результате график имеет вид представленный на Рисунке 2.
Рисунок 2
Оптимизация внешнего вида и форматирования графиков
Как видно из Рисунка 2 графики до сих пор выглядят нечитабельный. Далее, давайте немного оптимизируем отображение, чтобы сделать его более красивым. Попробуем внести следующие улучшения:
# Настройка перекрытия между хребтами
g.figure.subplots_adjust(hspace=-.25)
# Удаление деталей осей, несовместимых с перекрытием
g.set_titles("")
g.set(yticks=[], ylabel="")
g.despine(bottom=True, left=True)
Эта часть кода делает внешний вид графиков более наглядным (Рисунок 3), корректируя вертикальное расстояние между хребтами, удаляя заголовки и шкалы (числа) оси y, а также лишние детали оси.
Рисунок 3
Изменение наборов данных
Читатели могут заменить выборочный набор данных своим собственным набором данных. Убедитесь, что ваш набор данных относится к типу pandas DataFrame и содержит как минимум два столбца данных: «x» и «g». Столбец «x» обозначает числовые данные, для которых должна быть составлена карта хребта, а столбце «g» содержит метки категории. При замене наборов данных убедитесь, что набор данных присвоен переменной df.
Настройка стиля и цвета иконок
Функция cubehelix_palette используется в коде для создания цветовой палитры pal для раскрашивания. Эта функция принимает несколько параметров, и настраивая эти параметры, вы можете изменить цвет и стиль диаграммы. Например, измените параметр rot, чтобы отрегулировать угол поворота цвета (происходит вращение колеса оттенков по всему диапазону палитры), и измените параметр light, чтобы отрегулировать яркость цвета.
# Настройка стиля цветовой палитры
pal = sns.cubehelix_palette(10, rot=-.75, light=.9)
Еще некоторые изменение в параметрах графика хребта
При построении карты хребта можно настроить параметры bw_adjust, изменяя ширину полосы пропускания (подобно ширине ячейки гистограммы, использование неправильной полосы пропускания может привести к искажению представления) и, таким образом, корректируя степень гладкости графика хребта. Большая полоса пропускания приводит к более плавному графику гребня, в то время как меньшая полоса пропускания увеличивает детализацию и колебания.
# Настройка параметров полосы пропускания
g.map(sns.kdeplot, "x",
bw_adjust=0.2, clip_on=False,
fill=True, alpha=0.7, linewidth=1.5)
Добавить легенду
Если набор данных содержит несколько категорий, вы можете сделать диаграмму более интуитивно понятной, добавив легенду для идентификации каждой категории. Измените параметр hue во время инициализации FacetGrid на соответствующее имя столбца категории в наборе данных.
# Добавьте легенду, предполагая, что в наборе данных есть столбец "Категория", имеющий метки категорий
g = sns.FacetGrid(df, row="g", hue="Category", aspect=15, height=.5, palette=pal)
Настройка стиля
При необходимости можно изменить положение, шрифт, цвет и другие параметры маркера. В функции label измените параметры ax.text, чтобы настроить положение и внешний вид маркера.
# Нанесите метки на график по осям, предполагая, что положение метки скорректировано на 0,1, 0,8
def label(x, color, label):
ax = plt.gca()
ax.text(0.1, 0.8, label, fontweight="bold", color="black",
ha="left", va="center", transform=ax.transAxes)
g.map(label, "x")