R участки с равным цветовым отображением - PullRequest
1 голос
/ 17 февраля 2020

Следующий код создает показанный график.

library(ggplot2)
library(dendextend)
library(cowplot)
set.seed(1234)

N<-10

set1 <- mvrnorm(n = N, c(0,0), matrix(c(0.5,0,0,0.5),2))
df <- data.frame(set1,label=1:N)

# ?dist
# dist method options: "euclidean", "maximum", "manhattan", "canberra", "binary" or "minkowski"
set1.dist <- dist(x=df[1:2],method = "euclidean")

fit1 <- hclust(d=set1.dist, method = "complete")
df$cluster <- cutree(fit1,k = 3)

p1 <- ggplot(df) +
   geom_text(aes(x=X1,y=X2,label=label ,color=as.factor(cluster)))+
   theme(legend.position = "none")
# p1

# ?hclust
# hclust method options "ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC) or "centroid" (= UPGMC).
p2 <- hclust(d=set1.dist, method = "complete") %>%
   as.dendrogram() %>% 
   color_labels(k=3) %>% 
   set("branches_k_color", k = 3) %>% 
   as.ggdend() %>% 
   ggplot(horiz = T, theme = NULL) + 
   theme(axis.title.y = element_blank(),
         axis.text.y = element_blank(),
         axis.ticks.y = element_blank())
#plot(fit1,hang = -1, labels = df$label, main="Test",xlab = "")

#?rect.hclust()
plot_grid(p1,p2)

Scatter plot and dendrogramm

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

1 Ответ

0 голосов
/ 17 февраля 2020

Проблема с вашим цветным рисунком состоит в том, что ваши вейлы не сортируются в том же порядке для каждого графика. На правом графике hclust упорядочит каждый идентификатор в зависимости от их расстояния, а на левом графике они отсортированы по идентификатору метки.

Чтобы получить тот же порядок, вам нужно присвоить порядок hclust к вашему фрейму данных. Вы можете найти этот порядок в переменной order из вашего hclust объекта:

> fit1$order
 [1]  5  6  2  3 10  4  1  7  8  9

Итак, теперь вы можете передать этот порядок в вашей df, выполнив (после того, как вы определили их идентификатор кластера):

fit1 <- hclust(d=set1.dist, method = "complete")
df$cluster <- cutree(fit1,k = 3)
df <- df[order(match(df$label, fit1$order)),]

            X1         X2 label cluster
5  -0.67846476  0.3034370     5       2
6   0.07798362  0.3578356     6       2
2   0.70596583  0.1961721     2       2
3   0.54889439  0.7668157     3       2
10 -1.70825344 -0.6293518    10       3
4  -0.04557927 -1.6586588     4       1
1   0.33742619 -0.8535244     1       1
7   0.36133829 -0.4064025     7       1
8   0.64431246 -0.3865271     8       1
9   0.59196977 -0.3991278     9       1

Теперь для построения первого графика необходимо установить cluster в качестве коэффициента и уровней атрибутов на основе этого порядка:

p1 <- df %>% mutate(cluster = factor(cluster, unique(cluster))) %>%
  ggplot()+
  geom_text(aes(x=X1,y=X2,label=label ,color=cluster))+
  theme(legend.position = "none")

Тогда второй график не изменится и вы наконец получите:

enter image description here

Отвечает ли он на ваш вопрос?

...