如何在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
相关产品推荐
相关产品推荐

