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

Matplotlib绘制3D立方体图报错求助:下标与字符串转浮点错误

解决Matplotlib 3D散点图的两个错误

错误原因分析

  1. TypeError: 'zip' object is not subscriptable
    Python 3中zip()返回的是迭代器而非列表,无法通过下标(如data[0])直接访问元素,改成data = list(zip(*arr))是正确的修复方式,但这只是暴露了第二个核心问题。

  2. ValueError: could not convert string to float: 'clothes'
    Matplotlib的3D坐标轴仅支持数值型数据,你用字符串类型的商品类别作为Y轴输入,自然会触发类型转换错误。

解决思路与代码修复

核心是把字符串类别映射为数值,再手动还原轴标签,同时简化数据生成逻辑:

import matplotlib.pyplot as plt
import random

def plot_cube():
    # 简化数据生成:用列表推导式替代多个for循环
    x = [2001]*100 + [2002]*100 + [2003]*100
    # 定义类别到数值的映射
    category_map = {"clothes": 0, "shoes": 1, "hats": 2}
    y_str = ["clothes"]*100 + ["shoes"]*100 + ["hats"]*100
    # 将字符串类别转为数值
    y = [category_map[cat] for cat in y_str]
    z = [random.randint(200, 300) for _ in range(300)]

    # 无需构造arr和zip,直接用x/y/z绘图即可
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    # 绘制散点图,也可将c参数换成z,让颜色随销售额变化
    ax.scatter(x, y, z, c=[0]*300)

    # 设置Y轴刻度和标签,把数值换回原类别名称
    ax.set_yticks(list(category_map.values()))
    ax.set_yticklabels(list(category_map.keys()))

    # 补充轴标签,让图表更清晰
    ax.set_xlabel('Year')
    ax.set_ylabel('Category')
    ax.set_zlabel('Sales')

    plt.show()
    return x, y_str, z

plot_cube()

额外优化说明

  • 原代码中arr和zip(*arr)的操作完全多余,直接用x、y、z列表即可传入scatter函数
  • 用列表乘法和推导式生成重复数据,比多个for循环更简洁高效
  • 如果把c=[0]*300换成z,散点颜色会随销售额数值变化,可视化效果更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:13:27