【问题标题】:Plotly Dash Button Callback functionPlotly Dash 按钮回调函数
【发布时间】:2021-05-22 10:56:54
【问题描述】:

我已经创建了 2 个按钮,所以当我按下其中一个按钮时,会出现一个地图(两者都是不同的地图)但是,两个按钮最终显示的是同一个地图,看来我的回调函数不起作用。我对回调函数不是很熟悉,但这是我的代码。任何帮助将不胜感激!



import plotly.graph_objects as go
fig1_1 = go.Figure()
fig1_2 = go.Figure()

fig1_1 = go.Figure(go.Scattermapbox(
    fill = "toself",
    lon = [-74, -70, -70, -74], lat = [47, 47, 45, 45],
    marker = { 'size': 10, 'color': "orange" }))

fig1_1.update_layout(
    mapbox = {
        'style': "stamen-terrain",
        'center': {'lon': -73, 'lat': 46 },
        'zoom': 5},
    showlegend = False)

fig1_2 = go.Figure(go.Scattermapbox(
    fill = "toself",
    lon = [-60, -90, -50, -60], lat = [46, 57, 55, 45],
    marker = { 'size': 10, 'color': "yellow" }))

fig1_2.update_layout(
    mapbox = {
        'style': "stamen-terrain",
        'center': {'lon': -50, 'lat': 50 },
        'zoom': 5},
    showlegend = False)


import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from dash.exceptions import PreventUpdate
app = dash.Dash()
app.layout = html.Div([
    html.Button('Graph1', id='button', n_clicks=0),
    html.Button('Graph2',id='button2',n_clicks=0),
    dcc.Graph(id='graph',figure={})

])

@app.callback(
    Output('graph', 'figure'),
    Input('button', 'n_clicks'),
    Input('button2', 'n_clicks'))
def clicked_output(button,button2):
    if button == None:
        raise PreventUpdate
        return fig1_1
    elif button2 == None:
        raise PreventUpdate
        return fig1_2

if __name__ == '__main__':
    app.run_server(debug=True)

【问题讨论】:

  • 检查您的缩进,在 if 语句的 clicked_output 函数中,您将永远不会返回 fig1_1,因为它会引发 PreventUpdate 异常。编辑:代码编辑后,您将永远不会返回任何数字。
  • 所以我必须删除PreventUpdate吗?

标签: python plotly-dash


【解决方案1】:

您在代码中犯了一些错误。
您在 Figure 对象内发送图形。它应该通过 add_trace 发送。
我添加了捕获按钮单击的行
试试这个代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go

first = go.Scattermapbox(fill = "toself",
                         lon = [-74, -70, -70, -74], 
                         lat = [47, 47, 45, 45],
                         marker = { 'size': 10, 'color': "orange" })
first_l = dict(mapbox = {'style': "stamen-terrain",
                         'center': {'lon': -73, 'lat': 46 },
                         'zoom': 5},
               showlegend = False)
second = go.Scattermapbox(fill = "toself",
                          lon = [-60, -90, -50, -60], 
                          lat = [46, 57, 55, 45],
                          marker = { 'size': 10, 'color': "yellow" })
second_l = dict(mapbox = {'style': "stamen-terrain",
                          'center': {'lon': -50, 'lat': 50 },
                          'zoom': 5},
                showlegend = False)

app = dash.Dash()
app.layout = html.Div([
    html.Button('Graph1', id='button1', n_clicks=0),
    html.Button('Graph2', id='button2', n_clicks=0),
    dcc.Graph(id='graph')
])

@app.callback(
    Output('graph', 'figure'),
    Input('button1', 'n_clicks'),
    Input('button2', 'n_clicks'))
def clicked_output(button,button2):
    fig = go.Figure()
    changed_id = [p['prop_id'] for p in dash.callback_context.triggered][0]
    if 'button1' in changed_id:
        fig.add_trace(first)
        fig.update_layout(first_l)
    elif 'button2' in changed_id:
        fig.add_trace(second)
        fig.update_layout(second_l)
    return fig
if __name__ == '__main__':
    app.run_server(debug=True)

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 2021-02-25
    • 2020-03-17
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2020-11-21
    • 2021-08-10
    • 2022-11-15
    相关资源
    最近更新 更多