#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.