Как сохранить выбранные данные постоянными посредством обратного вызова в кластерной гистограмме Dash / Plotly - PullRequest
0 голосов
/ 27 марта 2019

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

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

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

Из того, что я могу сказать, доступными свойствами объекта графа Plotly являются 'id', 'clickData', 'clickAnnotationData', 'hoverData', 'clear_on_unhover', 'selectedData', 'relayoutData', 'figure', 'style', 'className', 'animate', 'animation_options', 'config' и 'loading_state'.

Я исследовал все это, и, похоже, ни один из них не содержит данных, которые я ищу. Кто-нибудь знает простой способ получить доступ к этим данным?

Вот как сейчас работает мой обратный вызов:

@app.callback(
    dash.dependencies.Output('theGraph', 'figure'),
    [dash.dependencies.Input('theChecklist','values'),
    dash.dependencies.Input('theGraph', 'clickData')
    ]
)
def updateGraph(checklistValues, figureInput):

    #print to see what the variables hold
    print(checklistValues)
    print(figureInput)

    figure=go.Figure(
        data = [
            go.Bar(
                x = df[df['MyColumnName'].isin(checklistValues)].groupby('MyColumnName').size().index,
                y = df[df['MyColumnName'].isin(checklistValues)].groupby('MyColumnName').size().values,
                name = 'Bar 1'
            ),
            go.Bar(
                x = df[df['MyColumnName'].isin(checklistValues)].groupby('MyColumnName')['# cores'].sum().reset_index()['MyColumnName'],
                y = df[df['MyColumnName'].isin(checklistValues)].groupby('MyColumnName')['# cores'].sum().reset_index()['MyOtherColumnName'],
                name = 'Bar 2'
            )
        ],
        layout=go.Layout(
            title='The Title',
            showlegend=True,
            legend=go.layout.Legend(
                x=0,
                y=1.0
            ),
            margin=go.layout.Margin(l=40, r=40, t=40, b=110)
        )
    )

    return figure
...