如何在 Plotly Dash 中过滤热图色标?
How to filter heatmap colorscale in Plotly Dash?
我是 plotly dash 的新手。我正在尝试创建一个交互式仪表板,我可以在其中过滤颜色条以查看上限值,例如,如果值为 3000,则它是红色的,因此如果我输入 3000 作为输入,它仍然是红色的,但图表不会显示更少的值超过 3000。我可以添加过滤选项,但是当我过滤时(我在 go heatmap 中使用了 zmin),色标也会发生变化。我可以保留以前的色标,这样如果我选择 zmin,它会使用原始色标刷新图形但过滤大于 zmin 的值吗?这是我到目前为止编写的代码 -
app.layout = html.Div(children=[
html.H1(children='Title'),
dcc.Graph(
id='graph',
figure=fig
),
dcc.Input(
id="input", type="number", value=0
)
])
@app.callback(
Output('graph', 'figure'),
Input('input', 'value')
)
def update_figure(input):
frames = []
for d, i in enumerate(sorted(timestamp_list)):
frames.append(
go.Frame(
name=time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(int(i) / 1000)),
data=[
go.Heatmap(z=df_dict[i],
x=df_dict[i].columns,
y=df_dict[i].index,
zmin=input,
zmax=max(value_list))
]
)
)
yaxis_name = kind.split("_")[0]
xaxis_name = kind.split("_")[1]
fig = go.Figure(
data=frames[0].data,
frames=frames,
layout=go.Layout(
autosize=True,
height=800,
yaxis={"title": yaxis_name, "dtick": 1},
xaxis={"title": xaxis_name, "tickangle": 45, "side": 'top'},
),
)
# finally, create the slider
fig.update_layout(
updatemenus=[{
'buttons': [
{
'args': [None, {'frame': {'duration': 500, 'redraw': True},
'transition': {'duration': 500, 'easing': 'quadratic-in-out'}}],
'label': 'Play',
'method': 'animate'
},
{
'args': [[None], {'frame': {'duration': 0, 'redraw': False},
'mode': 'immediate',
'transition': {'duration': 0}}],
'label': 'Pause',
'method': 'animate'
}
],
'direction': 'left',
'pad': {'r': 10, 't': 100},
'showactive': False,
'type': 'buttons',
'x': 0.1,
'xanchor': 'right',
'y': 0,
'yanchor': 'top'
}],
sliders=[{"steps": [{"args": [[f.name], {"frame": {"duration": 0, "redraw": True},
"mode": "immediate", }, ],
"label": f.name, "method": "animate", }
for f in frames],
}]
)
return fig
这是我得到的示例输出-
过滤后-
我不完全确定我理解你的意思,但仅仅过滤你的数据还不够吗?我也没有你的数据是什么样子的例子,但你为什么不在绘图之前尝试过滤你的数据框呢?
data_to_plot = frames[frames['your_column'] > zmin]
我是 plotly dash 的新手。我正在尝试创建一个交互式仪表板,我可以在其中过滤颜色条以查看上限值,例如,如果值为 3000,则它是红色的,因此如果我输入 3000 作为输入,它仍然是红色的,但图表不会显示更少的值超过 3000。我可以添加过滤选项,但是当我过滤时(我在 go heatmap 中使用了 zmin),色标也会发生变化。我可以保留以前的色标,这样如果我选择 zmin,它会使用原始色标刷新图形但过滤大于 zmin 的值吗?这是我到目前为止编写的代码 -
app.layout = html.Div(children=[
html.H1(children='Title'),
dcc.Graph(
id='graph',
figure=fig
),
dcc.Input(
id="input", type="number", value=0
)
])
@app.callback(
Output('graph', 'figure'),
Input('input', 'value')
)
def update_figure(input):
frames = []
for d, i in enumerate(sorted(timestamp_list)):
frames.append(
go.Frame(
name=time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(int(i) / 1000)),
data=[
go.Heatmap(z=df_dict[i],
x=df_dict[i].columns,
y=df_dict[i].index,
zmin=input,
zmax=max(value_list))
]
)
)
yaxis_name = kind.split("_")[0]
xaxis_name = kind.split("_")[1]
fig = go.Figure(
data=frames[0].data,
frames=frames,
layout=go.Layout(
autosize=True,
height=800,
yaxis={"title": yaxis_name, "dtick": 1},
xaxis={"title": xaxis_name, "tickangle": 45, "side": 'top'},
),
)
# finally, create the slider
fig.update_layout(
updatemenus=[{
'buttons': [
{
'args': [None, {'frame': {'duration': 500, 'redraw': True},
'transition': {'duration': 500, 'easing': 'quadratic-in-out'}}],
'label': 'Play',
'method': 'animate'
},
{
'args': [[None], {'frame': {'duration': 0, 'redraw': False},
'mode': 'immediate',
'transition': {'duration': 0}}],
'label': 'Pause',
'method': 'animate'
}
],
'direction': 'left',
'pad': {'r': 10, 't': 100},
'showactive': False,
'type': 'buttons',
'x': 0.1,
'xanchor': 'right',
'y': 0,
'yanchor': 'top'
}],
sliders=[{"steps": [{"args": [[f.name], {"frame": {"duration": 0, "redraw": True},
"mode": "immediate", }, ],
"label": f.name, "method": "animate", }
for f in frames],
}]
)
return fig
这是我得到的示例输出-
我不完全确定我理解你的意思,但仅仅过滤你的数据还不够吗?我也没有你的数据是什么样子的例子,但你为什么不在绘图之前尝试过滤你的数据框呢?
data_to_plot = frames[frames['your_column'] > zmin]