如何用Python实现基于MySQL数据库的Plotly实时更新图表?
实现Plotly实时更新MySQL数据图表
你的代码目前是一次性查询数据库并生成静态图表,要实现自动更新,需要用Dash(Plotly的交互式应用框架)配合定时器来周期性刷新数据并更新图表。以下是修改后的完整代码:
import pymysql import pandas as pd import plotly.graph_objects as go import dash from dash import dcc, html, Input, Output # 初始化Dash应用 app = dash.Dash(__name__) # 封装数据库查询逻辑,每次更新时重新获取最新数据 def get_sensor_data(): myMyConn = pymysql.connect(user='ID', password='PW', host='IP', port=#####,charset='utf8', database='###') sql = """ SELECT X_Axis_CrestFactor, Y_Axis_CrestFactor, Z_Axis_CrestFactor, created_at FROM sensor_data WHERE info_devaddr = 'FF6CC451'; """ df = pd.read_sql(sql, myMyConn) myMyConn.close() # 查询后关闭连接,避免资源占用或超时 return df # 应用布局:包含图表组件和定时触发器 app.layout = html.Div([ dcc.Graph(id='live-crestfactor-graph'), dcc.Interval( id='interval-component', interval=30*1000, # 30秒更新一次,单位为毫秒 n_intervals=0 ) ]) # 回调函数:定时器触发时自动更新图表 @app.callback( Output('live-crestfactor-graph', 'figure'), Input('interval-component', 'n_intervals') ) def update_graph(n): df = get_sensor_data() fig = go.Figure() fig.add_trace(go.Scatter(x=df['created_at'], y=df['X_Axis_CrestFactor'], mode='lines', name='X轴')) fig.add_trace(go.Scatter(x=df['created_at'], y=df['Y_Axis_CrestFactor'], mode='lines', name='Y轴')) fig.add_trace(go.Scatter(x=df['created_at'], y=df['Z_Axis_CrestFactor'], mode='lines', name='Z轴')) # 图表基础配置 fig.update_layout( title='传感器峰值因子实时数据', xaxis_title='时间', yaxis_title='峰值因子', transition_duration=500 # 添加更新过渡动画 ) return fig if __name__ == '__main__': app.run_server(debug=True)
关键改动说明
- 引入Dash库:作为Plotly的交互式框架,支持组件动态更新
get_sensor_data函数:每次更新时重新连接数据库获取最新数据,避免长期连接超时dcc.Interval组件:设置30秒的触发间隔,自动触发回调函数- 回调机制:监听定时器信号,每次触发时重新查询数据并生成新图表返回给前端
内容的提问来源于stack exchange,提问作者billha
相关产品推荐
相关产品推荐

