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

如何将字符串列表转为整数列表实现Matplotlib散点图按类别着色?

问题解答

一、生成整数编码列表newz的最优方法

根据不同场景需求,以下几种高效实现方式可供选择:

1. 用pandas的factorize(推荐,简洁高效)

适合快速处理分类字符串,自动生成连续整数编码,同时返回对应的唯一类别:

import pandas as pd
z = ['Adelie', 'Adelie', 'Adelie', 'Adelie', 'Gentoo', 'Gentoo', 'Gentoo', 'Gentoo']
newz, unique_labels = pd.factorize(z)
# 默认编码从0开始,若要从1起始:newz = pd.factorize(z)[0] + 1

2. 用sklearn的LabelEncoder(适合机器学习场景)

如果已在使用scikit-learn生态,这个工具可完成标签编码,后续还支持反向解码:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
newz = le.fit_transform(z)
# 解码示例:le.inverse_transform(newz)

3. 手动字典映射(无额外依赖)

不需要第三方库时,用字典建立字符串到整数的映射,若要保持原类别顺序,可借助dict.fromkeys:

# 按原顺序提取唯一值
unique_z = list(dict.fromkeys(z))
# 建立从1开始的编码映射
str_to_num = {val: idx+1 for idx, val in enumerate(unique_z)}
newz = [str_to_num[val] for val in z]

二、这种着色方式的合理性

这种整数编码着色的方式是合理且常用的,但有几个细节需要注意:

  • 其实Matplotlib本身支持直接传入字符串列表c=z,它会自动将字符串映射为离散数值编码并分配颜色,但手动编码的好处是可以精确控制编码顺序、起始值,灵活性更高。
  • 针对分类变量(如示例中的企鹅种类),更推荐搭配离散色板(如cmap='tab10'),让不同类别颜色区分更清晰;若需要指定特定颜色,可手动传入颜色列表配合编码使用。
  • 务必添加图例或颜色条,明确每个编码对应的类别,避免读者混淆,示例代码:
plt.scatter(x, y, c=newz, cmap='tab10')
# 手动创建对应图例
from matplotlib.patches import Patch
legend_elements = [Patch(facecolor=plt.cm.tab10(i), label=label) 
                   for i, label in enumerate(unique_labels)]
plt.legend(handles=legend_elements)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:21