Скажите "Пока!" Matplotlib-у и Seaborn-у для построения графиков в Python
Всем привет! Я, как наверное и большинство из вас, регулярно что-то визуализирую. Это могут быть какие-то большие или не очень отчетности в Tableau, а могут просто какой-то график в Python. Если задуматься о том в чем выгода визуализаций в Tableau или в любом другом визуализаторе, мы наверняка быстр опридем к тому, что в отчетности интересен интерактив, который предоставил нам человек, который эту отчетность и строил. Это могут быть фильтры, допинформация при наведении, какая-то анимация или что-то другое.
Всего этого нет в графиках, которые строятся в Python. Сегодня поговорим о библиотеке, которая не станет вам заменой отчетностей в табло и не сможет вам дать те же ощущения, но она, лично для меня, выглядет приятнее нежели аналоги в лице Matplotlib и Seaborn.
Приступим!
Оригинальный текст https://medium.com/codex/say-goodbye-to-matplotlib-and-seaborn-for-your-python-plots-5cade2f7fba2
Переведено для канала https://t.me/letsdatanow

Визуализация данных стала наиболее интуитивным и эффективным способом понимания сложной информации человеческим мозгом. Визуализации не только помогают нам выявить закономерности и взаимосвязи, которые трудно обнаружить в необработанных данных, но и позволяют представить наши результаты в более увлекательной и убедительной форме.
В то время как R предоставляет несколько отличных пакетов для визуализации данных и создания информационных панелей, таких как ggplot2, leaflet и R Shiny, Python отстает в этом аспекте, поскольку Matplotlib не является отличным пакетом для визуализации.
Seaborn является хорошей альтернативой для создания статических графиков в Python, но ему не хватает интерактивности. При использовании статических графиков мы не можем приблизить интересные участки графиков, навести курсор на график, чтобы увидеть конкретную информацию, и многое другое.
compelling manner – убедительная форма
Здесь в игру вступает Plotly!

Plotly - это библиотека Python для создания интерактивных высококачественных визуализаций.
Plotly не только делает графики интерактивными, но и предоставляет широкий выбор графиков, таких как статистические графики, научные графики, финансовые графики, карты, графики для биоинформатики и многое другое.
В целом, это делает Plotly лучшим выбором, чем Matplotlib или Seaborn.
Это было все теоретическое объяснение того, почему вы должны использовать Plotly вместо Matplotlib или Seaborn.
Пошел даже гуглить, что же это за графики строят биоинформатики... В целом, не понял почему их так обособили, но не суть
Приступим к делу!
В следующем разделе мы будем использовать Plotly для визуализации распространения Covid-19 в разных странах в течение первых нескольких месяцев распространения вируса.
Для начала вы можете запустить Jupyter Notebook и использовать коды напрямую. Мы начнем с установки пакета Plotly и импорта необходимых пакетов.
# Устанавливаем plotly ! pip install plotly # Импортируем plotly пакеты import plotly.graph_objects as go import plotly.express as px
Прочитаем csv с гитхаба и создадим датафрейм
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/shinokada/covid-19-stats/master/data/daily-new-confirmed-cases-of-covid-19-tests-per-case.csv')
display(df.head())
display(df.shape)

Подготовим данные для визуализации
## Задаем названия столбцам
df.columns = ['Countries','Code','Date','Avg Daily Confirmed',
'Days to first 30 Cases']
## Убираем агрегированные данные для регионов
excludes = ["World", "Africa", "North America", "South America", "Asia", "Europe", "European Union", "High income", "Low income", "Lower middle income", "Oceania", "Upper middle income", "World excl. China", "World excl. China and South Korea", "International", "World excl. China, South Korea, Japan and Singapore","Asia excl. China"]
df=df[~df['Countries'].isin(excludes)]
df
## Переводим из строки в тип даты столбец с датой
df['Date']= pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')
Viz 1: Когда начался Covid-19
Чтобы получить представление о том, когда вирус начал распространяться по странам мира, мы можем посмотреть на даты, когда общее количество подтвержденных случаев заболевания достигло 30 в день по странам.
Мы построим диаграмму рассеяния, на которой ось x будет представлять дату, когда было зафиксировано 30 первых случаев, а ось y - среднесуточное количество подтвержденных случаев в этот день.
## Добываем для каждой страны дату выявления 30 случаев заражения
date_df = df[df['Days to first 30 Cases']==0]
## Создаем scatter plot в plotly
fig = px.scatter(date_df, x = 'Date', y = 'Avg Daily Confirmed',
hover_name = 'Countries',color = 'Countries')
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
'title': 'Date of crossing first 30 Cases'})
fig.show()

Интерактивность, ВАУ! Сразу ассоциация с табло, не правда ли?)
Мы можем наблюдать, что 21 января в Китае, 22 февраля в Южной Корее, 25 февраля в Италии и т.д. ежедневное число подтвержденных случаев достигло 30.
Viz 2: Распространение во времени
Во второй визуализации мы увидим, как Covid-19 распространялся во времени в разных странах.
Следующий код создает линейный график, где каждая линия представляет страну. Он показывает, как среднесуточное количество подтвержденных случаев изменялось с течением времени.
fig = px.line(df, x="Date", y="Avg Daily Confirmed", color="Countries")
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
'title': 'Count of Avg. Confirmed Cases'})
fig.show()

Из приведенного выше графика видно, что ежедневное количество подтвержденных случаев заболевания ковидом быстро росло в США и Бразилии.
Viz 3: Страны с наибольшим числом случаев заболевания
Теперь мы рассмотрим общее количество подтвержденных случаев для 10 стран с наибольшим количеством случаев ковида.
Следующий код создает гистограмму со странами по оси X и общим количеством подтвержденных случаев по оси Y.
total_confirmed = df.groupby(['Countries'])['Avg Daily Confirmed'].sum().reset_index()
total_confirmed.columns = ['Countries','Total Confirmed Cases']
top_confirmed = total_confirmed.sort_values(by = ['Total Confirmed Cases'],ascending = False)[:10]
fig = px.bar(top_confirmed, x = 'Countries', y = 'Total Confirmed Cases')
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
'title': 'Countries with most number of Confirmed Cases'})
fig.show()

Мы можем наблюдать, что в США зарегистрировано огромное количество подтвержденных случаев заболевания по сравнению со случаями ковида в других 9 странах.
Viz 4: Как он распространился в странах с наибольшим количеством случаев - анимация!
В этой визуализации мы увидим реальную силу Plotly, где мы создадим анимацию, показывающую, как со временем росло число случаев заболевания ковидиозом в 5 странах - США, Бразилии, России, Великобритании и Индии.
Код разделен на следующие разделы:
Подготовка набора данных
Настройка макета графика
Добавление линии для каждой страны.
Добавление кадров анимации.
### 1. Подготавливаем данные для визуализации - страны с максимальным числом зараженных
includes = ['United States','Russia', 'India','Brazil','United Kingdom']
includes = ['United States']
df_mar_may = df[(df['Date']>'2020-03-01') & (df['Date'] <'2020-06-14')]
df_mar_may.columns = ['Countries','Code','Date','confirmed','days_since_confirmed']
df_us=df_mar_may[df_mar_may['Countries'].isin(includes)]
includes = ['India']
df_ind=df_mar_may[df_mar_may['Countries'].isin(includes)]
includes = ['Brazil']
df_brazil=df_mar_may[df_mar_may['Countries'].isin(includes)]
includes = ['Russia']
df_rus=df_mar_may[df_mar_may['Countries'].isin(includes)]
includes = ['United Kingdom']
df_uk=df_mar_may[df_mar_may['Countries'].isin(includes)]
### Создаем анимацию
import plotly.offline as pyo
## 2. Задаём лейаут
fig = go.Figure(
layout=go.Layout(
xaxis=dict(range=[-5, 100], autorange=False),
yaxis=dict(range=[7, 31950], autorange=False),
title="Confirmed Covid Cases (2nd March'20 - 13th June'20)",
updatemenus=[dict(
type="buttons",
buttons=[dict(label="Play",
method="animate",
args = [None] )])]
)
) #2
fig.update_layout({
'plot_bgcolor': 'rgba(0, 0, 0, 0)',
'paper_bgcolor': 'rgba(0, 0, 0, 0)',
'xaxis_title': 'Days since confirmed cases first reached 30 per day',
'yaxis_title': "Daily confirmed cases (7-day average)" })
# 3. Задаем кривые - одна кривая – одна страна
init = 1
fig.add_trace(
go.Scatter(x=df_us.days_since_confirmed[:init],
y=df_us.confirmed[:init],
name="US",
visible=True,
line=dict(color="#33CFA5", )))
fig.add_trace(
go.Scatter(x=df_ind.days_since_confirmed[:init],
y=df_ind.confirmed[:init],
name="India",
visible=True,
line=dict(color="#bf00ff"),))
fig.add_trace(
go.Scatter(x=df_brazil.days_since_confirmed[:init],
y=df_brazil.confirmed[:init],
name="Brazil",
visible=True,
line=dict(color="#33C7FF"),
))
fig.add_trace(
go.Scatter(x=df_rus.days_since_confirmed[:init],
y=df_rus.confirmed[:init],
name="Russia",
visible=True,
line=dict(color="#FF5733"),
))
fig.add_trace(
go.Scatter(x=df_uk.days_since_confirmed[:init],
y=df_uk.confirmed[:init],
name="United Kingdom",
visible=True,
line=dict(color="#6E6E6E"),
))
# 4. Анимация
fig.update(frames=[
go.Frame(
data=[
go.Scatter(x=df_us.days_since_confirmed[:k], y=df_us.confirmed[:k]),
go.Scatter(x=df_ind.days_since_confirmed[:k], y=df_ind.confirmed[:k]),
go.Scatter(x=df_brazil.days_since_confirmed[:k], y=df_brazil.confirmed[:k]),
go.Scatter(x=df_rus.days_since_confirmed[:k], y=df_rus.confirmed[:k]),
go.Scatter(x=df_uk.days_since_confirmed[:k], y=df_uk.confirmed[:k]),
]
)
for k in range(init, len(df_us)+1)])
# Дополнительные настройки
fig.update_xaxes(ticks="outside", tickwidth=2, tickcolor='white', ticklen=10)
fig.update_yaxes(ticks="outside", tickwidth=2, tickcolor='white', ticklen=1)
fig.update_layout(yaxis_tickformat=',')
fig.update_layout(legend=dict(x=0, y=1.1), legend_orientation="h")
fig.show()

Сама визуализация прикольная, тут не поспоришь, но вот место, где автор решил ее применить как будто бы не раскрывает всю прелесть ее наличия.
Тут как будто бы и на готовый график норм посмотреть.
Придумал кейс, где будет круто выглядеть и можно показывать на дейликах:
представьте у вас A/B тест и вы визуализируете динамику изменения метрики в тесте и контроле, первые несколько секунд они идут около друг друга, а потом вжух и кривая теста улетает на дно:)
На приведенной выше анимации относительное положение этих линий (вдоль оси x) показывает, как быстро эти страны получили 30 подтвержденных случаев. США и Великобритания первыми достигли 30 подтвержденных случаев.
Заключение
В заключение хочу сказать, что Plotly предоставляет широкий спектр типов графиков и функциональных возможностей, которые могут помочь улучшить вашу игру в визуализацию данных. С помощью Plotly вы можете создавать потрясающие интерактивные диаграммы, которыми можно легко поделиться с другими и изучить их.
Следуя шагам, описанным в этой статье, вы сможете начать исследовать свои данные по-новому и раскрыть новые, ранее скрытые, идеи. Так что не ждите больше и начинайте создавать свои собственные визуализации данных с помощью Plotly уже сегодня!
Как я уже сказал, это не станет заменой визуализаций в Tableau или другой системе, ведь ссылку на отчет вы скинуть продакту или маркетологу можете, а ноутбук юпитера вряд ли. Но тем не менее, это хороший вариант для визуализаций для каких каких-либо лайв демонстраций от вашего лица. На сим у меня всё, до новых встреч!