Руководство по построению точечных диаграмм, тепловых карт, хребтовых диаграмм и линейных графиков в Python

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

Что такое визуализация данных?

Проще говоря, визуализация данных — это «искусство» использования графических дисплеев для отображения необработанных данных. В частности, это полезно для изучения структуры данных, обнаружения выбросов, тенденций и кластеров для уменьшения сложности данных. Следовательно, эффективная визуализация данных поможет донести данные до целевой аудитории в легко понятном визуальном контексте для человеческого мозга.

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

Кроме того, был достигнут прогресс в разработке графических теорий, таких как Грамматика графики Уилкинсона (2005) и ее реализация Хэдли Уикхэмом в R-пакете ggplot2 (Wickham, 2016). При этом графика, которая редко использовалась в прошлом и была сложной для рисования, такая как графики с параллельными координатами (например, Theus, 2015) и мозаичные графики (например, Unwin, 2015), теперь была усовершенствована и развита.

Зачем использовать Python для визуализации данных?

Существует множество инструментов для визуализации данных без кода, таких как Tableau, Power BI, ChartBlocks, Prism и другие. Однако, несмотря на то, что программирование требуется, Python является одним из предпочтительных языков среди специалистов по данным из-за его возможностей визуализации. Это также сопровождается библиотеками сбора и исследования данных (например, Pandas, NumPy, SciPy) для обработки и преобразования данных. Python уже имеет множество библиотек и функций, доступных для визуализации, которые будут продолжать расти из-за его большой пользовательской базы и открытого исходного кода. С постоянно развивающимся технологическим ландшафтом Python отлично подходит для того, чтобы на долгие годы сохранить свою позицию предпочтительного языка среди специалистов по данным.

Установка библиотеки и подготовка набора данных

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

  • радостный
  • морской
  • сюжетно.экспресс

Для общего интереса я обобщил информацию о ключевой библиотеке со ссылками на исходную документацию:

  • Plotly Express — это высокоуровневая библиотека визуализации Python, служащая оболочкой для Plotly.py, предоставляющая простой синтаксис для сложных диаграмм. Его можно использовать для создания богато интерактивных графиков всего за один вызов функции, включая фасетирование, карты, анимацию и линии тренда. Plotly Express также полностью совместим с остальной частью экосистемы Plotly.
  • Seaborn строится на основе matplotlib и работает, захватывая целые кадры данных или массивы, содержащие данные, и выполняет необходимые внутренние функции для семантического отображения и статистического агрегирования для создания информативных графиков.
  • Joypy — это пакет Python с одной функцией, основанный на matplotlib и pandas, с единственной целью: рисовать джойплоты (т. е. графики хребта). Эта библиотека очень полезна для наглядной визуализации распределения данных.

Установка библиотеки

Если это еще не сделано, установите эти библиотеки через терминал, выполнив следующие командные строки:

pip install seaborn
pip install joypy
pip install plotly

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

import numpy as np
import pandas as pd
import seaborn as sns
from joypy import joyplot
import plotly.express as px
from scipy import stats
import matplotlib.pyplot as plt

Загрузка набора данных

Без данных мы ничего не можем визуализировать. Поэтому, прежде чем мы перейдем к серии примеров построения графиков, мы загрузим следующий встроенный (и часто используемый) набор данных Python о полетах с использованием библиотеки seaborn:

# Load a dataframe
flights_data = sns.load_dataset("flights")
# Display dataset
flights_data.head()

Графики рассеяния

Базовые точечные диаграммы можно создавать с помощью plotly.express с возможностью изменения их ширины и высоты для более оптимального экспорта изображений. Шаблоны также можно изменить с simple_white, чтобы включить сетки и более темный цвет:

px.scatter(flights_data, x=”year”, y=”passengers”, width=700, height=600,template=”simple_white”)

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

#group data 
flights_data.loc[flights_data.year <= 1954 , 'group'] = '<= 1954'
flights_data.loc[flights_data.year > 1954 , 'group'] = '> 1954'
 
#re-plot data with discrete color scheme
px.scatter(flights_data, x="year", y="passengers", width=700, height=600, template="simple_white", color="group", color_discrete_sequence=['red','blue'])

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

#size dimension change
fig1 = px.scatter(flights_data, x="year", y="passengers", width=700, height=450,template="simple_white", color="group",color_discrete_sequence=['red','blue'])
#tick font and size change
fig1.update_layout(
yaxis = dict(
tickfont = dict(size=20)),
xaxis = dict(
tickfont = dict(size=20)),
font_family="Arial")
#x-axis title and size + tick length changes
fig1.update_xaxes(
title_text = "Year of flight",
title_font = {"size": 20},
title_standoff = 15, ticklen=10)
#y-axis title and size + tick length and value changes
fig1.update_yaxes(
title_text = "Passengers",
title_font = {"size": 20},
title_standoff = 15, ticklen=10, tickvals=list(range(0,700,100)))
#marker size, outline and color change 
fig1.update_traces(marker=dict(size = 9,
line=dict(width=0.8, color='white')),
selector=dict(mode='markers'))
#legend off 
fig1.update_layout(showlegend=False)
    
fig1.show()

Примечательно, что вы можете выбрать любую из следующих встроенных качественных последовательностей цветов из модуля px.colors.qualitative или определить свою собственную:

Линейные графики

Несмотря на то, что в plotly.express есть возможность добавить линию тренда, здесь мы покажем, как реализовать заполненную линию тренда для существующих данных, используя библиотеки seaborn. Это особенно полезно для визуализации взаимосвязей между переменными. В случае переменных «год» и «пассажир» можно увидеть линейную зависимость, и, следовательно, линия тренда поможет ее усилить.

#use lmplot to plot scatter points
sns.set(font_scale = 1.6)
sns.set_style("white")
fig2 = sns.lmplot(data = flights_data, x="year", y="passengers", height=5, aspect=1.64, legend=False, line_kws={'color': 'black'}, scatter_kws={"color": "black"})
#change axis titles
fig2.set(xlabel='Year of flight', ylabel='Passengers')

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

#get coeffs of linear fit
slope, intercept, r_value, p_value, std_err = stats.linregress(flights_data['year'],flights_data['passengers'])
#use lmplot to plot scatter points
sns.set(font_scale = 1.6)
sns.set_style("white")
sns.lmplot(data = flights_data, x="year", y="passengers", height=5, aspect=1.64, hue="group", fit_reg= False, legend=False, palette=["red","blue"])
#use regplot to plot the regression line and use line_kws to set line label for legend
fig3 = sns.regplot(data = flights_data, x="year", y="passengers", scatter_kws={"zorder":-1}, line_kws={'label':"y={0:.1f}x+{1:.1f}".format(slope,intercept)}, color="black")
#change axis titles
fig3.set(xlabel='Year of flight', ylabel='Passengers')

Кроме того, к каждой группе можно применить отдельную заполненную линию тренда, используя следующий код:

#use lmplot to plot scatter points
sns.set(font_scale = 1.6)
sns.set_style("white")
fig4 = sns.lmplot(data = flights_data, x="year", y="passengers", height=5, aspect=1.64, hue="group", palette=["red","blue"], legend = False)
#change axis titles
fig4.set(xlabel='Year of flight', ylabel='Passengers')

Во всех случаях для упрощения данных среднее (или медиана) всех значений y для каждого соответствующего значения x может отображаться, как показано ниже:

#set fontsize
sns.set(font_scale = 1.6)
sns.set_style("white")
fig5 = sns.regplot(data = flights_data, x="year", y="passengers", x_estimator=np.mean, color = "black")
#set fig size
fig5.figure.set_size_inches(8.2, 4.5)
#change axis titles
fig5.set(xlabel='Year of flight', ylabel='Passengers') 
#despine
sns.despine()

Графики хребта

Глядя на линейный и точечный графики, легко увидеть, что распределение данных внутри каждой группы существенно различается. Диаграммы или графики хребта в Python могут быть отличным методом визуализации указанного распределения, а также предоставления информации о типах распределения (например, нормальное, гамма, бета). Чтобы освежить в памяти, отличное резюме можно найти здесь.

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

# x variables to plot with corresponding text
xvar = ['year', 'passengers']
xlabel = ['Year of flight', 'Passengers']
for x,xlabel in zip(xvar,xlabel):
    joyplot(data = flights_data[[x, "group"]], 
            by="group", figsize=(10, 4), 
            labels = ["Group 1","Group 2"],
            linecolor = 'black',
            color = ['red','blue'], 
            alpha = 0.85, 
            linewidth=3, overlap = 0.9)
    plt.rc("font", size=24)
    plt.xlabel(xlabel, fontsize = 24)
    plt.show()

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

Тепловые карты

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

В этом примере я сгруппировал набор данных по “year” и создал средние и медианные выходные данные в один объединенный кадр данных. Это позволило мне упростить набор данных перед созданием тепловой карты:

#grouped flights_data and calculated mean
grouped_df = flights_data.groupby("year")
mean_df = grouped_df.mean()
mean_df.rename({'passengers': 'Mean'}, axis=1, inplace=True)
mean_df = mean_df.reset_index()
#grouped flights_data and calculated median
median_df = grouped_df.median()
median_df.rename({'passengers': 'Median'}, axis=1, inplace=True)
median_df = median_df.reset_index()
#concat dataframes
data_concat = pd.concat([median_df['Median'], mean_df['Mean']], axis=1, ignore_index=False)
#display 
data_concat.head()

После завершения вы можете построить свою тепловую карту для каждого года:

#finding y-axis titles
y_axis_labels = flights_data.year.unique()
# plot heatmap
fig, ax = plt.subplots(figsize=(6,10)) 
fig7 = sns.heatmap(data_concat, cmap="vlag", linewidth=0.1, annot=data_concat, fmt=".2f", cbar_kws={'label': 'Passengers', "shrink": .4}, annot_kws={"size": 16}, yticklabels=y_axis_labels)
# set yticks and axis label
plt.yticks(rotation=0) 
fig7.set(ylabel='Year of flight')

Заключение

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

Подводя итог — основные библиотеки, такие как seaborn, joypy и plotly.express, предлагают эффективную отправную точку для всех, кто не знаком с визуализацией данных с помощью Python. В этой статье мы использовали их для создания точечных диаграмм, тепловых карт, линейных графиков и графиков радости с помощью простого набора данных.

Надеюсь, вам понравилось читать эту статью так же, как мне понравилось ее писать.

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