剧情/破折号:多个过滤器

时间:2019-03-11 13:21:12

标签: python reactjs plotly plotly-dash

我想实现一些数据过滤器,以根据特定条件预选数据。这些过滤器应为图表本身,即饼图(例如,一个人可以选择一个大陆)和时间线(例如,一个人可以选择一个时间跨度)。最重要的是,我需要在多重图上应用多个过滤器,而不必在每次通过选择另一个图进行过滤时都将它们重置。

但是,我不知道该如何实现。我使用dash.dependencies.Events找到了一些旧的东西,但是现在不再支持了。

每当我按图A中的一个标准过滤,然后又想按图B中的另一个标准过滤时,图A就会重置。

由于这可能是许多人遇到的情况,并且由于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 :(得分:0)

现在,看来您的问题是在graph组件图中的任何图形中选择数据,即函数的输出,会触发Input({{ 1}},'selectedData')转到相同的功能!

因此,您需要做的是将图分成单独的dcc.Graph内容,并使用graph来监听和维护每个图的dash.dependencies.State属性。

答案 1 :(得分:0)

谢谢您的回答。我设法找到一种解决方法。

首先,如@russellr所述,dash.dependencies.State可以传递,但不会触发回调。我希望在多个过滤器上触发回调,而无需彼此重置。

现在,对于Dash的好人来说,禁用此重置将启用无穷循环,因此禁用它有很多意义。

我这样做的方式是,我引入了Dropdown列表进行过滤,并且回调仅从Dropdown的value到图形的figure

我在下拉菜单中选择了多个条件,并从中获得了(非交互式)可视化效果。可能不那么漂亮,但是该应用仍然获得了良好的可用性反馈。