Обновить диаграмму с помощью раскрывающихся меню
Table of Contents Introduction 1. Libraries 2. Data Setup for the Dropdown 3. Multiple Plot Function 4. Interactive Dropdown Menu 5. All the Code 6. Using for Other Datasets Conclusion
Вступление
В прошлой статье я писал о том, как создать пузырьковую карту с помощью Plotly.express и Mapbox. Пузырьковая карта может отображать все данные с разными размерами на карте.
В этой статье я собираюсь написать об интерактивном графике с использованием раскрывающегося меню.
Этот метод полезен, когда у вас есть серия наборов данных и вы хотите отделить один набор данных от других.
Для этой статьи я использую репозиторий CSSEGISandData на Github о COVID-19.
Библиотеки
import pandas as pd import numpy as np import plotly.graph_objects as go
Pandas - это быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных с открытым исходным кодом. Numpy - это фундаментальный пакет для научных вычислений с Python. Plotly - это интерактивная графическая библиотека Python с открытым исходным кодом.
Настройка данных для раскрывающегося списка
Приступим к подготовке нашего набора данных. Мы собираемся использовать данные временных рядов, а необработанные данные вы можете найти здесь.
Создайте переменную confirmed_global
и сохраните данные в covid19_confirmed
с помощью read_csv Panda. Мы устанавливаем столбец индекса в Country / Region и отображаем фрейм данных.
# confirmed_global confirmed_global='https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covidTrue
data/csse_covidTrue
time_series/time_series_covid19_confirmed_global.csv' covid19_confirmed=pd.read_csv(confirmed_global,index_col='Country/Region') display(covid19_confirmed)
Всего 266 строк. Это Country/Region
в индексе и Lat
, Long
и даты на этикетке.
Мы собираемся извлечь последнюю дату из фрейма данных. Мы транспонируем набор данных covid19_confirmed (рис. 1), используя T
, и отображаем последние 5 строк. Транспонирование Pandas отражает DataFrame по его главной диагонали, записывая строки как столбцы и наоборот.
display(covid19_confirmed.T.tail())
В транспонированном фрейме данных указаны даты в индексе и названия стран на этикетке.
Мы находим самую последнюю дату в конце столбца индекса. Мы можем использовать index.values[-1]
для извлечения последней даты.
confirmed_latest = covid19_confirmed.T.index.values[-1] display(confirmed_latest)
Результат: «09.06.20»
Есть несколько строк с одинаковым Country/Region
.
На рис. 3 выше мы можем найти 8 строк с Австралией.
Группируем их по Country/Region
и вычисляем сумму.
df_grouped_conf=covid19_confirmed.groupby('Country/Region').sum() display(df_grouped_conf.head(10))
Вот первые 10 рядов.
Раньше у нас было 266 строк, а теперь у нас 142 строки. В Австралии одна строка.
В конце df_grouped_conf
(рис. 4) указана последняя дата (в данном случае 9.06.20).
Мы собираемся отсортировать фрейм данных по этому значению, confirmed_latest
с использованием ascending=False
. Мы выбираем 10 лучших стран, используя head(10)
, и отбрасываем столбцы Lat
и Long
. Мы транспонируем фрейм данных, используя T
в конце.
df_confirmed=df_grouped_conf.sort_values(confirmed_latest,ascending=False).head(10).drop(['Lat', 'Long'],axis=1).T
Функция нескольких графиков
Другие примеры выпадающего меню Plotly можно найти здесь.
Мы создаем функцию под названием multi_plot. Для этого требуются две переменные:
df
: фрейм данных со странами в виде столбцов и строк в виде датыaddAll
: логический. Правда отображать ВСЕ в выпадающей кнопке. ВСЕ отображает сразу все страны. Устанавливаем по умолчаниюTrue
.
Мы создаем экземпляр Figure plotly.graph_objects
.
Мы используем цикл for для перебора названий округов, полученных df.columns.to_list()
.
df.columns.to_list()
возвращает список [«США», «Бразилия», «Россия»,…].
В итерации мы добавляем след к фигуре. Вы можете использовать plotly.graph_objects.Scatter
или plotly.graph_objects.Bar
для трассировки, и мы собираемся использовать Scatter
.
Мы определяем x
, y
и name
. Параметр name
устанавливает trace name
. trace name
отображается как элемент легенды при наведении курсора.
def multi_plot(df, title, addAll = True): fig = go.Figure() for column in df.columns.to_list(): fig.add_trace( go.Scatter( x = df.index, y = df[column], name = column ) ) // continue
Мы определяем словарь button_all
и функцию create_layout_button
, которые используются в update_layout
. update_layout
обновляет свойства компоновки рисунка и возвращает объект Figure.
В методе fig.update_layout()
мы используем updatemenus
, который является кортежем экземпляра plotly.graph_objects.layout.Updatemenu
.
Мы также установили yaxis_type="log"
для отображения логарифмической шкалы по оси Y и height
на 400 пикселей.
// continue button_all = dict(label = 'All', method = 'update', args = [{'visible': df.columns.isin(df.columns), 'title': 'All', 'showlegend':True}]) def create_layout_button(column): return dict(label = column, method = 'update', args = [{'visible': df.columns.isin([column]), 'title': column, 'showlegend': True}]) fig.update_layout( updatemenus=[go.layout.Updatemenu( active = 0, buttons = ([button_all] * addAll) + list(df.columns.map(lambda column: create_layout_button(column))) ) ], yaxis_type="log" ) # Update remaining layout properties fig.update_layout( title_text=title, height=800 ) fig.show()
Интерактивное раскрывающееся меню
Последняя часть использует эту функцию multi_plot.
multi_plot(df_confirmed, title="Logarithmic COVID-19 time series total confirmed by country")
Весь код
Использование для других наборов данных
В репозитории CSSEGISandData's COVID-19 Github есть еще два набора данных. Вы можете использовать тот же код для создания других графиков.
Вы можете увидеть это вживую здесь.
https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covidTrue
data/csse_covidTrue
time_series/time_series_covid19_deaths_global.csv
https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covidTrue
data/csse_covidTrue
time_series/time_series_covid19_recovered_global.csv
Заключение
Вы можете обнаружить, что Plotly имеет слишком много параметров и иногда сбивает с толку. Но образцы кодов предоставляют различные примеры, которые вы можете использовать в своем проекте по науке о данных.
Новостная рассылка
Получите полный доступ ко всем статьям на Medium, став участником.