Plotly / Dash: несколько фильтров - PullRequest
0 голосов
/ 11 марта 2019

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

Однако я не знаю, как это реализовать. Я нашел что-то старое, используя dash.dependencies.Events, но это больше не поддерживается.

Всякий раз, когда я фильтрую по критерию на диаграмме А, а затем хочу фильтровать по другому критерию из диаграммы Б, диаграмма А сбрасывается.

Поскольку это, вероятно, ситуация, с которой сталкиваются многие люди, и поскольку dash, похоже, не поддерживает это изначально, я хотел спросить, есть ли у кого-нибудь обходной путь?

// edit: Вот простой пример. Я могу отфильтровать, нажав на точку данных на гистограмме выше. Но всякий раз, когда я нажимаю на точку на линейном графике ниже, он сбрасывает настройки из гистограммы. Я хочу оставить оба.

import datetime

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

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
        dcc.Graph(id='graph')
    ])

# Multiple components can update everytime interval gets fired.
@app.callback(Output('graph', 'figure'),
              [Input('graph', 'selectedData')])
def update_graph_live(input):
    print(input)
    data = {
        'x': [1,2,3,4,5],
        'y': [1,2,3,4,5],
        'a': [0,-1,-2],
        'b': [100,101,102]
    }

    # Create the graph with subplots
    fig = plotly.tools.make_subplots(rows=2, cols=1, vertical_spacing=0.2)
    fig['layout']['margin'] = {
        'l': 30, 'r': 10, 'b': 30, 't': 10
    }
    fig['layout']['legend'] = {'x': 0, 'y': 1, 'xanchor': 'left'}
    fig['layout']['clickmode'] = 'event+select'

    fig.append_trace({
        'x': data['x'],
        'y': data['y'],
        'name': 'xy',
        'type': 'bar',
    }, 1, 1)
    fig.append_trace({
        'x': data['a'],
        'y': data['b'],
        'name': 'ab',
        'mode': 'lines+markers',
        'type': 'scatter'
    }, 2, 1)

    return fig


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

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Спасибо за ваши ответы.Мне удалось найти обходной путь.

Прежде всего, как упомянул @russellr, dash.dependencies.State может быть пропущено, но оно не вызовет обратный вызов.Я хотел бы, чтобы обратные вызовы запускались на нескольких фильтрах без их сброса друг друга.

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

То, как я это сделал, я ввел Dropdown списки для фильтрации, а обратные вызовы идут только от value раскрывающегося списка к figure графика.

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

0 голосов
/ 13 марта 2019

Сейчас кажется, что ваша проблема в том, что при выборе данных на любом из графиков на рисунке компонента graph, то есть вывод вашей функции , запускается ввод (graph, 'selectedData ') для этой же функции!

Итак, вам нужно разделить графики на отдельные элементы dcc.Graph и использовать dash.dependencies.State для прослушивания и поддержки свойства selectedData каждого графика.

...