Цветная сюжетная текстовая аннотация - PullRequest
0 голосов
/ 08 июня 2018

Я скопировал xy данные, которые я хотел бы построить, используя R 'plotly, где точки окрашены их принадлежностью к кластеру, и есть текст, аннотирующий номер кластера и долю точек изОбщая.Я также пытаюсь сделать эту текстовую аннотацию того же цвета, что и точки, т. Е. Закрашена кластером.

Вот мой код:

library(dplyr)
library(plotly)
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)
cluster.colors <- c("#FF6C91","#EF7F47","#D39300","#AAA300","#6BB100")
cluster.centers.df <- dplyr::group_by(df,cluster) %>%
  dplyr::mutate(x=mean(x),y=mean(y),n=n()) %>% unique()
cluster.centers.df$percentage <- cluster.centers.df$n/sum(cluster.centers.df$n)
cluster.centers.df$cluster <- as.character(cluster.centers.df$cluster)


plot_ly(marker=list(size=12),type='scatter',mode="markers",x=df$x,y=df$y,color=df$cluster,colors=cluster.colors,showlegend=F) %>%
  add_annotations(text=sprintf("<b>%s</b>",paste0(cluster.centers.df$cluster,"\n",gsub("\\.00","",as.character(cluster.centers.df$percentage)),"%")),showarrow=T,arrowhead=1,arrowsize=1,x=cluster.centers.df$x,y=cluster.centers.df$y,ax=20,ay=-30,font=list(size=14,color=cluster.colors)) %>%
  layout(xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))

Это, однако, делаетне окрашивать текст в соответствии с cluster.colors.

enter image description here

Есть идеи?

1 Ответ

0 голосов
/ 09 июня 2018

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

library(dplyr)
library(plotly)
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)
cluster.colors <- c("#FF6C91","#EF7F47","#D39300","#AAA300","#6BB100")
cluster.centers.df <- dplyr::group_by(df,cluster) %>%
  dplyr::mutate(x=mean(x),y=mean(y),n=n()) %>% unique()
cluster.centers.df$percentage <- cluster.centers.df$n/sum(cluster.centers.df$n)
cluster.centers.df$cluster <- as.character(cluster.centers.df$cluster)

a <- c()
for (i in 1:length(cluster.centers.df$cluster)){
  a[[i]] <- list(text=sprintf("<b>%s</b>",paste0(cluster.centers.df$cluster[i],"\n",gsub("\\.00","",as.character(cluster.centers.df$percentage[i])),"%")),showarrow=T,arrowhead=1,arrowsize=1,x=cluster.centers.df$x[i],y=cluster.centers.df$y[i],ax=20,ay=-30,font=list(size=14,color=cluster.colors[i]))
}
plot_ly(marker=list(size=12),type='scatter',mode="markers",x=df$x,y=df$y,color=df$cluster,colors=cluster.colors,showlegend=F) %>%
layout(annotations = a, xaxis=list(title="X",zeroline=F,showticklabels=F),yaxis=list(title="Y",zeroline=F,showticklabels=F))
...