向用户发出丢失数据的信号
Signal missing data to user
我有一个折线图,用户可以在其中 select x 范围。然后回调从数据库请求给定 x 范围的数据并显示它。
但是,可能没有选择的x范围内的任何数据,导致图表空洞,看起来有点笨拙。向用户发出 selected x 范围内没有数据的好方法是什么?
这是我整理的一个小例子。通过在图表上拖动-selection 选择 4 到 11(不包括)之间的一些 x 范围将导致一个空图表。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go
app = dash.Dash()
app.layout = html.Div([dcc.Graph(id='my-graph'), dcc.Store(id='my-data')])
@app.callback(Output('my-data', 'data'),
Input('my-graph', 'relayoutData'),)
def update_data(relayout_data):
start, end = 1, 14
if isinstance(relayout_data, dict):
if 'xaxis.range[0]' in relayout_data and 'xaxis.range[1]' in relayout_data:
start = relayout_data['xaxis.range[0]']
end = relayout_data['xaxis.range[1]']
return pull_data(start, end)
def pull_data(start, end): # imagine this being a DB request or similar
x = [1,2,3,4,11,12,13,14]
x = [i for i in x if start <= i <= end]
y = [i**2 for i in x]
return [x,y]
@app.callback(Output('my-graph', 'figure'),
Input('my-data', 'data'),)
def update_graph(data):
print("selected data:", data)
x, y = data
fig = go.Figure(data=go.Scatter(x=x, y=y))
fig.update_yaxes(fixedrange=True)
if not x:
pass # what could I do here?
return fig
if __name__ == '__main__':
app.run_server(debug=True)
我现在找到的一种方法是添加一个非常明显的注释来通知用户丢失的数据,如下所示:
if not x:
fig.add_annotation(text='No data in chosen x range',
xref='paper', yref='paper', x=0.5, y=0.5, showarrow=False,
font=dict(size=24), bgcolor="rgba(255,127,14,0.5)",)
确切位置(x
和y
)、font
、size
和bgcolor
当然可以调整。还可以使用 fig.add_annotation
的 visible
参数进行进一步控制。
问题中选择的示例仍然有点笨拙,因为 x 轴范围不会准确,但至少告诉用户发生了什么。
编辑:在后来的用例中,拥有准确的 x 轴范围对我来说很重要,其中 x 轴是日期类型。幸运的是,如果还存储了所选范围的 start
和 end
,则手动设置很容易,如下所示:fig.update_xaxes(range=[start,end])
我有一个折线图,用户可以在其中 select x 范围。然后回调从数据库请求给定 x 范围的数据并显示它。
但是,可能没有选择的x范围内的任何数据,导致图表空洞,看起来有点笨拙。向用户发出 selected x 范围内没有数据的好方法是什么?
这是我整理的一个小例子。通过在图表上拖动-selection 选择 4 到 11(不包括)之间的一些 x 范围将导致一个空图表。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go
app = dash.Dash()
app.layout = html.Div([dcc.Graph(id='my-graph'), dcc.Store(id='my-data')])
@app.callback(Output('my-data', 'data'),
Input('my-graph', 'relayoutData'),)
def update_data(relayout_data):
start, end = 1, 14
if isinstance(relayout_data, dict):
if 'xaxis.range[0]' in relayout_data and 'xaxis.range[1]' in relayout_data:
start = relayout_data['xaxis.range[0]']
end = relayout_data['xaxis.range[1]']
return pull_data(start, end)
def pull_data(start, end): # imagine this being a DB request or similar
x = [1,2,3,4,11,12,13,14]
x = [i for i in x if start <= i <= end]
y = [i**2 for i in x]
return [x,y]
@app.callback(Output('my-graph', 'figure'),
Input('my-data', 'data'),)
def update_graph(data):
print("selected data:", data)
x, y = data
fig = go.Figure(data=go.Scatter(x=x, y=y))
fig.update_yaxes(fixedrange=True)
if not x:
pass # what could I do here?
return fig
if __name__ == '__main__':
app.run_server(debug=True)
我现在找到的一种方法是添加一个非常明显的注释来通知用户丢失的数据,如下所示:
if not x:
fig.add_annotation(text='No data in chosen x range',
xref='paper', yref='paper', x=0.5, y=0.5, showarrow=False,
font=dict(size=24), bgcolor="rgba(255,127,14,0.5)",)
确切位置(x
和y
)、font
、size
和bgcolor
当然可以调整。还可以使用 fig.add_annotation
的 visible
参数进行进一步控制。
问题中选择的示例仍然有点笨拙,因为 x 轴范围不会准确,但至少告诉用户发生了什么。
编辑:在后来的用例中,拥有准确的 x 轴范围对我来说很重要,其中 x 轴是日期类型。幸运的是,如果还存储了所选范围的 start
和 end
,则手动设置很容易,如下所示:fig.update_xaxes(range=[start,end])