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

使用ggord绘制多变量LDA图遇向量重叠,求分组连线实现方案

问题:解决ggord绘制高变量LDA图的向量重叠并实现分组连线效果

现状说明

使用ggord工具时发现,变量较少时能生成清晰的变量向量,但处理约50个基因表达的多变量LDA分析(共3组,分类变量为grup_int)时,向量重叠成网状无法辨识,当前使用的代码如下:

# simple syntax
ggord::ggord(model1, ldat2$grup_int, size = 1, ylim = c(-4,4))

当前效果:
LDA向量重叠效果

期望效果

希望实现类似iris数据集示例中的分组连线效果(样本点到各组中心的虚线连接),示例代码及效果如下:

示例代码

library(MASS)
res <- lda(Species ~ . , iris)
res

fd <- predict(res, iris)$x  # 判别函数得分
coef(lm(fd ~ .-Species,iris))


iris2 <- iris
iris2[,1:4] <- scale(iris2[,1:4])
lda(Species ~ . , iris2)$scaling


plot(res, pch=19, col=as.integer(iris[,5]))


predicho <- predict(res, iris)
str(predicho)
predicho$class


table(iris[,5], predicho$class)


res.cv <- lda(Species ~ . , iris, CV=TRUE)


tc <- table(iris[,5], res.cv$class)
tc


prednew <- predict(res, newdata=data.frame(Sepal.Length=5, Sepal.Width=3, Petal.Length=2.5, Petal.Width=0.3))
prednew


fd <- predict(res,iris)$x
medias <- sapply(1:3, function(grupo) colMeans(fd[iris[,5]==levels(iris[,5])[grupo],]))
plot(fd, pch=19, col=as.integer(iris[,5]), asp=1)
points(medias[1,],medias[2,],pch="+",cex=2, col=1:3)
points(prednew$x,col="blue",pch=19)

# 添加样本到各组中心的连线
lines(c(prednew$x[1],medias[1,1]),c(prednew$x[2],medias[2,1]),lty=2,col=1)
lines(c(prednew$x[1],medias[1,2]),c(prednew$x[2],medias[2,2]),lty=2,col=2)
lines(c(prednew$x[1],medias[1,3]),c(prednew$x[2],medias[2,3]),lty=2,col=3)

library(cluster)
D<-daisy(rbind(prednew$x,t(medias)),"euclidean")
mtext(paste("距离:",round(D[1],3)),col=1,line=2)
mtext(paste("距离:",round(D[2],3)),col=2,line=1)
mtext(paste("距离:",round(D[3],3)),col=3,line=0)

参考效果

分组连线LDA效果

解决方案

方案1:关闭变量向量,手动添加分组连线

ggord默认绘制所有变量的载荷向量,变量过多时必然重叠。先关闭向量显示,再用ggplot2语法添加样本到各组中心的连线:

library(ggord)
library(ggplot2)

# 绘制基础LDA图,关闭变量向量(设置veclen=0)
p <- ggord(model1, ldat2$grup_int, size = 1, ylim = c(-4,4), veclen = 0)

# 获取LDA得分和各组中心坐标
lda_scores <- predict(model1, ldat2)$x
group_centers <- aggregate(lda_scores, by = list(grup_int = ldat2$grup_int), FUN = colMeans)

# 构造连线数据:每个样本点对应到所有组中心的连线信息
line_data <- do.call(rbind, lapply(1:nrow(lda_scores), function(i) {
  sample_coord <- lda_scores[i, ]
  data.frame(
    x = rep(sample_coord[1], nrow(group_centers)),
    xend = group_centers$LD1,
    y = rep(sample_coord[2], nrow(group_centers)),
    yend = group_centers$LD2,
    group = group_centers$grup_int
  )
}))

# 添加连线和组中心标记到图中
p + geom_segment(data = line_data, aes(x = x, y = y, xend = xend, yend = yend, color = group), 
                 linetype = "dashed", alpha = 0.5) +
  geom_point(data = group_centers, aes(x = LD1, y = LD2, color = grup_int), 
             shape = "+", size = 5)

方案2:保留关键变量向量(可选)

如果需要保留部分变量的向量信息,可以筛选载荷绝对值较大的变量,仅绘制这些变量的向量:

# 获取LDA模型的变量载荷
loadings <- model1$scaling
# 筛选LD1和LD2载荷绝对值排名前10的变量
top_vars <- rownames(loadings)[order(-abs(loadings[,1]), -abs(loadings[,2]))][1:10]

# 绘制仅包含关键变量的LDA图
ggord(model1, ldat2$grup_int, size = 1, ylim = c(-4,4), var.sub = top_vars)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:20:02