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

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

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

Автор оригинала: David Landup.

Вступление

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

В этом уроке мы рассмотрим, как построить линейный график в Seaborn – один из самых основных типов графиков.

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

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

Постройте линейный сюжет с Сиборном

Давайте начнем с самой простой формы данных о населении для линейного графика, предоставив пару списков для оси X и оси Y функции lineplot() :

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="darkgrid")

x = [1, 2, 3, 4, 5]
y = [1, 5, 4, 7, 4]

sns.lineplot(x, y)
plt.show()

Здесь у нас есть два списка значений: x и y . Список x действует как наш список категориальных переменных, в то время как список y действует как список числовых переменных.

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

seaborn simple line plot

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

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="darkgrid")

x = ['day 1', 'day 2', 'day 3']
y = [1, 5, 4]

sns.lineplot(x, y)
plt.show()

И это привело бы к:

категориальный линейный график сиборна

Примечание: Если вы используете целые числа в качестве категориального списка, например [1, 2, 3, 4, 5] , но затем приступайте к переходу к 100 , все значения между 5..100 будут равны нулю:

import seaborn as sns

sns.set_theme(style="darkgrid")

x = [1, 2, 3, 4, 5, 10, 100]
y = [1, 5, 4, 7, 4, 5, 6]

sns.lineplot(x, y)
plt.show()
seaborn недостающие значения линейный график

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

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="darkgrid")

x = ['day 1', 'day 2', 'day 3', 'day 100']
y = [1, 5, 4, 5]

sns.lineplot(x, y)
plt.show()
seaborn недостающие категориальные значения линейный график

Однако, как правило, мы не работаем с простыми, сделанными вручную списками, подобными этому. Мы работаем с данными, импортированными из больших наборов данных или извлеченными непосредственно из баз данных. Давайте импортируем набор данных и будем работать с ним.

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

Давайте воспользуемся набором данных Бронирование отелей и воспользуемся данными оттуда:

import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
print(df.head())

Давайте взглянем на столбцы этого набора данных:

          hotel  is_canceled reservation_status  ... arrival_date_month  stays_in_week_nights
0  Resort Hotel            0          Check-Out  ...               July                     0
1  Resort Hotel            0          Check-Out  ...               July                     0
2  Resort Hotel            0          Check-Out  ...               July                     1
3  Resort Hotel            0          Check-Out  ...               July                     1
4  Resort Hotel            0          Check-Out  ...               July                     2

Это усеченное представление, так как в этом наборе данных много столбцов. Например, давайте исследуем этот набор данных, используя arrival_date_month в качестве нашей категориальной оси X, в то время как мы используем stays_in_week_nights в качестве нашей числовой оси Y:

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

sns.set_theme(style="darkgrid")

df = pd.read_csv('hotel_bookings.csv')

sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", data = df)
plt.show()

Мы использовали Pandas для чтения данных CSV и упаковки их в DataFrame . Затем мы можем назначить аргументы x и y функции lineplot() в качестве имен столбцов в этом фрейме данных. Конечно, нам придется указать, с каким набором данных мы работаем, назначив фрейм данных аргументу data .

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

линейный график набора данных seaborn

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

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

В целом люди остаются ~2,8 дня в будние дни, в июле, но доверительный интервал охватывает от 2.78-2.84 .

Построение Графиков Данных Широкой Формы

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

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

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

df = pd.read_csv('hotel_bookings.csv')

# Truncate
df = df[['arrival_date_year', 'arrival_date_month', 'stays_in_week_nights']]
# Save the order of the arrival months
order = df['arrival_date_month']
# Pivot the table to turn it into wide-form
df_wide = df.pivot_table(index='arrival_date_month', columns='arrival_date_year', values='stays_in_week_nights')
# Reindex the DataFrame with the `order` variable to keep the same order of months as before
df_wide = df_wide.reindex(order, axis=0)

print(df_wide)

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

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

Давайте посмотрим, как выглядит наш набор данных сейчас:

arrival_date_year       2015      2016      2017
arrival_date_month
July                2.789625  2.836177  2.787502
July                2.789625  2.836177  2.787502
July                2.789625  2.836177  2.787502
July                2.789625  2.836177  2.787502
July                2.789625  2.836177  2.787502
...                      ...       ...       ...
August              2.654153  2.859964  2.956142
August              2.654153  2.859964  2.956142
August              2.654153  2.859964  2.956142
August              2.654153  2.859964  2.956142
August              2.654153  2.859964  2.956142

Отлично! Наш набор данных теперь правильно отформатирован для визуализации широкой формы, с центральной тенденцией stays_in_week_nights вычисляется. Теперь, когда мы работаем с набором данных широкой формы, все, что нам нужно сделать, чтобы построить его, – это:

sns.lineplot(data=df_wide)
plt.show()

Функция lineplot() может изначально распознавать наборы данных широкой формы и строить их соответствующим образом. Это приводит к:

широкий набор данных формы линейный график сиборна

Настройка линейных графиков с помощью Seaborn

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

Построение линейного графика с оттенками

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

Именно это мы и сделали в предыдущем примере – вручную. Мы преобразовали набор данных в широкоформатный фрейм данных и построили график. Однако мы могли бы также сгруппировать годы в оттенки , что дало бы нам точно такой же результат:

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

df = pd.read_csv('hotel_bookings.csv')

sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", hue='arrival_date_year', data = df)
plt.show()

Установив функцию arrival_date_year в качестве аргумента hue , мы попросили Seaborn разделить каждое отображение X-Y на функцию arrival_date_year , так что в итоге мы получим три разных линейных графика:

оттенки сюжета линии сиборна

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

Настройка доверительного интервала линейного графика с помощью Seaborn

Вы можете легко возиться, включать/отключать и изменять тип доверительных интервалов, используя пару аргументов. Аргумент ci может использоваться для указания размера интервала и может быть установлен в целое число, 'sd' (стандартное отклонение) или None , если вы хотите его отключить.

Параметр error_style можно использовать для указания стиля доверительных интервалов – band или bars . Мы уже видели, как работают полосы, поэтому давайте попробуем использовать доверительный интервал, который использует бары вместо этого:

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

df = pd.read_csv('hotel_bookings.csv')

sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", err_style='bars', data = df)
plt.show()

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

seaborn customize confidence interval line plot

И давайте изменим доверительный интервал, который по умолчанию установлен на 95 , чтобы вместо этого отобразить стандартное отклонение:

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

df = pd.read_csv('hotel_bookings.csv')

sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", err_style='bars', ci='sd', data = df)
plt.show()
линейный график доверительный интервал seaborn

Вывод

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

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

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

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