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

Python绘制轴用字符串替代数值的3D散点图及报错解决

解决Matplotlib 3D散点图字符串坐标轴报错问题

错误原因

Matplotlib的scatter()函数要求坐标输入为数值类型,直接传入字符串会触发类型转换失败的错误——它无法将'7th generation'这类字符串转换为浮点数用于绘图计算。

修正方案

先把字符串类型的x、y坐标映射为整数编码,绘制完成后再将坐标轴刻度替换回原字符串标签,同时处理颜色映射问题。

修正后的代码:

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

x = ['7th generation', '7th generation', '7th generation', '7th generation', '7th generation', 'Dawn Ultra', 'Dawn Ultra', 'Dawn Ultra', 'Dawn Ultra', 'Dawn Ultra', 'Mrs Meyers', 'Mrs Meyers', 'Mrs Meyers', 'Mrs Meyers', 'Mrs Meyers', 'Ultra Palmolive', 'Ultra Palmolive', 'Ultra Palmolive', 'Ultra Palmolive', 'Ultra Palmolive']
y = ['0.05 ml : 25 ml', '0.05 ml : 25 ml', '0.05 ml : 25 ml', '0.05 ml : 25 ml', '0.05 ml : 37.5 ml', '0.05 ml : 37.5 ml', '0.05 ml : 37.5 ml', '0.05 ml : 37.5 ml', '0.05 ml : 50 ml', '0.05 ml : 50 ml', '0.05 ml : 50 ml', '0.05 ml : 50 ml', '0.05 ml : 62.5 ml', '0.05 ml : 62.5 ml', '0.05 ml : 62.5 ml', '0.05 ml : 62.5 ml', '0.05 ml : 75 ml', '0.05 ml : 75 ml', '0.05 ml : 75 ml', '0.05 ml : 75 ml']
z = [0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 1, 0, 0, 4, 1, 0, 0, 0, 1, 6]

%matplotlib notebook 

# 对x轴字符串做数值编码
x_unique, x_indices = np.unique(x, return_inverse=True)
# 对y轴字符串做数值编码
y_unique, y_indices = np.unique(y, return_inverse=True)

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

# 用编码后的数值绘制散点,颜色绑定y的编码值实现分类配色
scatter = ax.scatter(x_indices, y_indices, z, c=y_indices, cmap='viridis')

# 替换x轴刻度为原字符串
ax.set_xticks(range(len(x_unique)))
ax.set_xticklabels(x_unique)
# 替换y轴刻度为原字符串
ax.set_yticks(range(len(y_unique)))
ax.set_yticklabels(y_unique)

# 添加颜色图例,对应y轴的浓度类别
plt.legend(handles=scatter.legend_elements()[0], labels=list(y_unique), title="Concentration")

ax.set_xlabel("detergent")
ax.set_ylabel("concentration")
ax.set_zlabel("num_colon")
plt.show()

关键部分说明

  • np.unique(x, return_inverse=True):获取x列表中的唯一字符串,同时返回每个原元素对应的唯一值索引(即数值编码),解决坐标数值化问题。
  • ax.set_xticks() + ax.set_xticklabels():将数值刻度替换为原字符串标签,实现坐标轴显示字符串的需求。
  • c=y_indices:用y的数值编码绑定颜色映射,让相同浓度类别的点显示同一种颜色,便于区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45