DTWCLUST多变量时间序列聚类绘图及质心展示问题咨询
使用DTWCLUST进行多变量时间序列聚类的绘图问题
我正在R语言中使用DTWCLUST包进行多变量时间序列聚类,代码如下:
data("uciCT") mvc <- tsclust(CharTrajMV, k = 4L, distance = "gak", seed = 390L) plot(mvc)
CharTrajMV数据集包含100个观测值与3个变量,聚类基于这3个变量完成。但plot(mvc)生成的每个聚类图仅展示一维模式,我想了解该绘图的实现逻辑;另外,执行代码:
plot(mvc, labels = list(nudge_x = -10, nudge_y = 1), type="centroids")
仅显示每个聚类的一个质心,请问能否通过绘图选项展示每个聚类的3个变量的质心图,或正确的实现方式是什么?
绘图实现逻辑说明
DTWCLUST针对tsclust对象的默认plot方法,处理多变量时间序列时,默认会把所有变量的序列叠加绘制在同一图中,并非只展示一维。你看到的“一维模式”,大多是三个变量的序列重叠后视觉上的效果,尤其当变量模式相似时更明显。
该绘图的核心逻辑:
- 对每个聚类,将类内所有观测的所有变量时间序列绘制在同一坐标轴上
- 已计算的质心会用更突出的样式(比如加粗、异色)显示在对应聚类的图中
多变量质心的展示方法
默认plot.tsclust方法不支持直接按变量拆分绘制质心,需要手动提取质心数据并自定义绘图,具体步骤如下:
1. 提取质心数据
从聚类对象中取出多变量质心,mvc@centroids存储了每个聚类的质心,每个质心是包含3个变量的时间序列对象:
centroids <- mvc@centroids
2. 自定义绘图展示多变量质心
基础绘图系统实现
# 设置绘图布局:4个聚类×3个变量,共4行3列 par(mfrow = c(4, 3)) # 遍历每个聚类 for (clust in 1:length(centroids)) { # 遍历当前聚类的3个变量 for (var in 1:ncol(centroids[[clust]])) { plot(centroids[[clust]][, var], main = paste("聚类", clust, " - 变量", var), xlab = "时间步", ylab = "变量值", col = "blue", lwd = 2) } } par(mfrow = c(1,1)) # 恢复默认绘图布局
ggplot2实现(更美观的分面图)
library(ggplot2) library(tidyr) library(dplyr) # 将质心数据整理为长格式 centroid_df <- lapply(seq_along(centroids), function(clust) { as.data.frame(centroids[[clust]]) %>% mutate(time = row_number(), cluster = clust) %>% pivot_longer(cols = -c(time, cluster), names_to = "variable", values_to = "value") }) %>% bind_rows() # 绘制分面图 ggplot(centroid_df, aes(x = time, y = value, color = variable)) + geom_line(linewidth = 1.2) + facet_grid(cluster ~ variable) + labs(x = "时间步", y = "变量值", title = "各聚类的多变量质心") + theme_bw()
3. 补充:默认绘图区分变量
如果希望在默认绘图中直接区分不同变量,可以指定col参数为与变量数量匹配的颜色向量,让不同变量的序列用不同颜色显示:
plot(mvc, col = rep(c("red", "green", "blue"), each = length(mvc@datalist)))
这里length(mvc@datalist)是观测总数,每个变量对应一种颜色,重复对应次数即可。
内容的提问来源于stack exchange,提问作者goyangiee
相关产品推荐
相关产品推荐

