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

使用Plotly创建3D曲面图时遇IndexError错误求助

解决Plotly曲面图的IndexError问题

错误原因

你遇到的IndexError: index 0 is out of bounds for axis 0 with size 0,是因为部分日期(Report Date)和变更类型(Change Type)的组合在数据中不存在,导致筛选后的结果为空数组,此时直接访问.values[0]就会触发索引越界错误。

修复方案

方案1:循环中处理空值

在获取计数时先判断筛选结果是否为空,为空则填充0(或NaN),避免直接取索引0:

import plotly.graph_objects as go

# 获取类别标签并排序
states = DF['Change Type'].unique()
states.sort()
weeks = DF['Report Date'].unique()
weeks.sort()
z_data = []

# 遍历日期和变更类型,处理空值
for week in weeks:
    row = []
    for state in states:
        filtered = DF[(DF['Change Type'] == state) & (DF['Report Date'] == week)]['Count of Changes']
        # 有数据则取第一个值,无数据则填充0
        val = filtered.values[0] if len(filtered) > 0 else 0
        row.append(val)
    z_data.append(row)

# 匹配你的轴需求:X=Report Date,Y=Change Type,Z=计数
trace = go.Surface(x=weeks, y=states, z=z_data)
fig = go.Figure(data=[trace])
# 设置轴标签
fig.update_layout(
    scene=dict(
        xaxis_title='Report Date',
        yaxis_title='Change Type',
        zaxis_title='Count of Changes'
    )
)
fig.show()

方案2:用透视表自动生成数据(更简洁高效)

借助pandas的pivot_table直接生成二维表格,自动处理缺失组合并填充0,省去手动循环的麻烦:

import plotly.graph_objects as go

# 生成透视表,自动填充缺失值为0
pivot_df = DF.pivot_table(
    index='Report Date',
    columns='Change Type',
    values='Count of Changes',
    fill_value=0
)

# 提取轴数据和z值矩阵
weeks = pivot_df.index.values
states = pivot_df.columns.values
z_data = pivot_df.values

# 创建曲面图
trace = go.Surface(x=weeks, y=states, z=z_data)
fig = go.Figure(data=[trace])
fig.update_layout(
    scene=dict(
        xaxis_title='Report Date',
        yaxis_title='Change Type',
        zaxis_title='Count of Changes'
    )
)
fig.show()

额外说明

你原代码的轴对应逻辑和需求不符:曲面图的X/Y轴需要是离散类别(日期、变更类型),Z轴为数值型的计数,所以上述代码调整为X=Report Date、Y=Change Type、Z=Count of Changes,符合曲面图的网格数据逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:30:55