Plotly散点图OLS趋势线呈直线且悬浮显示指数值问题
问题解决:Plotly散点图趋势线异常及数值显示问题
1. 趋势线为直线的原因及解决
你使用的trendline='ols'是普通最小二乘线性回归,本身就会生成直线趋势线。如果需要贴合数据的非线性趋势,可替换为以下方案:
- 改用局部加权回归趋势线:将
trendline='ols'改为trendline='lowess',适合呈现非线性的平滑趋势 - 自定义非线性拟合:借助
statsmodels实现多项式、指数等非线性模型,再将拟合结果添加到图中
示例代码(替换为lowess趋势线):
import datetime import plotly.express as px mylist = [datetime.datetime.strptime(date + '-1', "%Y-%W-%w") for date in mylist] fig = px.scatter( x=mylist, y=num_accidents, trendline='lowess', # 替换为lowess趋势线 title="Number of Accidents Per Week") fig.update_traces(mode='lines') fig.update_xaxes(tickformat="%d-%b-%Y") fig.show()
2. 趋势线悬浮显示指数形式的修正
趋势线的hover文本默认采用科学计数法,可通过自定义hover模板强制使用常规数值格式:
# 在生成图后添加以下代码,修正趋势线hover显示 fig.data[1].hovertemplate = '日期: %{x}<br>预测事故数: %{y:.2f}<extra></extra>'
也可以统一设置Y轴的数值格式,避免全局出现科学计数法:
fig.update_yaxes(tickformat='.2f')
完整修正代码示例
import datetime import plotly.express as px mylist = [datetime.datetime.strptime(date + '-1', "%Y-%W-%w") for date in mylist] fig = px.scatter( x=mylist, y=num_accidents, trendline='lowess', title="Number of Accidents Per Week") fig.update_traces(mode='lines') fig.update_xaxes(tickformat="%d-%b-%Y") # 修正趋势线hover显示格式 fig.data[1].hovertemplate = '日期: %{x}<br>预测事故数: %{y:.2f}<extra></extra>' # 设置Y轴使用常规数值格式 fig.update_yaxes(tickformat='.2f') fig.show()
内容的提问来源于stack exchange,提问作者Bruce Banner
相关产品推荐
相关产品推荐

