如何使用下拉列表过滤 plotly 图表中的 df 列?

How do I use a dropdown to filter on a df column in a plotly chart?

我正在尝试根据费用类别的下拉菜单过滤费用的曲线图。由于并非所有费用类型每个月都会发生,我希望图表根据所选类别显示适当的月份和费用金额。 IE。选择“杂货”应该会在第 9 个月产生一个值为 5 的折线图,在第 10 个月会产生一个值为 2 的折线图,而选择“gas”会在第 9 个月产生一个值为 1 的点。

我是 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)
  • 对于您正在创建的图形,使用 Plotly Express
  • 要简单得多
  • 实际上,您使用 颜色 参数
  • 为每个 类别 创建了一个跟踪
  • 传说会如你所愿。通过单击其中的项目使类别可见/不可见
  • 还根据 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
            ]
        }
    ]
)