【发布时间】:2022-01-22 18:27:04
【问题描述】:
在此处或在 plotly 论坛上有一些关于该主题的问题,但我无法在我的仪表板上使用它并且很难找到正确的解决方案。
简而言之,为了清楚起见,我的仪表板上的一个页面包含一个输入框、一个按钮和 2x 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'),
])
])
所以我提交了一个输入,并在单击按钮时收集相应的数据(来自.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 来存储我的数据(这意味着为我的完整仪表板保存 8 或 9 个数据帧,而不仅仅是像上面的示例中的 2 个)。根据我的阅读,这会使事情变得更慢。不确定这是否重要,但对于回调我确实加载了更多的状态函数(5 个默认参数)
编辑:来自the plotly documentation:
回调第一次返回正确的输出 调用,但一旦全局 df 变量被修改,任何后续 使用该数据框的回调未使用原始数据 没有了。
这是我的问题。然而,感觉就像我正在关注他们提供的解决方案,即使用在回调中初始化的中间数据帧......
Edit2:更新
Edit3:我想我找到了一个“修复”html.Div(id='...') 是应该加载图表的地方,最初我的回调返回 dcc.Graph(id, fig)。如果我指定 dcc.Graph(id) 而不是 html.Div 作为我的图形容器并在我的回调中返回 fig ,那么这些数字就会正确更新。现在我需要弄清楚如何在开始时隐藏空图......
【问题讨论】:
-
看来无论你的输入是什么,你总是输出相同的列ind1和ind2,因为你的输入符号只被使用对于股票代码,股票代码不用于更改图表。假设您加载的 2 个 JSON 文件始终相同,那么您的图表也将相同。这就是为什么当您重新绘制图表时它们不会更新的原因,因为无论您的输入是什么,您的代码都不会更改图表!
-
嗨,我应该指定 df1 和 df2 的获取数据功能取决于输入框中输入的符号。例如,在调试模式下,在输入框中输入“IBM”作为符号后,我看到 df1 和 df2 填充了 IBM 的数据。因为这是我第一次输入一个恢复程序将生成图形的符号。但是,如果我随后输入“AAPL”作为符号,我会看到 df1 和 df2 使用相应的 AAPL 数据进行了更新,但没有更新图表。
-
您能否提供完整的脚本以确保完整性,因为很难说是什么问题,因为图表应该根据您所说的内容进行更新。
-
我将完整的回调方法添加为 Edit2
标签: python-3.x plotly plotly-dash plotly-python