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

如何在Plotly中为散点图的多个trace绘制趋势线

Plotly多散点序列添加趋势线实现方案

方案1:基于现有graph_objects写法手动添加

思路:对每个散点序列单独做线性拟合,将拟合结果作为线图trace加入画布即可,需用到numpy做数值计算:

import plotly.graph_objects as go
import numpy as np

fig = go.Figure()

# 添加道格拉斯冷杉原始散点
fig.add_trace(go.Scatter(x=df_df['Circumference (meters)'], 
                         y=df_df['Height (meters)'], 
                         name='Douglas Fir', mode='markers')
             )
# 计算道格拉斯冷杉线性趋势线参数
z1 = np.polyfit(df_df['Circumference (meters)'], df_df['Height (meters)'], 1)
p1 = np.poly1d(z1)
# 添加道格拉斯冷杉趋势线
fig.add_trace(go.Scatter(x=df_df['Circumference (meters)'], 
                         y=p1(df_df['Circumference (meters)']), 
                         name='Douglas Fir 趋势线', 
                         mode='lines',
                         line=dict(dash='dash'))
             )

# 添加白松原始散点
fig.add_trace(go.Scatter(x=df_wp['Circumference (meters)'], 
                         y=df_wp['Height (meters)'],  
                         name='White Pine',mode='markers')
             )
# 计算白松线性趋势线参数
z2 = np.polyfit(df_wp['Circumference (meters)'], df_wp['Height (meters)'], 1)
p2 = np.poly1d(z2)
# 添加白松趋势线
fig.add_trace(go.Scatter(x=df_wp['Circumference (meters)'], 
                         y=p2(df_wp['Circumference (meters)']), 
                         name='White Pine 趋势线', 
                         mode='lines',
                         line=dict(dash='dash'))
             )

fig.update_layout(title="Tree Circumference vs Height (meters)",
                  xaxis_title=df_df['Circumference (meters)'].name,
                  yaxis_title=df_df['Height (meters)'].name,
                  title_x=0.5)

fig.show()

方案2:用plotly.express简化实现(推荐)

思路:将两个数据集合并为带分类标签的DataFrame,直接调用px内置的趋势线参数自动生成,无需手动计算拟合过程:

import plotly.express as px
import pandas as pd

# 给两个数据集添加树种分类列
df_df['树种'] = 'Douglas Fir'
df_wp['树种'] = 'White Pine'
# 合并为全量数据集
df_all = pd.concat([df_df, df_wp])

# 绘制散点图,自动按树种分类,添加OLS线性趋势线
fig = px.scatter(df_all, 
                 x='Circumference (meters)', 
                 y='Height (meters)', 
                 color='树种',
                 trendline='ols', # 指定用普通最小二乘法生成线性趋势线
                 title='Tree Circumference vs Height (meters)')
fig.update_layout(title_x=0.5)
fig.show()

实现效果参考

效果示例图

内容的提问来源于stack exchange,提问作者David 54321

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:00:05