有没有办法标记 lda() 生成的每个集群

Is there a way to label each cluster generated by lda()

使用 lda()ggplot2 我可以制作带有置信椭圆的规范图。有没有办法为图中的每个组添加标签(用图例中的组标记每个集群)?

# for the universality lda(Species~., data=iris) would be analogous
m.lda <- lda(Diet ~ ., data = b) 
m.sub <- b %>% dplyr::select(-Diet) %>% as.matrix  
CVA.scores <- m.sub %*% m.lda$scaling
m.CV <- data.frame(CVA.scores)
m.CV$Diet <- b$Diet

m.cva.plot <-
ggplot(m.CV, aes(x = LD1, y = LD2)) + 
geom_point(aes(color=Diet), alpha=0.5) + 
labs(x = "CV1", y = "CV2") +
coord_fixed(ratio=1) 

chi2 = qchisq(0.05,2, lower.tail=FALSE)
CIregions.mean.and.pop <-
m.CV %>%
group_by(Diet) %>%
summarize(CV1.mean = mean(LD1),
        CV2.mean = mean(LD2),
        mean.radii = sqrt(chi2/n()),
        popn.radii = sqrt(chi2))
m.cva.plot2 <-
m.cva.plot + 
 geom_circle(data = CIregions.mean.and.pop,
          mapping = aes(x0 = CV1.mean, y0 = CV2.mean, r = mean.radii),
          inherit.aes = FALSE) +
geom_circle(data = CIregions.mean.and.pop,
          mapping = aes(x0 = CV1.mean, y0 = CV2.mean, r = popn.radii),
          linetype = "dashed", 
          inherit.aes = FALSE) 

标签可以用geom_textgeom_label放置。在下面的例子中,我将使用 geom_label,通过添加 popn.radii 外圆的半径来调整 y 坐标。

问题中的代码适用于使用内置数据集iris,就像问题本身所说的那样。

m.cva.plot2 +
  geom_label(data = CIregions.mean.and.pop,
             mapping = aes(x = CV1.mean, 
                           y = CV2.mean + popn.radii, 
                           label = Species),
             label.padding = unit(0.20, "lines"),
             label.size = 0)

可重现代码

library(dplyr)
library(ggplot2)
library(ggforce)
library(MASS)

b <- iris
m.lda <- lda(Species~., data=iris) #would be analogous
#m.lda <- lda(Diet ~ ., data = b) 
m.sub <- b %>% dplyr::select(-Species) %>% as.matrix  
CVA.scores <- m.sub %*% m.lda$scaling
m.CV <- data.frame(CVA.scores)
m.CV$Species <- b$Species

m.cva.plot <-
ggplot(m.CV, aes(x = LD1, y = LD2)) + 
geom_point(aes(color=Species), alpha=0.5) + 
labs(x = "CV1", y = "CV2") +
coord_fixed(ratio=1) 

chi2 = qchisq(0.05,2, lower.tail=FALSE)
CIregions.mean.and.pop <-
m.CV %>%
group_by(Species) %>%
summarize(CV1.mean = mean(LD1),
        CV2.mean = mean(LD2),
        mean.radii = sqrt(chi2/n()),
        popn.radii = sqrt(chi2))

m.cva.plot2 <-
m.cva.plot + 
 geom_circle(data = CIregions.mean.and.pop,
          mapping = aes(x0 = CV1.mean, y0 = CV2.mean, r = mean.radii),
          inherit.aes = FALSE) +
geom_circle(data = CIregions.mean.and.pop,
          mapping = aes(x0 = CV1.mean, y0 = CV2.mean, r = popn.radii),
          linetype = "dashed", 
          inherit.aes = FALSE)