Вступление
Seaborn - одна из наиболее широко используемых библиотек визуализации данных в Python как расширение Matplotlib . Он предлагает простой, интуитивно понятный, но настраиваемый API для визуализации данных.
В этом уроке мы рассмотрим, как построить линейный график в Seaborn - одном из самых основных типов графиков.
На линейных графиках числовые значения отображаются на одной оси, а категориальные значения - на другой.
Обычно их можно использовать почти так же, как и гистограммы , хотя чаще они используются для отслеживания изменений с течением времени.
Постройте линейный участок с 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
действует как список
числовых переменных.
Этот код приводит к:
{.ezlazyload}
С этой целью мы можем использовать другие типы данных, такие как строки для категориальной оси:
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()
И это приведет к:
{.ezlazyload}
Примечание. Если вы используете целые числа в качестве
категориального списка, например [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()
{.ezlazyload}
Это связано с тем, что в наборе данных могут просто отсутствовать числовые значения по оси X. В этом случае Seaborn просто позволяет нам предположить, что эти значения отсутствуют, и строит график. Однако, когда вы работаете со строками, этого не произойдет:
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()
{.ezlazyload}
Однако, как правило, мы не работаем с такими простыми, составленными вручную списками, как этот. Мы работаем с данными, импортированными из больших наборов данных или полученными непосредственно из баз данных. Давайте вместо этого импортируем набор данных и поработаем с ним.
Импортировать данные
Давайте воспользуемся набором данных Hotel Bookings и воспользуемся данными оттуда:
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
аргументу данных.
Теперь это приводит к:
{.ezlazyload}
Мы ясно видим, что в течение июня, июля и августа (летние каникулы) продолжительность ночлега в будние дни, как правило, больше, а минимальная - в январе и феврале, сразу после череды праздников, ведущих к Новому году.
Кроме того, вы можете увидеть доверительный интервал как область
вокруг самой линии, которая является предполагаемой центральной
тенденцией наших данных. Поскольку у нас есть несколько y
для каждого
x
(многие люди останавливались в каждом месяце), Seaborn вычисляет
центральную тенденцию этих записей и строит эту линию, а также
доверительный интервал для этой тенденции.
В целом , люди остаются около 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()
может изначально распознавать наборы данных
широкого формата и строить их соответствующим образом. Это приводит к:
{.ezlazyload}
Настройка линейных графиков с помощью 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
функцию прибытия_date_year в качестве hue
arrival_date_year
каждое сопоставление XY с помощью функции
прибытия_date_year, так что в итоге мы получим три разных линейных
графика:
{.ezlazyload}
На этот раз у нас также есть доверительные интервалы, отмеченные вокруг наших основных тенденций.
Настройка доверительного интервала линейного графика с помощью Seaborn
Вы можете легко повозиться, включить / отключить и изменить тип
доверительных интервалов, используя пару аргументов. ci
может
использоваться для указания размера интервала и может быть установлен в
целое число, 'sd'
(стандартное отклонение) или None
если вы хотите
отключить его.
err_style
можно использовать для указания стиля доверительных
интервалов - band
или bars
. Мы уже видели, как работают полосы,
поэтому давайте попробуем доверительный интервал, в котором вместо
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()
Это приводит к:
{.ezlazyload}
И давайте изменим доверительный интервал, который по умолчанию
установлен на 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()
{.ezlazyload}
Заключение
В этом уроке мы рассмотрели несколько способов построения линейного графика в Seaborn. Мы рассмотрели, как построить простые графики с числовыми и категориальными осями X, после чего импортировали набор данных и визуализировали его.
Мы изучили, как управлять наборами данных и изменять их форму для визуализации нескольких функций, а также как настраивать линейные графики.
Если вас интересует визуализация данных и вы не знаете, с чего начать, обязательно ознакомьтесь с нашим комплектом книг по визуализации данных в Python{.ebook-link} :
::: {style=“border: 1px solid #ebebeb;padding: 15px;”} {.ebook-link}
Визуализация данных в Python
::: {.row} ::: {.col-md-4 .col-xs-12} {.ezlazyload .img-responsive .center-block} :::
::: {.col-md-8 .col-xs-12 .my-auto} Станьте опасными с визуализацией данных
✅ 30-дневная гарантия возврата денег без вопросов
✅ от начального до продвинутого
✅ Регулярно обновляется бесплатно (последнее обновление в апреле 2021 г.)
✅ Обновлено с бонусными ресурсами и руководствами ::: ::: :::
Визуализация данных в Python с помощью Matplotlib и Pandas - это книга, предназначенная для абсолютных новичков в работе с Pandas и Matplotlib с базовыми знаниями Python и позволяющая им создать прочную основу для расширенной работы с этими библиотеками - от простых графиков до анимированных трехмерных графиков с интерактивными кнопки.
Он служит подробным руководством, которое научит вас всему, что вам нужно знать о Pandas и Matplotlib, в том числе о том, как создавать типы графиков, которые не встроены в саму библиотеку.
Книга «Визуализация данных в Python» , книга для начинающих и средних разработчиков Python, проведет вас через простые манипуляции с данными с помощью Pandas, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. В частности, на протяжении 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.
Он служит уникальным практическим руководством по визуализации данных в виде множества инструментов, которые вы можете использовать в своей карьере.