如何使用下拉列表筛选plotly图表中的df列?

2024-04-25 18:07:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试根据费用类别的下拉菜单过滤费用的曲线图。由于并非所有费用类型都每月发生,我希望图表根据所选类别显示适当的月份和费用金额。也就是说,选择“食品”应在第9个月生成一个值为5、第10个月为2的折线图,而选择“气体”将在第9个月生成一个值为1的单点

我对python相当陌生,我不确定到底是什么不起作用。每个按钮都具有正确关联的x值、y值和类别标签,但它们不会过滤plotly对象中的任何数据

我以前没有问过任何问题,所以如果我遗漏了什么,请告诉我,我可以提供更多信息。我有一个下面的reprex,我真的很感谢一些帮助。谢谢

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条回答
网友
1楼 · 发布于 2024-04-25 18:07:06
  • 对于您正在创建的图形,使用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
            ]
        }
    ]
)

enter image description here

相关问题 更多 >