Python使用Plotly绘制折线图时如何添加趋势线
Plotly 时序图添加趋势线实现方案
你预期效果中的平滑趋势线为局部加权回归(LOWESS)趋势线,适配时序类水位数据的走势展示,不需要手动编写拟合逻辑,直接在你现有go.Figure代码基础上追加对应轨迹即可,不需要重构已有绘图逻辑。
可直接运行的修改后代码
import plotly.graph_objects as go import plotly.express as px import pandas as pd # 预处理:确保时间字段为标准datetime格式,避免趋势线计算异常 df_wl_1['timestamp_(utc+5)'] = pd.to_datetime(df_wl_1['timestamp_(utc+5)']) fig = go.Figure() # 保留你原有的原始水位折线绘制逻辑,微调透明度和线宽区分层次 fig.add_trace(go.Scatter( x=df_wl_1['timestamp_(utc+5)'], y=df_wl_1['water_level_(m)_-_sensor_2'], mode='lines', name='Water level 1', line=dict(width=1), opacity=0.6 )) fig.add_trace(go.Scatter( x=df_wl_1['timestamp_(utc+5)'], y=df_wl_1['water_level_(m)_-_sensor_3'], mode='lines', name='Water level 2', line=dict(width=1), opacity=0.6 )) # 为传感器2添加平滑趋势线 trend_sensor2 = px.scatter( df_wl_1, x='timestamp_(utc+5)', y='water_level_(m)_-_sensor_2', trendline="lowess", trendline_options=dict(frac=0.2) ).data[1] # 提取px自动计算生成的趋势线轨迹 trend_sensor2.line.width = 3 trend_sensor2.name = 'Water level 1 Trend' fig.add_trace(trend_sensor2) # 为传感器3添加平滑趋势线 trend_sensor3 = px.scatter( df_wl_1, x='timestamp_(utc+5)', y='water_level_(m)_-_sensor_3', trendline="lowess", trendline_options=dict(frac=0.2) ).data[1] trend_sensor3.line.width = 3 trend_sensor3.name = 'Water level 2 Trend' fig.add_trace(trend_sensor3) # 可选布局调整,对齐你给出的预期展示效果 fig.update_layout( xaxis_title='Timestamp (UTC+5)', yaxis_title='Water Level (m)', hovermode='x unified' ) fig.show()
常用参数调整
- 趋势线类型切换:
- 需要直线型线性趋势:将
trendline="lowess"替换为trendline="ols",无需额外传trendline_options - 需要固定窗口滑动平均趋势:将参数改为
trendline="rolling", trendline_options=dict(window=24),window为滑动窗口包含的时间点数量
- 需要直线型线性趋势:将
- 平滑度调整:LOWESS模式下的
frac参数取值范围为0~1,值越大趋势线越平滑,值越小越贴近原始数据波动,0.2为水文时序数据的常用经验值 - 视觉区分:可以通过调整原始折线的
opacity、线宽,以及趋势线的颜色、线宽,拉开原始数据和趋势线的视觉层次,和示例效果保持一致。
注意事项
必须先将时间列转换为pandas标准datetime格式再进行趋势线计算,否则时间字段会被识别为字符串,导致趋势线计算逻辑出错。
内容的提问来源于stack exchange,提问作者VostanieKotov
相关产品推荐
相关产品推荐

