我正在尝试使用plotly来显示带有滑块和过滤器复选框下拉列表的折线图。
我的数据框(ct2)如下所示:
类别 | 日期 | 数 |
---|---|---|
A | 2022-06-01 | 123 |
B | 2022-06-02 | 56 |
C | 2022-06-03 | 42 |
C | 2022-06-01 | 84 |
A | 2022-06-05 | 32 |
我的滑块正在工作,我的下拉列表显示项目,但是当我选择类别时,它不会更新图表。
我面临两个问题:
我的代码:
import plotly.graph_objects as go
import pandas as pd
fig = go.Figure()
for Category, group in ct2.groupby("Category"):
fig.add_trace(go.Line(x= group["Date"], y= group["Count"], name= Category,
hovertemplate="Category=%s<br>Date=%%{x}<br>Count=%%{y}<extra></extra>"% Category))
fig.update_layout(legend_title_text = "Category")
fig.update_xaxes(title_text="Date")
fig.update_yaxes(title_text="Count")
fig.update_layout(
title_text="Time series with range slider and selectors"
)
fig.update_layout(
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=2,
label="2m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.update_layout(fig_tmp.layout)
fig.update_layout(
updatemenus=[
{
"buttons": [
{
"label": c,
"method": "restyle",
"args": ["visible", [t.legendgroup == c for t in fig.data]],
}
for c in ct2["Category"].unique()
]
}
]
)
fig.show()
不显示的原因是所有显示设置都是错误的。如果满足条件,则需要将条件更改为 true,否则为 false。
第二个问题是plotly的自定义控件中没有复选框。如果要选择多个类别,则应添加具有多个条件的按钮。代码如下。
{'label': 'A_C', 'method': '{'label': 'A_C', 'method': 'update','args': ['visible', [True, False, True]]}
import plotly.graph_objects as go
import pandas as pd
fig = go.Figure()
for Category, group in ct2.groupby("Category"):
fig.add_trace(go.Scatter(x= group["Date"],
y= group["Count"],
name= Category,
hovertemplate="Category=%s<br>Date=%%{x}<br>Count=%%{y}<extra></extra>"% Category,
visible=True,
))
fig.update_layout(legend_title_text = "Category")
fig.update_xaxes(title_text="Date")
fig.update_yaxes(title_text="Count")
fig.update_layout(
title_text="Time series with range slider and selectors"
)
fig.update_layout(
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=2,
label="2m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
buttons = [{'args': [{'visible': [True, False, False]}], 'label': 'A', 'method': 'update'},
{'args': [{'visible': [False, True, False]}], 'label': 'B', 'method': 'update'},
{'args': [{'visible': [False, False, True]}], 'label': 'C', 'method': 'update'},
{'args': [{'visible': [True, False, True]}], 'label': 'A_C', 'method': 'update'},
]
fig.update_layout(
updatemenus=[
{
"buttons": buttons
}
],
)
fig.show()