График цветового кода R по именам строк для анализа основных компонентов

#r

Вопрос:

Я пытаюсь завершить анализ основных компонентов набора данных, содержащего столбцы числовых данных.

Предполагая набор данных, подобный этому (на самом деле у меня есть предварительно настроенный фрейм данных, этот, если для воспроизводимости):

 v1 <- c(1,2,3,4,5,6,7)
v2 <- c(3,6,2,5,2,4,9)
v3 <- c(6,1,4,2,3,7,5)
dataset <-data.frame(v1,v2,v3)
row.names(dataset) <-c('New York', 'Seattle', 'Washington DC', 'Dallas', 'Chicago','Los Angeles','Minneapolis')

 

Я провел свой анализ основных компонентов и успешно построил его:

 pca=prcomp(dataset,scale=TRUE)

plot(pca$x[,1], pca$x[,2],
     xlab="First PC",ylab="Second PC")
text(pca$x[,1], pca$x[,2],cex=0.7,pos=3,col="darkgrey")
 

Однако я хочу, чтобы мои точки данных были закодированы цветом на основе города, который является именами строк моего набора данных. Я также хочу использовать эти города (т. Е. названия строк) в качестве меток.

Я пробовал следующее, но ни то, ни другое не сработало:

 ## attempt 1 - I get row labels, but no chart
plot(pca$x[,1], pca$x[,2],col=rownames(dataset),pch=rownames(dataset),
     xlab="First PC",ylab="Second PC")
text(pca$x[,1], pca$x[,2],labels=rownames(dataset),cex=0.7,pos=3,col="darkgrey")

## attempt 2
datasetwithcity = rownames_to_column(dataset, var = "city")
head(datasetwithcity)

OnlyCities=datasetwithcity[,1]
OnlyCities

# this didn't work:
City_Labels=as.numeric(OnlyCities)
head(City_Labels)

# gets city labels, but loses points and no colour
plot(pca$x[,1], pca$x[,2],col=City_Labels,pch=City_Labels,
     xlab="First PC",ylab="Second PC")
text(pca$x[,1], pca$x[,2],labels=rownames(dataset),
     cex=0.7,pos=3,col="darkgrey")
 

Ответ №1:

Есть много разных способов сделать это.

В базе R вы могли бы сделать:

 plot(pca$x[,1], pca$x[,2],
     xlab="First PC",ylab="Second PC", col = seq(nrow(pca$x)),
     xlim = c(-2.5, 2.5), ylim = c(-2, 2))
text(pca$x[,1], pca$x[,2],cex=0.7,pos=3,col="darkgrey")
text(x = pca$x[,1], y = pca$x[,2], labels = rownames(pca$x), pos = 1)
 

введите описание изображения здесь

Лично я думаю, что полученная эстетика приятнее (и ее легче изменить в соответствии с вашими потребностями) ggplot . Код также немного легче читать, как только вы привыкнете к синтаксису.

 library(ggplot2)

df <- as.data.frame(pca$x)
df$city <- rownames(df)

ggplot(df, aes(PC1, PC2, color = city))   
  geom_point(size = 3)  
  geom_text(aes(label = city) , vjust = 2)  
  lims(x = c(-2.5, 2.5), y = c(-2, 2))  
  theme_bw()  
  theme(legend.position = "none") 
 

Создано 2021-10-28 пакетом reprex (v2.0.0)