Рубрики
Без рубрики

Seaborn Violin Plot – Учебник и примеры

В этом уроке мы рассмотрим, как строить скрипичные сюжеты с помощью Seaborn. Мы рассмотрим простые и продвинутые индивидуальные скрипичные сюжеты с примерами.

Автор оригинала: Dan Nelson.

Вступление

Seaborn является одной из наиболее широко используемых библиотек визуализации данных в Python, как расширение к Matplotlib . Он предлагает простой, интуитивно понятный, но легко настраиваемый API для визуализации данных.

В этом уроке мы рассмотрим, как построить скрипичный сюжет в Seaborn .

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

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

Импорт Данных

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

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

Графики скрипки по существу показывают ту же сводную статистику, что и графики коробки, но они также включают дополнительную информацию. Форма “Скрипки” на графике Скрипки-это оценка плотности ядра, которая представляет форму/распределение данных.

В этом уроке мы будем работать с набором данных Gapminder .

Мы начнем с импорта Seaborn, модуля PyPlot из Matplotlib и Pandas:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

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

Мы также проверим, чтобы убедиться, что нет никаких недостающих данных:

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())

Это приводит к:

       country  year  population continent  life_exp     gdp_cap
0  Afghanistan  1952     8425333      Asia    28.801  779.445314
1  Afghanistan  1957     9240934      Asia    30.332  820.853030
2  Afghanistan  1962    10267083      Asia    31.997  853.100710
3  Afghanistan  1967    11537966      Asia    34.020  836.197138
4  Afghanistan  1972    13079460      Asia    36.088  739.981106

Мы выберем наши непрерывные функции и сохраним их как переменные для передачи в функции Seaborn:

country = dataframe.country
continent = dataframe.continent
population = dataframe.population
life_exp = dataframe.life_exp
gdp_cap = dataframe.gdp_cap

Построение простого скрипичного сюжета в Сиборне

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

Чтобы создать скрипичный сюжет, мы просто используем функцию violin plot() в Seaborn.

Мы передаем фрейм данных, а также переменные, которые хотим визуализировать. Мы можем передать только переменную X, и функция автоматически вычислит значения по оси Y:

sns.violinplot(x=life_exp)

plt.show()

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

sns.violinplot(x="life_exp", data = dataframe)

Это приводит к точно такому же результату.

Обратите внимание: На этом изображении Seaborn строит распределение ожидаемой продолжительности жизни по всем странам, поскольку мы предоставили только переменную life_exp . В большинстве случаев мы также хотим отделить такую переменную на основе другой переменной, такой как страна или континент .

Построение скрипичного графика с переменными X и Y

Здесь мы перейдем к категориальной X-переменной и непрерывной Y-переменной, поскольку существует конкретное распределение, которое мы хотели бы видеть сегментированным по типу.

В этом наборе данных у нас есть много стран. Если мы построим их все, их будет слишком много, чтобы практически рассмотреть, и цифра будет слишком переполнена. Мы могли бы подмножествовать набор данных и просто построить график, скажем, 10 стран.

Вместо этого мы могли бы строить заговоры и по континентам.

sns.violinplot(x=continent, y=life_exp, data=dataframe)

Настройка Сюжета

Мы можем настроить наш скрипичный сюжет несколькими различными способами.

Измените метки сюжета скрипки с помощью Seaborn

Скажем, мы хотели бы добавить некоторые заголовки и метки к нашему сюжету, чтобы помочь другим в интерпретации данных. Хотя Seaborn автоматически помечает оси X и Y, мы можем захотеть изменить метки.

Это можно сделать с помощью функций set_title() и set_label() после создания объекта axes. Мы просто передаем заголовок, который хотим дать нашему сюжету, в функцию set_title () .

Чтобы пометить оси, мы используем функцию set() и предоставляем метки аргументам xlabel и ylabel или используем оболочку set_xlabel () /set_ylabel() :

ax = sns.violinplot(x=continent, y=life_exp)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")

plt.show()

Измените цвет сюжета скрипки с помощью Seaborn

Один из способов, которым мы можем настроить сюжет, – это назначить ему определенные цвета. Мы можем создать список заранее выбранных цветов и передать их в параметр palette :

colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']

ax = sns.violinplot(x=continent, y=life_exp, palette=colors_list)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")

plt.show()

Наложение сюжета Роя На Сюжет Скрипки в Сиборне

Мы могли бы даже наложить график Роя на график Скрипки, чтобы увидеть распределение и образцы точек, составляющих это распределение. Чтобы сделать это, мы просто создаем один объект figure, а затем создаем два разных графика:

colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']

plt.figure(figsize=(10,6))
sns.violinplot(x=continent, y=life_exp,palette=colors_list)
sns.swarmplot(x=continent, y=life_exp, color="k", alpha=0.8)
plt.title("Life Expectancy By Country")
plt.ylabel("Gapminder Life Expectancy")
plt.xlabel("Nations")

plt.show()

Измените стиль скрипичного сюжета с помощью Seaborn

Мы можем легко изменить стиль и цветовую палитру нашего графика, используя функции set_style() и set_palette() соответственно.

Seaborn поддерживает несколько различных вариантов изменения стиля и палитры рисунка:

plt.figure(figsize=(10,6))
sns.set_palette("RdBu")
sns.set_style("darkgrid")
sns.violinplot(x=continent, y=life_exp, data=dataframe)
sns.swarmplot(x=continent, y=life_exp, data=dataframe, color="k", alpha=0.8)
plt.title("Life Expectancy By Country")
plt.ylabel("Gapminder Life Expectancy")
plt.xlabel("Nations")

plt.show()

Подзаголовок Скрипичных сюжетов с Сиборном

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

Затем мы просто используем функцию add_subplot() и указываем, где в сетке мы хотим разместить текущий подзаголовок, создавая график, как обычно, используя объект axes.

Здесь мы можем либо установить y=variable , либо использовать data=variable .

fig = plt.figure(figsize=(6, 6))
gs = fig.add_gridspec(1, 3)

ax = fig.add_subplot(gs[0, 0])

sns.violinplot(data=population)
ax.set_xlabel("Population")

ax = fig.add_subplot(gs[0, 1])
sns.violinplot(data=life_exp)
ax.set_xlabel("Life Exp.")

ax = fig.add_subplot(gs[0, 2])
sns.violinplot(data=gdp_cap)
ax.set_xlabel("GDP Capacity")

fig.tight_layout()
plt.show()

Группировка скрипичных сюжетов по оттенкам

Действительно полезная вещь для скрипичных сюжетов-это группировка по оттенкам. Если у вас есть категориальное значение, которое имеет два значения (как правило, переменная true /| false - style), вы можете сгруппировать графики по оттенку.

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

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

Затем мы можем присвоить значение Yes //No новому столбцу - above_average_life_exp для каждой страны. Если средняя продолжительность жизни выше, чем в среднем по континенту , то это значение равно Да , и наоборот:

# Separate European countries from the original dataset
europe = dataframe.loc[dataframe["continent"] == "Europe"]

# Calculate mean of the `life_exp` variable
avg_life_exp = dataframe["life_exp"].mean()

# Declare an empty list
above_average_life_exp = []

# Iterate through the rows in the dataset, assigning Yes/No
# Depending on the value of the variable in the iterated row
for index, row in europe.iterrows():
	if row["life_exp"] > avg_life_exp:
		above_average_life_exp.append("Yes")
	else:
		above_average_life_exp.append("No")

# Add new column to dataset
europe["above_average_life_exp"] = above_average_life_exp

Теперь, если мы напечатаем наш набор данных, у нас будет что-то вроде:

             country  year  population continent  life_exp       gdp_cap avle
12           Albania  1952     1282697    Europe    55.230   1601.056136  No
13           Albania  1957     1476505    Europe    59.280   1942.284244  No
14           Albania  1962     1728137    Europe    64.820   2312.888958  Yes
15           Albania  1967     1984060    Europe    66.220   2760.196931  Yes
16           Albania  1972     2263554    Europe    67.690   3313.422188  Yes
...              ...   ...         ...       ...       ...           ...  ...
1603  United Kingdom  1987    56981620    Europe    75.007  21664.787670  Yes
1604  United Kingdom  1992    57866349    Europe    76.420  22705.092540  Yes
1605  United Kingdom  1997    58808266    Europe    77.218  26074.531360  Yes
1606  United Kingdom  2002    59912431    Europe    78.471  29478.999190  Yes
1607  United Kingdom  2007    60776238    Europe    79.425  33203.261280  Yes

Имя переменной усекается до a vle для краткости.

Теперь давайте выберем меньшее подмножество этих стран с помощью europe.head() и построим графики скрипки, сгруппированные по новому столбцу, который мы вставили:

europe = europe.tail(50)

ax = sns.violinplot(x=europe.country, y=europe.life_exp, hue=europe.above_average_life_exp)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")

plt.show()

Теперь это приводит к:

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

Вот тут-то и начинается расщепление .

Разделение скрипичных сюжетов по оттенкам

Скрипичные графики Seaborn позволяют вам передать аргумент split , который может быть установлен либо в True , либо в False .

Если вы установите его в True , и присутствует аргумент huge , он разделит скрипки между значениями hue .

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

расколотые скрипичные сюжеты Хюэ Сиборна

Вывод

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

Если вы заинтересованы в визуализации данных и не знаете, с чего начать, обязательно ознакомьтесь с нашей связкой книг on :

Визуализация данных в Python с Matplotlib и Pandas – это книга, предназначенная для того, чтобы познакомить абсолютных новичков с Pandas и Matplotlib, обладающих базовыми знаниями Python, и позволить им создать прочную основу для продвинутой работы с библиотеками тезисов- от простых сюжетов до анимированных 3D-сюжетов с интерактивными кнопками.

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

Визуализация данных в Python , книга для начинающих и промежуточных разработчиков Python, проведет вас через простые манипуляции с данными с Пандами, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет вам, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. Более конкретно, в течение 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.

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