如何实现Dash应用每次打开时自动生成新DataFrame用于绘图?
解决Dash应用每次打开生成新DataFrame的问题
你的原始代码中,plot()函数是在应用启动时就执行的(因为figure = plot()是在定义布局时直接赋值),所以所有用户打开应用都会看到同一个静态图表,不会生成新的DataFrame。要实现每次用户打开应用都生成新的DataFrame并绘图,需要使用Dash的回调机制动态生成图表。
下面是两种可行的实现方案:
方案一:使用dcc.Interval触发初始化回调
通过一个仅触发一次的定时器组件,在用户加载页面时触发回调生成新图表:
import dash from dash import html, dcc, Input, Output import plotly.express as px import pandas as pd import numpy as np from datetime import datetime, timedelta # 定义生成新DataFrame的函数 def get_new_data_frame(): # 示例:生成最近7天的随机数据 dates = [datetime.today() - timedelta(days=i) for i in range(7)] dates.reverse() counts = np.random.randint(1, 20, size=7) return pd.DataFrame({'date': dates, 'count': counts}) app = dash.Dash(__name__) app.layout = html.Div(children=[ html.H1(children='New DataFrame and Plot Every Time'), dcc.Graph(id='example-graph'), # 隐藏的定时器,仅在页面加载时触发一次 dcc.Interval( id='init-interval', interval=1, # 立即触发 n_intervals=0, max_intervals=1 # 仅执行一次 ) ]) # 回调函数:生成新图表 @app.callback( Output('example-graph', 'figure'), Input('init-interval', 'n_intervals') ) def update_graph(n): dataframe = get_new_data_frame() fig = px.bar(dataframe, x='date', y='count') return fig if __name__ == '__main__': app.run_server(debug=True)
方案二:使用dcc.Location监听页面加载
通过监听URL路径变化(页面加载时路径会被触发)来生成新图表:
import dash from dash import html, dcc, Input, Output import plotly.express as px import pandas as pd import numpy as np from datetime import datetime, timedelta def get_new_data_frame(): dates = [datetime.today() - timedelta(days=i) for i in range(7)] dates.reverse() counts = np.random.randint(1, 20, size=7) return pd.DataFrame({'date': dates, 'count': counts}) app = dash.Dash(__name__) app.layout = html.Div(children=[ dcc.Location(id='url', refresh=True), # 监听URL变化 html.H1(children='New DataFrame and Plot Every Time'), dcc.Graph(id='example-graph') ]) @app.callback( Output('example-graph', 'figure'), Input('url', 'pathname') ) def update_graph(pathname): dataframe = get_new_data_frame() fig = px.bar(dataframe, x='date', y='count') return fig if __name__ == '__main__': app.run_server(debug=True)
工作原理说明
两种方案的核心都是利用Dash的回调机制,将图表的生成逻辑从应用启动时的静态赋值,改为用户访问页面时的动态执行:
- 每次用户打开或刷新页面,回调函数都会被触发,调用
get_new_data_frame()生成全新的数据集,再绘制图表。 - 每个用户的请求都会独立触发回调,因此不同用户(或同一用户多次刷新)都会得到不同的DataFrame和图表。
内容的提问来源于stack exchange,提问作者Devendra Yadav
相关产品推荐
相关产品推荐

