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

如何在Scikit-learn t-SNE图中添加时间序列箭头展示时序特征?

问题

我正在针对向量时间序列绘制t-SNE图,该图展示向量会因部分分量值的“突变”形成不同聚类,可视化结果清晰呈现了对应时间序列中3个平均向量的3个聚类。为突出时序特性,我希望按时间顺序在相邻点间绘制箭头,请问该如何实现?

原始代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

# Create random vector time series
X = np.random.random(size=(1000,5))
X[500:,3] += 3*np.ones(500)
X[750:,4] += 2*np.ones(250)
y = np.hstack((np.zeros(500), np.ones(250), 2*np.ones(250)))

# Calculate 2d embedding and display
X_embedded = TSNE(n_components=2, learning_rate='auto', init='random', perplexity=6).fit_transform(X)
fig, ax = plt.subplots(1,1)
plt.scatter(X_embedded[:,0], X_embedded[:,1], c = y, cmap=plt.cm.rainbow);
解决方案

你可以通过遍历t-SNE嵌入后的相邻点对,利用matplotlib的arrow()函数绘制时序箭头,具体修改后的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

# Create random vector time series
X = np.random.random(size=(1000,5))
X[500:,3] += 3*np.ones(500)
X[750:,4] += 2*np.ones(250)
y = np.hstack((np.zeros(500), np.ones(250), 2*np.ones(250)))

# Calculate 2d embedding and display
X_embedded = TSNE(n_components=2, learning_rate='auto', init='random', perplexity=6).fit_transform(X)
fig, ax = plt.subplots(1,1)
plt.scatter(X_embedded[:,0], X_embedded[:,1], c = y, cmap=plt.cm.rainbow)

# 绘制时序箭头
for i in range(len(X_embedded) - 1):
    # 箭头起点为第i个点,终点为第i+1个点
    ax.arrow(
        X_embedded[i, 0], X_embedded[i, 1],
        X_embedded[i+1, 0] - X_embedded[i, 0],
        X_embedded[i+1, 1] - X_embedded[i, 1],
        head_width=0.15, head_length=0.2,
        fc='black', ec='black', alpha=0.25
    )

plt.show()

关键说明:

  • 遍历t-SNE嵌入后的所有相邻点对,按时间顺序绘制从第i个点指向第i+1个点的箭头
  • 设置alpha参数降低箭头透明度,避免遮挡原本的聚类散点
  • 通过head_width和head_length调整箭头大小,适配t-SNE图的尺度
  • 保留原有的颜色映射,确保聚类区分度不受影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:47:27