Обновить диаграмму с помощью раскрывающихся меню

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_covidTruedata/csse_covidTruetime_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_covidTruedata/csse_covidTruetime_series/time_series_covid19_deaths_global.csv

https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covidTruedata/csse_covidTruetime_series/time_series_covid19_recovered_global.csv

Заключение

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

Новостная рассылка

Получите полный доступ ко всем статьям на Medium, став участником.