You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:25:05