T-SNE可视化中能否为点绑定原始列标签并生成对应图例?
需求实现结论
该需求完全可实现,首先修正你原有代码的两处问题,再调整数据结构即可实现按TDS特征分组显示、自定义图例的效果。
原有代码问题修正
- 特征选择错误:你把时间戳格式的
target也纳入了TSNE的输入特征,这会导致降维结果混入时间维度的干扰,若你仅需基于三个TDS特征做降维,应该只保留这三列作为输入 - 散点索引错误:
points[:0]会返回空数组,正确取TSNE输出的横纵坐标应该用points[:, 0]、points[:, 1]
具体实现方案
你要的「Population A对应TDS7、Population B对应TDS8、Population C对应TDS9」分组图例效果,核心思路是把原来的宽格式DataFrame转为长格式,让每个TDS特征的取值对应一个独立样本,之后做降维、着色即可,完整代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.manifold import TSNE # 自定义常量,按需修改 RANDOM_STATE = 42 title = "TSNE降维可视化结果" xlabel = "TSNE第一维度" ylabel = "TSNE第二维度" # 1. 宽表转长表:将三个TDS特征拆分为独立行,保留对应时间戳 df_long = df.melt( id_vars=["target"], value_vars=["TDS7,C", "TDS8,C", "TDS9,C"], var_name="feature_type", value_name="tds_value" ) # 2. 执行TSNE降维,可按需调整输入特征 # 若仅基于TDS数值降维:input_data = df_long[["tds_value"]] # 若需保留时间维度影响:input_data = df_long[["tds_value", "target"]] input_data = df_long[["tds_value", "target"]] tsne = TSNE(n_components=2, n_iter=1000, random_state=RANDOM_STATE) points = tsne.fit_transform(input_data) # 3. 可视化,自动生成对应分组图例 plt.figure(figsize=(10, 7)) sns.scatterplot( x=points[:, 0], y=points[:, 1], hue=df_long["feature_type"], palette=sns.color_palette("crest", 3), hue_order=["TDS7,C", "TDS8,C", "TDS9,C"] ) # 自定义图例显示名称 handles, labels = plt.gca().get_legend_handles_labels() plt.legend( handles=handles, labels=["Population A (TDS7)", "Population B (TDS8)", "Population C (TDS9)"], title="分组类型", fontsize=12 ) plt.title(title, fontsize=20, y=1.03) plt.xlabel(xlabel, fontsize=16) plt.ylabel(ylabel, fontsize=16) plt.show()
可选扩展
如果你不需要拆分原始行,仍希望每个点对应原始DataFrame的一行数据,也可以通过气泡大小、RGB三色通道分别映射三个TDS特征的取值,实现单个点同时展示三个特征数值的效果。
内容的提问来源于stack exchange,提问作者stfxc
相关产品推荐
相关产品推荐

