Назовите образцы на графике PCA - PullRequest
1 голос
/ 25 февраля 2020

У меня есть график PCA с большим количеством данных, и я хочу определить, какие образцы являются выбросами. Когда я использую

geom.ind = c("text")

, тогда появляется столько текста, что я ничего не могу прочитать.

Вот минимальный воспроизводимый пример. (Я уже использовал здесь всплывающую подсказку с именами в графике PCA , но ответ работает только вручную, и у меня действительно отличный фрейм данных)

dataframe <- data_frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
row.names(dataframe) <- c("name1","name2","name3")

sub <- PCA(dataframe)

pca <- fviz_pca_ind(sub, pointsize = "cos2", 
             pointshape = 21, fill = "#E7B800",
             repel = TRUE, # Avoid text overlapping (slow if many points)
             geom = c("text","point"), 
             xlab = "PC1", ylab = "PC2",label = row.names(dataframe)
             )

interactive <- ggplotly(pca,dynamicTicks = T,tooltip = c("x","y",label = list))

Как видите, я обращаюсь к сделать это с помощью функции ggplotly (), но это не работает.

Я хочу идентифицировать имя образца (name1, name2, name3) на моем графике. Как я могу сделать это для большого набора данных?

Большое спасибо заранее

1 Ответ

2 голосов
/ 25 февраля 2020

Вы можете использовать следующий код

library(tidyverse)
library("factoextra")
library(plotly)
library(FactoMineR)

dataframe <- data_frame("c1"=c(78,89,0),"c2"=c(89,89,34),"c3"=c(56,0,4))
row.names(dataframe) <- c("name1","name2","name3")

sub <- PCA(dataframe)

pca <- fviz_pca_ind(sub, pointsize = "cos2", 
                    pointshape = 21, fill = "#E7B800",
                    repel = TRUE, # Avoid text overlapping (slow if many points)
                    geom = c("text","point"), 
                    xlab = "PC1", ylab = "PC2",label = c("ind")
)

interactive <- ggplotly(pca,tooltip = c("x","y","colour"))

bggly <- plotly_build(interactive)
bggly$x$data[[1]]$text <- 
  with(pca$data, paste0("name: ", name, 
                        "</br></br>x: ", x, 
                        "</br>y: ", y, 
                        "</br>coord: ", coord, 
                        "</br>cos2: ", cos2, 
                        "</br>contrib: ", contrib))
bggly

После получения справки от этого поста от Стефана Лорана. Для большого набора данных в формате .csv с 1-м столбцом в качестве имен строк вы можете прочитать его как df <- read.csv("Test_Data.csv", row.names = 1), если имена строк не дублируются.

...