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.

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

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

Комментарии (0)