Python Plotly Dash实时更新图表:如何删除旧点仅绘制最新数据点
Plotly Dash 实时图表仅保留最新数据点实现方案
完全可以实现,不需要修改你现有的回调刷新逻辑,只需要在数据读取环节对数据集做截断,丢弃最早的历史数据即可。
核心问题原因
你当前的代码每次触发刷新都会全量读取CSV内的所有数据绘图,随着CSV不断写入新数据,图表上的历史点会持续累积。
可选实现逻辑
根据你的业务场景二选一即可:
- 固定点数保留:明确指定图表最多展示N个最新数据点,新数据传入后自动丢弃最早的点,适合采样频率固定的场景
- 时间窗口保留:如果CSV内包含时间戳字段,可以仅保留最近T时长内传入的所有数据点,适合需要严格按时间范围展示的场景
参考修改代码
以下是固定保留最新30个点的实现版本,你可以根据自己的需求调整保留点数:
import pandas as pd import dash import plotly.graph_objects as go # 旧版本Dash可保留原来的dash_core_components、dash_html_components导入方式 from dash import dcc, html from dash.dependencies import Input, Output app = dash.Dash(__name__) app.title = "Sistem de detectie al punctului mort" # 配置图表最多保留的最新数据点数量 MAX_DISPLAY_POINTS = 30 def _create_fig(): df = pd.read_csv('/home/pi/tflite1/csv_data_file.csv') df.columns=['x','y'] # 核心操作:仅取数据集末尾最新的N条数据,更早的历史点直接丢弃不参与绘图 df_show = df.tail(MAX_DISPLAY_POINTS) return go.Figure( data=go.Scatter( x=df_show['x'], y=df_show['y'], mode='markers' ), layout=go.Layout( # 可选配置:固定坐标轴范围,避免开启动画时图表因数据变化频繁跳变 xaxis_range=[df['x'].min(), df['x'].max()], yaxis_range=[df['y'].min(), df['y'].max()] ) ) app.layout = html.Div([ dcc.Graph( id='g1', animate = True, figure=_create_fig() ), dcc.Interval( id='interval-component', interval=1*1000, # 刷新间隔1秒 n_intervals=0 ) ]) @app.callback( Output('g1', 'figure'), Input('interval-component', 'n_intervals') ) def refresh_data(n_clicks): return _create_fig() if __name__ == "__main__": app.run_server(host='0.0.0.0', debug=True, port=8099)
注意事项
- 不建议通过直接修改原CSV、删除旧行的方式实现需求,在树莓派这类设备上频繁磁盘写入删除会增加IO负载,内存中截断数据的方式性能开销更低
- 如果需要用时间窗口筛选,只需要把
df.tail()的逻辑替换为按时间戳字段过滤即可,比如筛选df[df['timestamp'] > time.time() - 10]就能保留最近10秒的数据 - 如果关闭了动画效果,可以不用固定坐标轴范围,让Plotly自动适配当前展示数据的范围即可
内容的提问来源于stack exchange,提问作者Laura Rosu
相关产品推荐
相关产品推荐

