Подробная информация о Violinplot и Relplot в Seaborn
Использование Violinplots и Relplots в Seaborn с полным потенциалом
Библиотека Python Seaborn — очень популярная библиотека визуализации. Он построен на Matplotlib и включает в себя множество расширенных графиков со встроенными стилями. У меня есть статья о Seaborn, в которой рассказывается о самых популярных сюжетах (ссылка дана в конце этой статьи). Решил сделать подробные туториалы по некоторым сюжетам.
В этой статье я сосредоточусь на двух очень распространенных сюжетах из библиотеки Seaborn:
- Сюжет для скрипки
- Перестроить
Начнем со скрипичного сюжета.
Сюжет для скрипки
Причина, по которой скрипичный сюжет так полезен, заключается в том, что он дает вам плотность ядра и коробочную диаграмму вместе. Итак, на одном графике вы получаете много информации о переменной. Я буду использовать набор данных пингвинов для графиков скрипки:
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.