Автор оригинала: 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
действует как список числовых переменных.
Этот код приводит к:
С этой целью мы можем использовать другие типы данных, такие как строки для категориальной оси:
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()
Это происходит потому, что набор данных может просто отсутствовать числовые значения на оси 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()
Однако, как правило, мы не работаем с простыми, сделанными вручную списками, подобными этому. Мы работаем с данными, импортированными из больших наборов данных или извлеченными непосредственно из баз данных. Давайте импортируем набор данных и будем работать с ним.
Импорт Данных
Давайте воспользуемся набором данных Бронирование отелей и воспользуемся данными оттуда:
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
.
Теперь это приводит к:
Мы ясно видим, что в июне, июле и августе (летние каникулы) продолжительность пребывания в будние дни, как правило, больше, в то время как в январе и феврале, сразу после череды праздников, ведущих к Новому году, она самая низкая.
Кроме того, вы можете видеть доверительный интервал как область вокруг самой линии, которая является предполагаемой центральной тенденцией наших данных. Поскольку у нас есть несколько значений 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()
Это приводит к:
И давайте изменим доверительный интервал, который по умолчанию установлен на 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()
Вывод
В этом уроке мы рассмотрели несколько способов построения линейного графика в Сиборне. Мы рассмотрели, как строить простые графики с числовыми и категориальными осями 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.
Он служит уникальным практическим руководством по визуализации данных, в изобилии инструментов, которые вы могли бы использовать в своей карьере.