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.


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.
А мы поможем вам прокачать навыки или с самого начала освоить профессию, востребованную в любое время.
Выбрать другую востребованную профессию.
