Как обновить карту хороплета в Dash - PullRequest
0 голосов
/ 11 мая 2019

Я делаю веб-приложение, используя Python и Dash, это веб-приложение включает в себя карту мира с данными на основе выбранного года. Я хочу иметь возможность изменить год, а также обновить карту, чтобы соответствовать этому году. Я предпочитаю делать это с помощью ползунка «Тире», хотя я бы также оценил любой другой способ.

Я пытался обновить другие графики, такие как линейные диаграммы, с помощью ввода текста, и это сработало, но когда я изменил его на карту хороплета, он перестал обновляться. Теперь он только создает карту, но обновления на ней не отображаются. Я поместил некоторый печатный текст в функцию обновления, и он подтвердил, что он на самом деле вызывается, когда я изменяю ввод, но график просто не обновляется.

Макет: с помощью dcc.input я хочу обновить html.Div 'my-div'

app.layout = html.Div( children=[
    html.H1(
        children='UN Sustainable Development goal: Poverty',
        style={
            'textAlign': 'center',
            'color': colors
        }
    ),
    dcc.Input(id='my-id',value='30', type='text'),
    html.Div(id='my-div')
    ,
    daq.Slider(
        id='my-daq-slider',
        min=1,
        max=sliderlength,
        step=1,
    ),
    html.Div(id='slider-output')




],        style={
        'textAlign': 'center'
    })

Часть обновления

@app.callback(
    Output('my-div', 'children'),
    [Input('my-id', 'value')])

def update_output_div(input_value):
    return dcc.Graph(
        id='my-div',

        figure={'data': [go.Choropleth(
    locations = df_pov['Country Code'],
    z = df_pov.iloc[:,int(input_value)],
    text = df_pov['Country Name'],

    autocolorscale = True,
    reversescale = False,
    marker = go.choropleth.Marker(
        line = go.choropleth.marker.Line(
            color = 'rgb(180,180,180)',
            width = 0.5
        )),
    colorbar = go.choropleth.ColorBar(
        tickprefix = '%',
        title = '%  below 1.90$ '),
)],
                'layout': go.Layout(
    title = go.layout.Title(
        text = list(df_pov)[int(input_value)]
    ),
    geo = go.layout.Geo(
        showframe = False,
        showcoastlines = False,
        projection = go.layout.geo.Projection(
            type = 'equirectangular'
        )
    ),
    annotations = [go.layout.Annotation(
        x = 0.55,
        y = 0.1,
        xref = 'paper',
        yref = 'paper',
        text = 'Source: Kaggle',
        showarrow = False
    )]
)            
        }
    )

То, что я ожидал: для обновления хороплета при изменении ввода текста или ввода с помощью ползунка. Фактически: карта создается один раз (с той же функцией, которая должна ее обновлять), но не обновляется.

1 Ответ

0 голосов
/ 12 мая 2019

Dash не любит, когда новые компоненты загружаются вот так.Попробуйте инициализировать свой график, добавив пустой график в макет, как показано ниже:

html.Div(id='my-div', children=[
        dcc.Graph(
            id='my-graph-id',
            figure=dict(
                data=[],
                layout={},
            ),
        )
    ])

Поскольку график уже находится на странице, вам придется изменить обратный вызов, чтобы он обновлял реквизит figureGraph вместо children из div.

Кроме того, у вас есть несколько одинаковых идентификаторов.Дэш не любит это.Убедитесь, что каждый идентификатор уникален.Если все это по-прежнему не работает, возможно, мне придется попросить вас опубликовать более подробную информацию, чтобы я мог помочь вам в дальнейшем.Удачи!

...