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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:36:04