Сохранение цвета метки и легенды на двух дендрограммах

Цель: я хотел бы сохранить цвет метки и цвет легенды на двух дендограммах, созданных для одного и того же набора данных.

У меня есть тот же набор данных (40 наблюдений), который преобразуется в дендограмму в 2 процесса (предварительно отфильтрованный и отфильтрованный). Однако цвета меток меняются в зависимости от того, как они сгруппированы (и, следовательно, изменяется порядок меток в дендрограмме).

Вот фрагмент кода:

library(dendextend)
small_mtcars <- head(mtcars)

small_mtcars

d1 = small_mtcars %>% select(mpg, cyl, disp) %>% dist() %>% hclust(method = "average") %>% as.dendrogram() 
d2 = small_mtcars %>% select(mpg, cyl, disp) %>% dist() %>% hclust(method = "complete") %>% as.dendrogram() 


par(mar = c(10,4,4,2) + 0.1)

# Plotting d1 

test <- d1 %>% 
  set("labels_cex",0.7) %>% 
  plot(main="d1")
legend("topright", legend=unique(rownames(small_mtcars)[order.dendrogram(d1)]), cex=0.75, bty="n",
       fill=seq(1,length(unique(rownames(small_mtcars)[order.dendrogram(d1)]))))

# Plotting d2 

test2 <- d2 %>% 
  set("labels_cex",0.7) %>% 
  plot(main="d2")
legend("topright", legend=unique(rownames(small_mtcars)[order.dendrogram(d2)]), cex=0.75, bty="n",
       fill=seq(1,length(unique(rownames(small_mtcars)[order.dendrogram(d2)]))))

d1_dendogram d2_dendogram

Основываясь на приведенном выше фрагменте кода, вот две вещи, которых я хочу достичь.

  1. Цветовая легенда должна быть одинаковой для обеих дендограмм (на приложенных изображениях модель Valiant зеленая на d1_dendogram и фиолетовая на d2_dendogram)
  2. Я хотел бы раскрасить метку листа тем же цветом, что и легенда.

Заранее спасибо.


person user10101904    schedule 18.07.2018    source источник


Ответы (1)


У вас есть много вещей, которые нужно переделать в вашем коде. Я исправил это, так что теперь это работает. Если у вас есть дополнительные вопросы, вы можете опубликовать их в комментариях :)

library(dendextend)
library(dplyr)
small_mtcars <- head(mtcars) %>% select(mpg, cyl, disp)

small_mtcars

d1 = small_mtcars %>% dist() %>% hclust(method = "average") %>% as.dendrogram() 
d2 = small_mtcars %>% dist() %>% hclust(method = "complete") %>% as.dendrogram() 

library(colorspace)
some_colors <- rainbow_hcl(nrow(small_mtcars))

d1_col <- some_colors[order.dendrogram(d1)]
d2_col <- some_colors[order.dendrogram(d2)]

labels_colors(d1) <- d1_col
labels_colors(d2) <- d2_col

par(mfrow = c(1,2))

# Plotting d1 

the_labels <- rownames(small_mtcars)

d1 %>% 
    set("labels_cex",0.7) %>% 
    plot(main="d1", xlim = c(1,9))
legend("topright", legend=the_labels, cex=0.75, bty="n",
       fill=some_colors)

# Plotting d2 

d2 %>% 
    set("labels_cex",0.7) %>% 
    plot(main="d2", xlim = c(1,9))
legend("topright", legend=the_labels, cex=0.75, bty="n",
       fill=some_colors)

ВЫХОД:

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

person Tal Galili    schedule 21.07.2018
comment
Большое спасибо Таль. У меня есть дополнительный вопрос: я пытаюсь добавить прямоугольник вокруг ветвей, как показано здесь: cran.r-project.org/web/packages/dendextend/vignettes/. Я получаю это - Ошибка в xy.coords(x, y, xlabel, ylabel, log): 'x' - это список, но не имеет компонентов 'x' и 'y # Plotting d2 d2 %>% set("labels_cex",0.7) %>% rect.dendrogram(k=3, border = 8, lty = 5, lwd = 2) %>% plot(main="d2", xlim = c(1,9)) legend("topright", legend=the_labels, cex=0.75, bty="n", fill=some_colors) - person user10101904; 22.07.2018
comment
Пожалуйста, опубликуйте новый вопрос с четким воспроизводимым кодом. - person Tal Galili; 22.07.2018
comment
Спасибо. Я понял ошибку. Сначала нужно сделать график, а затем сделать вызов rect.dendogram - person user10101904; 24.07.2018