Вступление
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.
Он служит уникальным практическим руководством по визуализации данных, в изобилии инструментов, которые вы могли бы использовать в своей карьере.