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
相关产品推荐
相关产品推荐

