如何使用下拉列表过滤 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
]
}
]
)
我正在尝试根据费用类别的下拉菜单过滤费用的曲线图。由于并非所有费用类型每个月都会发生,我希望图表根据所选类别显示适当的月份和费用金额。 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
]
}
]
)