Подробная информация о Violinplot и Relplot в Seaborn

Использование Violinplots и Relplots в Seaborn с полным потенциалом

Библиотека Python Seaborn — очень популярная библиотека визуализации. Он построен на Matplotlib и включает в себя множество расширенных графиков со встроенными стилями. У меня есть статья о Seaborn, в которой рассказывается о самых популярных сюжетах (ссылка дана в конце этой статьи). Решил сделать подробные туториалы по некоторым сюжетам.

В этой статье я сосредоточусь на двух очень распространенных сюжетах из библиотеки Seaborn:

  1. Сюжет для скрипки
  2. Перестроить

Начнем со скрипичного сюжета.

Сюжет для скрипки

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

import seaborn as sns
import matplotlib.pyplot as plt
pen = sns.load_dataset("penguins")

Я начну с самого простого скрипичного сюжета и постепенно перейду к более сложным.

Вот скрипичный сюжет body_mass:

sns.violinplot(data = pen, x = "body_mass_g")

Здесь вы можете сначала увидеть график плотности. Распределение правостороннее. На диаграмме в середине показаны медиана (маленькая белая точка посередине), первый квартиль, третий квартиль, минимум и максимум.

Для следующего графика я буду использовать категориальную переменную в направлении x и body_mass в направлении y. Я выбрал «остров» для направления x. В столбце «остров» есть три острова.

Мы получим три графика скрипки для body_mass пингвинов трех островов:

plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g")
plt.show()

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

Еще один шаг вперед, и мы можем даже перейти к более детализированному сюжету.

Используя параметр «оттенок», теперь мы будем разделять графики скрипки по полу:

plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g", hue ="sex")
plt.show()

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

Здесь я использую одну сторону для мужского населения и одну сторону скрипичного сюжета для женского населения:

plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g", hue ="sex", split=True)
plt.show()

Одним из недостатков этого графика является то, что вы получаете только один блок-график для всего населения острова. Когда у нас были отдельные графики скрипки для мужского и женского населения, у нас также были отдельные боксплоты.

Вместо диаграмм мы можем получить пунктирные линии, представляющие квартили:

plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g", hue ="sex", split=True, inner = "quartile")
plt.show()

Вместо диаграмм мы получили квартили, которые показывают первый, второй и третий квартили. Напомним, второй квартиль — это медиана. Итак, на этот раз мы получили отдельные линии квартилей для мужского и женского населения каждого острова.

Вместо квартилей мы также можем получить линии, представляющие точки данных, используя «палку» в качестве внутреннего параметра. Кроме того, у нас всегда были скрипичные сюжеты для островов в порядке по умолчанию: «Торгерсен», «Биско» и «мечта». Порядок также может быть изменен:

plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g", hue ="sex", split=True, inner = "stick", order=['Dream', 'Torgersen', 'Biscoe'])
plt.show()

Порядок островов изменен!

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

pen['special'] = pen['island'].isin(['Dream', 'Biscoe'])
plt.figure(figsize=(8, 6))
sns.violinplot(data = pen, x = 'island', y = "body_mass_g", hue = "special")
plt.show()

Смотри, скрипичные сюжеты для Biscoe и Dream окрашены в другой цвет!

Последний график на графике скрипки покажет использование опции Facet Grid Seaborn для построения графиков скрипки. Сам сюжет «Скрипка» такой привилегии не имеет.

Мы можем использовать «кошачий сюжет» и использовать «вид» как скрипку:

sns.catplot(data = pen, x = 'island', y = "body_mass_g", hue ="sex", split=True, inner = 'quartile', kind = 'violin', col = 'species', height = 5, aspect = 0.6)

У нас есть разные участки для разных видов. В Dream есть только Chinstrap, а в Biscoe только Gentoo.

Это все для скрипичного сюжета!

У меня также есть видеоурок, в котором пошагово показаны все эти сюжеты:

Перестроить

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

Для этого я буду использовать знаменитый «титанический» набор данных:

ti = sns.load_dataset('titanic')

Это столбцы этого набора данных:

ti.columns

Выход:

Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked', 'class', 'who', 'adult_male', 'deck', 'embark_town', 'alive', 'alone'], dtype='object')

Как обычно, я начну с самого простого повторного сюжета.

Начнем с самого простого графика, в котором используются две непрерывные переменные «возраст» и «плата за проезд»:

sns.relplot(data = ti, x = 'age', y = "fare")

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

Добавление параметра «оттенок», чтобы получить разные цвета для разных категорий:

sns.relplot(data = ti, x = 'age', y = "fare", hue = "alive")

Добавим к нему еще одну переменную.

Добавление переменной «pclass» в качестве «col», чтобы получить три отдельных графика для трех «pclass»:

sns.relplot(data = ti, x = 'age', y = "fare", hue = "alive",
           col = "pclass", height = 4, aspect = 0.8)

У нас есть три отдельных участка на три класса. Теперь давайте еще больше разделим данные.

Следующий график добавит строки для отдельных «embark_town»:

sns.relplot(data = ti, x = 'age', y = "fare", hue = "alive",
     col = "pclass", row = "embark_town",  height = 4, aspect = 0.8)

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

Я снова возвращаюсь к самому основному сюжету, чтобы увидеть взаимосвязь только между «возрастом» и «платой за проезд». Но на этот раз по сюжету:

sns.relplot(data = ti, x = 'age', y = "fare", kind = 'line')

По умолчанию линейный график поставляется с линией и доверительной полосой вдоль линии. Если вам не нужна доверительная полоса, вы можете избежать ее, используя ci = None.

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

sns.relplot(data = ti, x = 'age', y = "fare", kind = 'line', ci = None, hue = "sex", dashes = True, style = "sex", markers= True)

Здесь я использовал ту же переменную, что и параметр «оттенок» и параметр «стиль». Но если вы хотите, вы можете использовать и другие переменные. Пожалуйста, попробуйте это и посмотрите, понравится ли вам это.

Для следующего графика давайте иметь три отдельных графика для трех «pclass» с доверительной полосой и иметь цвет и стиль, основанные на «поле»:

sns.relplot(data = ti, x = 'age', y = "fare", hue = "alive", col = "pclass", height = 4, aspect = 0.8, style = "sex", kind = "line")

Если этот сюжет кажется вам слишком занятым, снимите доверительную ленту. Это может помочь. Кроме того, попробуйте использовать другую переменную в «строке», как я делал это ранее на диаграмме рассеяния.

Вот видеоурок для relplot:

Заключение

Я хотел показать вам два важных графика библиотеки Seaborn, которые помогают отображать ваши непрерывные переменные и дают так много полезных идей. Я надеюсь, что это было полезно.

Пожалуйста, не стесняйтесь подписываться на меня в Твиттере, на странице в Facebook и заглядывать на мой канал на YouTube.

Подробнее Чтение