如何将字符串列表转为整数列表实现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
相关产品推荐
相关产品推荐

