Je voudrais implémenter quelques filtres de données pour présélectionner les données selon certains critères. Ces filtres doivent être des diagrammes eux-mêmes, c'est-à-dire un graphique à secteurs (par exemple, où l'on peut sélectionner un continent) et une ligne de temps (par exemple, où l'on peut sélectionner une période de temps). Plus important encore, je dois appliquer plusieurs filtres à partir de plusieurs diagrammes sans les réinitialiser à chaque fois que je filtre en sélectionnant un autre diagramme .

Cependant, je ne sais pas comment implémenter cela. J'ai trouvé quelque chose d'ancien en utilisant dash.dependencies.Events, mais ce n'est plus supporté.

Chaque fois que je filtre par un critère du diagramme A et que je souhaite ensuite filtrer par un autre critère du diagramme B, le diagramme A est réinitialisé.

Étant donné que c'est probablement une situation rencontrée par de nombreuses personnes, et comme dash ne semble pas prendre en charge cela de manière native, je voulais demander si quelqu'un a une solution de contournement à ce sujet?

// edit: Voici un exemple simple. Je peux filtrer en cliquant sur un point de donnée sur le graphique à barres ci-dessus. Mais chaque fois que je clique sur un point du graphique linéaire ci-dessous, cela réinitialise les paramètres du graphique à barres. Je veux garder les deux.

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)
0
Marc Mingoulis 11 mars 2019 à 16:21

2 réponses

Meilleure réponse

Merci pour vos réponses. J'ai réussi à trouver une solution de contournement.

Tout d'abord, comme @russellr l'a mentionné, dash.dependencies.State peut être transmis, mais il ne déclenchera pas de rappel. J'aimerais que les rappels soient déclenchés sur plusieurs filtres sans qu'ils ne se réinitialisent.

Maintenant, pour les bonnes personnes de Dash, la désactivation de cette réinitialisation permettrait des boucles sans fin, il est donc très judicieux de la désactiver.

La façon dont je l'ai fait est que j'ai introduit des listes Dropdown pour le filtrage, et les rappels vont uniquement du value de la liste déroulante au figure du graphique.

Je sélectionne plusieurs conditions dans les listes déroulantes, j'obtiens les visualisations (non interactives). Ce n'est peut-être pas aussi joli, mais l'application a quand même reçu de bons commentaires sur l'utilisabilité.

0
Wai Ha Lee 26 mars 2019 à 10:38

À l'heure actuelle, il semble que votre problème soit que la sélection de données dans l'un des graphiques de la figure du composant graph, c'est-à-dire la sortie de votre fonction , déclenche l'entrée (graph , 'selectedData') à cette même fonction!

Donc, ce que vous devez faire est de séparer les graphiques en éléments dcc.Graph séparés et d'utiliser dash.dependencies.State pour écouter et maintenir la propriété selectedData de chaque graphique.

0
russellthehippo 13 mars 2019 à 16:34