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

Plotly散点图:YYYY-WW格式X轴设为分类轴的问题求助

解决Plotly散点图中YYYY-WW格式X轴的分类轴设置问题

核心问题分析

你遇到的报错本质是**trendline='ols'参数强制要求X轴为数值或日期类型**,和你想设置分类轴的需求冲突。Plotly的OLS趋势线功能依赖数值化的X轴,无法直接在分类轴上使用,这是触发ValueError的关键原因。另外原代码中存在变量名不一致(fig_和fig)的问题,也会导致运行报错。

解决方案1:移除OLS趋势线,直接设置分类轴

如果不需要趋势线,修正变量名并明确设置X轴为分类类型即可:

year_week = ['2020-00', '2020-01', '2020-02', '2020-03']
num_accidents = [2, 3, 4, 5]

# 统一变量名为fig,移除trendline参数
fig = px.scatter(
    x=year_week,
    y=num_accidents,
    title="Number of Accidents Per Week"
)

# 设置X轴为分类类型,阻止Plotly解析为日期/数值
fig.update_xaxes(type='category')
# 切换为线+标记模式(按需选择)
fig.update_traces(mode='lines+markers')

fig.show()

解决方案2:保留趋势线,手动计算并添加

如果需要趋势线,可通过第三方库(如scipy)手动计算回归结果,再映射回分类轴:

from scipy.stats import linregress
import plotly.express as px
import plotly.graph_objects as go

year_week = ['2020-00', '2020-01', '2020-02', '2020-03']
num_accidents = [2, 3, 4, 5]

# 用X轴的索引作为数值输入计算回归
x_indices = list(range(len(year_week)))
slope, intercept, _, _, _ = linregress(x_indices, num_accidents)
trend_values = [slope * idx + intercept for idx in x_indices]

# 创建基础线图(带标记)
fig = px.line(
    x=year_week,
    y=num_accidents,
    markers=True,
    title="Number of Accidents Per Week"
)

# 添加手动计算的趋势线
fig.add_trace(go.Scatter(
    x=year_week,
    y=trend_values,
    mode='lines',
    name='Trend Line',
    line=dict(dash='dash', color='red')
))

# 确保X轴为分类类型
fig.update_xaxes(type='category')

fig.show()

关键注意事项

  • 变量名必须统一:原代码中fig_和fig不匹配会导致NameError,务必修正。
  • 分类轴与OLS趋势线互斥:Plotly的内置trendline='ols'不支持分类轴,必须二选一或手动实现趋势线。
  • update_xaxes(type='category')是核心:该设置强制Plotly将X轴视为离散分类,不会尝试解析为日期或数值。

内容的提问来源于stack exchange,提问作者Bruce Banner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:22:01