Добавление текстовой аннотации к диаграмме рассеяния кластеров (tSNE) - PullRequest
0 голосов
/ 01 июля 2018

У меня есть XY данные (2D tSNE вложение данных больших размеров), которые я бы хотел scatter plot. Данные назначены нескольким cluster с, поэтому я хотел бы закрасить точки с помощью cluster, а затем добавить одну метку для каждого cluster, которая имеет ту же цветовую кодировку, что и cluster с, и находится снаружи (в максимально возможной степени) от точек cluster.

Есть идеи, как это сделать, используя R в ggplot2 и ggrepel или plotly?

Вот пример данных (координаты XY и назначения cluster в df и метки в label.df) и часть ggplot2:

library(dplyr)
library(ggplot2)
set.seed(1)
df <- do.call(rbind,lapply(seq(1,20,4),function(i) data.frame(x=rnorm(50,mean=i,sd=1),y=rnorm(50,mean=i,sd=1),cluster=i)))
df$cluster <- factor(df$cluster)

label.df <- data.frame(cluster=levels(df$cluster),label=paste0("cluster: ",levels(df$cluster)))

ggplot(df,aes(x=x,y=y,color=cluster))+geom_point()+theme_minimal()+theme(legend.position="none")

enter image description here

1 Ответ

0 голосов
/ 01 июля 2018

Функция geom_label_repel() в пакете ggrepel позволяет легко добавлять метки к графикам, пытаясь «оттолкнуть» метки от наложения на другие элементы. Небольшое дополнение к вашему существующему коду, где мы суммируем данные / получаем координаты того, где размещать метки (здесь я выбрал верхнюю левую область каждого кластера - это минимальное значение x и максимальное значение y) и объединяем его с вашими существующими данными, содержащими метки кластера. Укажите этот фрейм данных в вызове geom_label_repel() и укажите переменную, которая содержит эстетику label в aes().

library(dplyr)
library(ggplot2)
library(ggrepel)

set.seed(1)
df <- do.call(rbind,lapply(seq(1,20,4),function(i) data.frame(x=rnorm(50,mean=i,sd=1),y=rnorm(50,mean=i,sd=1),cluster=i)))
df$cluster <- factor(df$cluster)

label.df <- data.frame(cluster=levels(df$cluster),label=paste0("cluster: ",levels(df$cluster)))
label.df_2 <- df %>% 
  group_by(cluster) %>% 
  summarize(x = min(x), y = max(y)) %>% 
  left_join(label.df)

ggplot(df,aes(x=x,y=y,color=cluster))+geom_point()+theme_minimal()+theme(legend.position="none") +
  ggrepel::geom_label_repel(data = label.df_2, aes(label = label))

Output

...