Matplotlib绘制3D立方体图报错求助:下标与字符串转浮点错误
解决Matplotlib 3D散点图的两个错误
错误原因分析
TypeError: 'zip' object is not subscriptable
Python 3中zip()返回的是迭代器而非列表,无法通过下标(如data[0])直接访问元素,改成data = list(zip(*arr))是正确的修复方式,但这只是暴露了第二个核心问题。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
相关产品推荐
相关产品推荐

