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

Python绘制带字符串分类的3D散点图报ValueError问题排查

问题分析与解决方案

嘿,这个问题我之前做实验的时候也踩过坑!咱们来一步步拆解:

错误原因

Matplotlib的ax.scatter()函数(不管是2D还是3D版本)要求X、Y轴的输入必须是数值类型(整数、浮点数都可以),但你直接传入了字符串列表。当函数尝试把这些字符串转换成绘图所需的浮点数时,自然就抛出了ValueError: could not convert string to float的错误。

解决思路

我们需要把字符串分类转换成对应的数值ID,用数值来绘制散点图,最后再把坐标轴的刻度标签替换回原来的字符串——这样底层用数值计算,图表显示的还是友好的分类名称。

修改后的完整代码

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 原始的分类字符串和准确率数据
xs = ['str1', 'str2']
ys = ['str3', 'str4']
zs = [1, 2]

# 步骤1:给每个分类字符串分配唯一的数值ID
x_mapping = {category: idx for idx, category in enumerate(xs)}
y_mapping = {category: idx for idx, category in enumerate(ys)}

# 步骤2:把字符串列表转换成数值列表
x_nums = [x_mapping[x] for x in xs]
y_nums = [y_mapping[y] for y in ys]

# 步骤3:用数值绘制3D散点图
ax.scatter(x_nums, y_nums, zs)

# 步骤4:把坐标轴刻度替换回原始字符串
ax.set_xticks(list(x_mapping.values()))
ax.set_xticklabels(list(x_mapping.keys()))
ax.set_yticks(list(y_mapping.values()))
ax.set_yticklabels(list(y_mapping.keys()))

# 添加坐标轴标签,让图表更清晰
ax.set_xlabel('激活函数')
ax.set_ylabel('求解器')
ax.set_zlabel('准确率')

plt.show()

进阶小技巧

如果你的分类数据很多,手动写映射字典太麻烦,可以用pandas的factorize()函数自动生成映射:

import pandas as pd

xs = ['str1', 'str2', 'str1', 'str2']
# factorize会返回两个值:数值数组和对应的分类标签
x_nums, x_labels = pd.factorize(xs)
# 之后设置刻度的时候直接用x_labels就行
ax.set_xticks(range(len(x_labels)))
ax.set_xticklabels(x_labels)

这样处理后,你的3D散点图就能正常显示,X、Y轴也会显示你需要的分类字符串啦!

内容的提问来源于stack exchange,提问作者S.Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:35:31