Plotly / Dash:多个过滤器
Plotly / Dash: Multiple filters
我想实施一些数据过滤器以按特定标准预先select 数据。这些过滤器本身应该是图表,即饼图(例如可以 select 一个大陆)和时间线(例如可以 select 一个时间跨度)。最重要的是,我需要 从多个图表中应用多个过滤器,而不是每次我通过 select 过滤另一个图表 .
时重置它们
但是,我不知道如何实现这个。我使用 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)
现在您的问题似乎是在 graph
组件图中的任何图表中选择数据,即 您函数的输出 ,触发Input(graph
,'selectedData') 到同一个函数!
所以你需要做的是将图表分成单独的dcc.Graph事物并使用dash.dependencies.State
来监听和维护每个图表的selectedData
属性.
感谢您的回答。我设法找到了解决方法。
首先,正如@russellr所说,dash.dependencies.State
可以传,但不会触发回调。我希望在多个过滤器上触发回调,而不需要它们相互重置。
现在,对于 Dash 的好人来说,禁用此重置将启用无限循环,因此禁用它有很多意义。
我的做法是引入Dropdown
列表进行过滤,回调只从Dropdown的value
到图表的figure
我 select 下拉列表中的多个条件,从中获取(非交互式)可视化效果。它可能不那么漂亮,但该应用程序仍然获得了良好的可用性反馈。
我想实施一些数据过滤器以按特定标准预先select 数据。这些过滤器本身应该是图表,即饼图(例如可以 select 一个大陆)和时间线(例如可以 select 一个时间跨度)。最重要的是,我需要 从多个图表中应用多个过滤器,而不是每次我通过 select 过滤另一个图表 .
时重置它们但是,我不知道如何实现这个。我使用 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)
现在您的问题似乎是在 graph
组件图中的任何图表中选择数据,即 您函数的输出 ,触发Input(graph
,'selectedData') 到同一个函数!
所以你需要做的是将图表分成单独的dcc.Graph事物并使用dash.dependencies.State
来监听和维护每个图表的selectedData
属性.
感谢您的回答。我设法找到了解决方法。
首先,正如@russellr所说,dash.dependencies.State
可以传,但不会触发回调。我希望在多个过滤器上触发回调,而不需要它们相互重置。
现在,对于 Dash 的好人来说,禁用此重置将启用无限循环,因此禁用它有很多意义。
我的做法是引入Dropdown
列表进行过滤,回调只从Dropdown的value
到图表的figure
我 select 下拉列表中的多个条件,从中获取(非交互式)可视化效果。它可能不那么漂亮,但该应用程序仍然获得了良好的可用性反馈。