Как рисовать диаграммы в Seaborn

от автора

10 типов диаграмм, о которых вы должны знать

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


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

Seaborn — это лаконичный интерфейс к Matplotlib для создания и оформления статистических диаграмм из наборов данных Pandas. Читая эту статью, лучше иметь общее представление о figure, axes и axis Matplotlib.

Для примера воспользуемся набором данных об автомобилях от Kaggle под лицензией Open database. Код ниже импортирует необходимые библиотеки, устанавливает стиль и загружает набор данных.

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns sns.set_style('darkgrid') sns.set(font_scale=1.3) cars = pd.read_csv('edited_cars.csv')

Элементы Seaborn делятся на две группы: оси и диаграммы.

  • Оси имитируют Matplotlib и с помощью параметра ax могут объединяться в поддиаграммы. Они возвращают объект axes и используют обычные функции стилизации Matplotlib.

  • Диаграммы управляют диаграммой, создать можно только диаграммы с какими-то значениями и связанные поддиаграммы. Они не поддерживают параметр ax и возвращают объекты FacetGrid, PairGrid или JointGrid. Используют разные стили и кастомизацию входных данных.

Изучение отношений между числовыми столбцами

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


1. Парные диаграммы

Pairplot для сравнения распределения пар числовых переменных создаёт сетку точечных диаграмм. Он также содержит гистограмму для каждой функции в диагональных прямоугольниках.

Описание в документации

# Функции: sns.pairplot()  # диаргамма.

Код примера:

sns.pairplot(cars);

Стоит обратить внимание на:

  • Диаграммы рассеяния, показывающие положительные линейные отношения (когда x увеличивается, увеличивается y), либо отрицательные (когда x увеличивается, y уменьшается).

  • Гистограммы в диагональных прямоугольниках, показывающие распределение конкретных признаков.

На парной диаграмме обведённые диаграммы показывают очевидную линейную зависимость. Диагональ указывает на гистограммы каждого признака; левый треугольник парной диаграммы — зеркальное отражение правого треугольника.

Ещё пример:

sns.pairplot(     data=cars,      aspect=.85,     hue='transmission'); # hue='cat_col' подсвечивает указанную категорию другим цветом.
Стоит обратить внимание на кластеры разных цветов на точечных диаграммах
Стоит обратить внимание на кластеры разных цветов на точечных диаграммах

2. Тепловая карта

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

Описание в документации

# Функции: sns.heatmap() # оси.

Пример:

# Сначала запускаем df.corr(), чтобы получить таблицу коэффициентов корреляции: cars.corr()

Эту таблицу называют матрицей корреляций. Эта таблица не очень понятна, поэтому с помощью sns.heatmap() отрисуем тепловую карту:

sns.set(font_scale=1.15) plt.figure(figsize=(8,4)) sns.heatmap(     cars.corr(),             cmap='RdBu_r', # задаёт цветовую схему     annot=True, # рисует значения внутри ячеек     vmin=-1, vmax=1); # указывает начало цветовых кодов от -1 до 1.
Стоит обратить внимание на признаки с высокой корреляцией — тёмно-красные и тёмно-синие клетки. Близость к единице означает сильно выраженную положительную линейную зависимость, а близость к -1 — сильно выраженную отрицательную зависимость
Стоит обратить внимание на признаки с высокой корреляцией — тёмно-красные и тёмно-синие клетки. Близость к единице означает сильно выраженную положительную линейную зависимость, а близость к -1 — сильно выраженную отрицательную зависимость

3. Диаграмма рассеяния

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

Описание в документации.

# Функции: sns.scatterplot() # оси. sns.relplot(kind='line')  # диаргамма. # Функции с линией регрессии: sns.regplot() # оси. sns.lmplot() # диаргамма.

Пример:

# Покажем объём двигателя и пробег автомобиля с помощью sns.scatterplot(x='num_col1', y='num_col2', data=df) sns.set(font_scale=1.3) sns.scatterplot(     x='engine_cc',      y='mileage_kmpl',      data=cars) plt.xlabel(     'Engine size in CC') plt.ylabel(     'Fuel efficiency') 

Описание в документации.

Функция regplot рисует диаграмму рассеяния с линией регрессии, показывающей тенденцию в данных.

Код:

sns.regplot(     x='engine_cc',      y='mileage_kmpl',      data=cars) plt.xlabel(     'Engine size in CC') plt.ylabel(     'Fuel efficiency') 

Описание в документации.

Код:

sns.scatterplot(     x='mileage_kmpl',     y='engine_cc',      data=cars,     palette='bright',     hue='fuel'); # подсвечивает указанную категорию другим цветом

Описание в документации.

Диаграмма отношений relplot используется для создания диаграммы рассеяния с помощью kind=’scatter’ (установленного по умолчанию), или линейной диаграммы (kind=’line’). Для разделения по цвету в kind=’scatter’ используется hue=’cat_col’.

Код примера:

sns.relplot(     x='mileage_kmpl',      y='engine_cc',      data=cars,      palette='bright',     kind='scatter',      hue='fuel');

Обратите внимание, что две диаграммы выше аналогичны.

sns.relplot(x, y, data, kind='scatter', col='cat_col') # можно создавать поддиаграммы сегментов по столбцам, используя col='cat_col' и/или по строкам с помощью row='cat_col'ыки.

Другой пример:

sns.relplot(     x='year',      y='selling_price',      data=cars,      kind='scatter',      col='transmission'); # данные разбиты на разные диаграммы по типу передачи автомобиля 

Описание в документации.

sns.relplot(x,y,data, hue='cat_col1', col='cat_col2') #

Код примера:

sns.relplot(     x='year',      y='selling_price',      data=cars,     palette='bright',     height=3, aspect=1.3,     kind='scatter',      hue='transmission',     col='fuel',     col_wrap=2); # указывает количество столбцов для измерений в одной визуализации

Описание в документации. lmplot — разновидность regplot на уровне диаграммы: она рисует диаграмму рассеяния с линией регрессии на FacetGrid. Параметра kind у implot нет.

Код примера:

sns.lmplot(     x="seats",      y="engine_cc",      data=cars,     palette='bright',     col="transmission",      hue="fuel");

4. Линейный график

Линейный график состоит из точек, соединённых линией, которая показывает связь между переменными x и y. Ось x обычно содержит временные интервалы, ось y — числовую переменную, изменения которой во времени нужно отследить.

Описание в документации.

# Функции: sns.lineplot() # оси. sns.relplot(kind='line') # диаргамма.

Код примера:

sns.lineplot(     x="year",      y="selling_price",     data=cars)

Другой пример:

sns.lineplot(     x="year",      y="selling_price",     data=cars,     palette='bright',     hue='fuel');

Ещё пример:

sns.relplot(     x="year",      y="selling_price",     data=cars,     color='blue', height=4     kind='line', # строит линейный график     col='transmission'); # рисует график отношений двух классов 'transmission'. 
# Подобные диаграммы можно получить, используя kind='line' и hue: sns.relplot(     x="year",      y="selling_price",      data=cars,     palette='bright',      height=4,     kind='line',      col='transmission',     hue="fuel");

5. Сводная диаграмма

Состоит из трёх диаграмм в одной. Центр содержит бивариантную зависимость между переменными x и y. На диаграммах сверху и справа показано одномерное распределение переменных по осям x и у соответственно.

Описание в документации.

# Функции: sns.jointplot()  # диаргамма. sns.jointplot(x='num_col1, y='num_col2, data=df)  # по умолчанию центральная диаграмма — это диаграмма рассеяния (kind='scatter')  # Боковые диаграммы — это гистограммы.

Код примера:

sns.jointplot(     x='max_power_bhp',      y='selling_price',      data=cars); 

Ещё пример:

sns.jointplot(     x='selling_price',      y='max_power_bhp',      data=cars,       palette='bright',     hue='transmission');

Изучение отношений между категориальными и числовыми данными

На следующих диаграммах ось x будет содержать категориальную переменную, а ось Y — числовую.


6. Гистограмма

Гистограмма использует столбцы разной высоты для сравнения распределения числовой переменной между группами категориальной переменной. По умолчанию высота столбца оценивается с помощью «среднего»: параметр estimator изменяет эту функцию агрегирования с помощью встроенных функций Python, таких как estimator=max или len, или функций NumPy наподобие np.max и np.median.

Описание в документации.

# Функции: sns.barplot() # оси. sns.catplot(kind='bar') # диаргамма. 

Пример:

sns.barplot(     x='fuel',      y='selling_price',      data=cars,      color='blue',     # estimator=sum,     # estimator=np.median);

Ещё один пример:

sns.barplot(     x='fuel',      y='selling_price',      data=cars,      palette='bright'     hue='transmission');

Описание в документации.

sns.catplot(x, y, data, kind='bar', hue='cat_col')

Тип категориальной диаграммы указывается параметром kind, по умолчанию он равен ‘strip’. Допустимы значения 'swarm', 'box', 'violin', 'boxen', 'point' и 'bar'. Воспользуемся catplot для создания диаграммы, похожей на предыдущую.

Код примера:

sns.catplot(     x='fuel',      y='selling_price',      data=cars,     palette='bright',     kind='bar',     hue='transmission'); 

Пример гистограммы через catplot:

g = sns.catplot(         x='fuel',          y='selling_price',          data=cars,         palette='bright',         height=3, aspect=1.3,         kind='bar',         hue='transmission',          col ='seller_type',         col_wrap=2) # указывает количество столбцов для измерений, отображаемых в одной визуализации g.set_titles(     'Seller: {col_name}');

7. Точечная диаграмма

Вместо столбцов точечная диаграмма отображает точки, представляющие среднее значение (или другую оценку) каждой группы категорий. Точки соединяются линией, что упрощает сравнение изменений центральной тенденции переменной y для групп.

Описание в документации.

# Функции: sns.pointplot() # оси. sns.catplot(kind='point') # диаргамма. 

Код примера:

sns.pointplot(     x='seller_type',      y='mileage_kmpl',      data=cars); 

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

Точечная диаграмма с catplot:

sns.catplot(     x='transmission',      y='selling_price',      data=cars,      palette='bright',     kind='point', # точечная диаграмма     hue='seller_type'); # Ту же диаграмму можно получить, используя sns.paitplot и параметр hue.

Другой пример:

sns.catplot(     x='fuel',      y='year',      data=cars,      ci=None,       height=5, # по умолчанию      aspect=.8,     kind='point',     # В hue и col указана одна и та же категория     hue='owner',      col='owner',      col_wrap=3);

8. Ящик с усами

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

На диаграммах видно наименьшее значение, медиану, наибольшее значение и выбросы для каждого класса категорий.

# Функции: sns.boxplot() # оси. sns.catplot(kind='box') # диаргамма.

Код примера:

sns.boxplot(x='cat_col', y='num_col', data=df) sns.boxplot(     x='owner',      y='engine_cc',      data=cars,      color='blue') plt.xticks(rotation=45,             ha='right');

Описание в документации.

Ещё один пример:

sns.boxplot(     x='fuel',      y='max_power_bhp',      data=cars,     palette='bright',     hue='transmission'); 

То же через catplot:

sns.catplot(     x='fuel',      y='max_power_bhp',     data=cars,     palette='bright',     kind = 'box', # используйте catplot с kind='box'     col='transmission'); # для создания поддиаграмм укажите параметр col

Пример с catplot сложнее:

g = sns.catplot(         x='owner',          y='year',          data=cars,         palette='bright',         height=3, aspect=1.5,         kind='box',          hue='transmission',          col='fuel',         col_wrap=2) g.set_titles(     'Fuel: {col_name}'); g.set_xticklabels(     rotation=45, ha='right') 

9. Скрипичная диаграмма

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

Описание в документации.

# Функции: sns.violinplot() # оси. sns.catplot(kind='violin') # диаргамма.

Код примера:

sns.violinplot(x='cat_col', y='num_col', data=df) sns.violinplot(     x='transmission',      y='engine_cc',      data=cars,      color='blue'); 

Другой пример с catplot:

g = sns.catplot(         x='owner',          y='year',          data=cars,         palette='bright',         height=3,         aspect=2         split=False,          # split=True рисует половину диаграммы для каждого категориального класса.         # Это работает, когда переменная hue имеет только два класса.         # Смотрите ниже         kind='violin',          hue='transmission') g.set_xticklabels(         rotation=45,          ha='right') # Тот же результат можно получить через sns.violinplot c параметром hue

Фильтрация по двум классам через catplot:

# Здесь рассматриваем данные только для 'diesel' и 'patrol': my_df = cars[cars['fuel'].isin(['Diesel','Petrol'])] g = sns.catplot(          x="owner",          y="engine_cc",          data=my_df,         palette='bright',         kind = 'violin',          hue="transmission",         col = 'fuel') g.set_xticklabels(         rotation=90); 

10. Одномерная диаграмма рассеяния

Точки этой диаграммы показывают, как числовая переменная распределяется между классами категориальной переменной. Её можно представить как точечную диаграмму, где одна из осей отражает признак в данных.

Описание в документации.

# Функции: sns.stripplot() # оси. sns.catplot(kind='strip') # диаргамма.  

Код примера:

sns.stripplot(x='cat_col', y='num_col', data=df) plt.figure(     figsize=(12, 6)) sns.stripplot(     x='year',      y='km_driven',      data=cars,      linewidth=.5,      color='blue') plt.xticks(rotation=90); 

Пример через catplot:

sns.catplot(     # kind='strip' по умолчанию     x='seats',      y='km_driven',      data=cars,      palette='bright',      height=3,     aspect=2.5,     # Аргумент dodge=True (по умолчанию dodge='False') делит вертикальную линию точек по цвету     kind='strip',     hue='transmission');

Ещё один пример с catplot:

g = sns.catplot(         x="seller_type",          y="year",          data=cars,          palette='bright',          height=3, aspect=1.6,         kind='strip',           hue='owner',         col='fuel',         col_wrap=2) g.set_xticklabels(         rotation=45,          ha='right');

Комбинация одномерной диаграммы рассеяния и скрипичной диаграммы

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

Пример с catplot:

g = sns.catplot(         x='seats',          y='mileage_kmpl',          data=cars,         palette='bright',         aspect=2,         inner=None,         kind='violin') sns.stripplot(     x='seats',      y='mileage_kmpl',      data=cars,     color='k',      linewidth=0.2,     edgecolor='white',     ax=g.ax); 

Замечания

  • Столбцы категориальных диаграмм, таких как гистограммы и ящики с усами, можно сделать горизонтальными, поменяв местами переменные x и y.

  • Совместно используемые параметры row и col объектов уровня фигуры FacetGrid могут добавить измерение к поддиаграмм. Однако col_wrap не работает с row.

  • FacetGrid поддерживает различные параметры в зависимости от основной диаграммы. Например, sns.catplot(kind=’violin’) поддерживает параметр split, но другие ‘kind’ — не поддерживают его. Подробности о ‘kind’ смотрите в документации.

  • Функции уровня диаграммы создают и двумерные диаграммы. Например, sns.catplot(x=’fuel’, y=’mileage_cc’, data=cars, kind=’bar’) отобразит простую столбцовую диаграмму.

Заключение

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

Код вы найдёте на GitHub.

А мы поможем вам прокачать навыки или с самого начала освоить профессию, востребованную в любое время.

Выбрать другую востребованную профессию.


ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/664756/