绘图刷新按钮不更新我的图形



这里或plotly论坛上都有一些关于这个主题的问题,但我无法在我的仪表板上进行操作,很难找到正确的解决方案。

简而言之,为了清晰起见,我的仪表板上有一个页面包含一个输入框、一个按钮和两个Div,其中加载了两个图形。

layout = html.Div([
dbc.Container([
dbc.Row([
dbc.Col('Symbol: '),
dbc.Col(dcc.Input(id='pcal_symbol', placeholder='enter a stock ticker')),
]),
html.Br(),
dbc.Row([html.Button("Plot", id='submit_pcal', n_clicks=0)]),
html.Br(),
html.Div(id='pcal_rv_graph'),
html.Div(id='pcal_rv_perc_graph'),
])
])

因此,我提交了一个Input,点击按钮后,我收集了相应的数据(来自.json平面文件(,并生成了两个图。在论坛上阅读了这个问题后,我似乎需要从回调中将json加载到数据帧中(而不是将数据帧作为局部变量延迟(。这是我的回拨:

@app.callback(
[
Output('pcal_rv_graph', 'children'),
Output('pcal_rv_perc_graph', 'children')
],
[
Input('submit_pcal', 'n_clicks'),
],
[
State('pcal_symbol', 'value'),
],
prevent_initial_call=True
)
def update_plot(n_clicks, symbol):
if n_clicks is not None:
ticker = str(symbol).upper()
fig1 = go.Figure()
fig2 = go.Figure()
#fecth the data
df1 = pd.read_json(...)
df2 = pd.read_json(...)
fig1.add_trace(go.Scatter(x=df1['date'], y=df1['ind1'], mode='lines+markers'))
fig2.add_trace(go.Scatter(x=df2['date'], y=df2['ind2'], mode='lines+markers'))    
return [dcc.Graph(id='pcal_rv_graph', figure=fig1),
dcc.Graph(id='pcal_rv_perc_graph', figure=fig2)]

第一次在输入框中输入符号时,图形会正确显示;但如果我将输入更改为另一个符号,则图形不会更新。调试时,我可以看到新符号正在更新,数据正在提取,但不知何故,图形不会更新。我认为我不需要dbc Interval组件,因为我的数据源每天都在更新,所以这不适用于实时图。此外,我正在回调中加载数据,我不希望有一些隐藏的Div来存储我的数据(这意味着为我的完整dahsborard保存8或9个数据帧,而不是像上面的例子中那样只保存2个(。从我读到的内容来看,这会让事情变得更慢。不确定这是否重要,但对于回调,我确实加载了更多的State函数(5个默认参数(

编辑:从绘图文档:

回调第一次返回正确的输出调用,但一旦修改了全局df变量,则任何后续使用该数据帧的回调没有使用原始数据不再

这是我的问题。然而,我感觉我在遵循他们提供的解决方案,即使用在回调中初始化的中间数据帧。。。

第2版:更新

第三版:我想我找到了一个;"修复";html。Div(id="…"(是应该加载图的地方,最初我的回调返回dcc。图形(id,fig(。如果我指定dcc。图形(id(而不是html。Div作为我的图形容器,并在我的回调中返回fig,然后正确更新图形。现在我需要弄清楚如何在开始时隐藏空图。。。

我在OP中使用Edit3解决了这个问题,并使用这个答案将数字初始化为空白数字

最新更新