Как использовать раскрывающийся список для фильтрации столбца df на диаграмме с плотностью?

#python #plotly-python

Вопрос:

Я пытаюсь отфильтровать график расходов на основе выпадающего меню категорий расходов. Поскольку не все типы расходов происходят каждый месяц, я хотел бы, чтобы на диаграмме отображались соответствующие месяцы и суммы расходов в зависимости от выбранной категории. Т. Е. Выбор «бакалея» должен привести к линейному графику со значением 5 в 9 месяце и значением 2 в 10 месяце, в то время как выбор «газ» даст одну точку со значением 1 в 9 месяце.

Я довольно новичок в python и не уверен, что именно не работает. Каждая кнопка имеет правильно связанные значения x, значения y и метки категорий, но они не фильтруют какие-либо данные в объекте plotly.

Я раньше не задавал здесь вопросов, поэтому, если я что-то упускаю, пожалуйста, дайте мне знать, и я смогу предоставить дополнительную информацию. У меня есть репрекс ниже, и я действительно ценю некоторую помощь. Спасибо!

 import plotly.graph_objects as go
import pandas as pd
budget = pd.DataFrame({"month":[9,9,10,10],
                       "year":[2020,2021,2020,2021],
                       "expense":[5,1,4,2],
                       "category":['groceries', 'gas', 'utilities', 'groceries']})

budget_fig = go.Figure()
budget_fig.add_trace(go.Scatter(x=budget.month, y=budget.expense))

budget_update_menu = []
budget_buttons = []

for cat in budget['category'].unique():
  budget_buttons.append(dict(method='update',
                          label=cat,
                          args=[{
                              'x': budget[budget.category == cat].month.values,
                              'y': budget[budget.category == cat].expense.values
                          }])
  )

budget_menu = dict()
budget_update_menu.append(budget_menu)
budget_update_menu[0]['buttons']=budget_buttons
budget_update_menu[0]['direction']='down'
budget_update_menu[0]['showactive']=True

budget_fig.update_layout(updatemenus = budget_update_menu)
 

Ответ №1:

  • Для фигуры, которую вы создаете, гораздо проще использовать Plotly Express
  • эффективно вы создаете трассировку для каждой категории, используя параметр color
  • легенда сделает то, что вы хотите. Сделайте категории видимыми / невидимыми, щелкнув по элементам внутри них
  • также было создано выпадающее меню, основанное на информации на рисунке, созданном Plotly Express
 import plotly.express as px
import pandas as pd

budget = pd.DataFrame(
    {
        "month": [9, 9, 10, 10],
        "expense": [5, 1, 4, 2],
        "category": ["groceries", "gas", "utilities", "groceries"],
    }
)

fig = px.line(budget, x="month", y="expense", color="category").update_traces(
    mode="lines markers"
)

fig.update_layout(
    updatemenus=[
        {
            "buttons": [
                {
                    "label": t.name,
                    "method": "restyle",
                    "args": [{"visible": [t2.name == t.name for t2 in fig.data]}],
                }
                for t in fig.data
            ]
        }
    ]
)
 

введите описание изображения здесь

Комментарии:

1. Могу ли я добавить второй параметр для фильтрации в этой структуре? Т. Е. если я добавил переменную year в df.