Маркировка круговой dendextend дендрограммы

Я пытаюсь построить круговую дендрограмму композиционных данных. Используя следующий код:

library(dendextend)
library(circlize)
library(compositions)
data("Hydrochem")
hydro<-Hydrochem

d <- dist(hydro[7:19], method="euclidean") 
hc <- hclust(d, method = "average")
dend <- as.dendrogram(hc)
hydro$River <- as.character(hydro$River)
labels(dend) <- hydro$River[order.dendrogram(dend)]
plot(dend)

Я могу получить нормальную дендрограмму того, что я хочу, с правильным порядком этикеток.

Но когда я запускаю circlize_dendrogram(dend), я получаю следующее:

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

Что меня беспокоит, так это дендрограмма посередине - когда я не использую порядок дендрограммы для меток (т.е. просто набираю labels(dend) <- hydro$River), внутренняя дендрограмма в порядке, и все выглядит отлично.

Я безуспешно пытался изменить настройки labels_track_height и dend_track_height, и когда я запускаю тот же процесс на небольших наборах данных игрушек, эта проблема не возникает.

Любые идеи?


person Scott    schedule 15.09.2017    source источник


Ответы (2)


Итак, в вашем коде на самом деле возникают две проблемы: 1. Метки не уникальны. 2. На графике не хватает места для меток, после того как вы обновили их в объекте дендрограммы.

Первую проблему можно решить, добавив числа к неуникальным этикеткам, которые вы предоставляете, таким образом сделав их уникальными. Решение второй проблемы - поиграться с аргументом labels_track_height в функции circlize_dendrogram. Вот обновленный код (обратите внимание на последнюю строку, где разница):

library(dendextend)
library(circlize)
library(compositions)
data("Hydrochem")
hydro<-Hydrochem

d <- dist(hydro[7:19], method="euclidean") 
hc <- hclust(d, method = "average")
dend <- as.dendrogram(hc)

tmp <- as.character(hydro$River)[order.dendrogram(dend)]
labels(dend) <- paste0(seq_along(tmp), "_", tmp)
plot(dend)
circlize_dendrogram(dend, labels_track_height  = 0.4)

Вы получите следующий результат:

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

(Теперь это делается автоматически в dendextend 1.6.0, в настоящее время доступно на github, а позже и в CRAN)

person Tal Galili    schedule 27.09.2017
comment
Спасибо, Тал - это гораздо более подробное объяснение, и приятно знать, что оно выполняется автоматически. - person Scott; 27.09.2017
comment
Не за что. Если вы используете его для научной статьи, пожалуйста, рассмотрите возможность цитирования статей, касающихся dendextend И Circlize. Вы можете найти их, используя: citation (dendextend); citation (circlize) # (спасибо) - person Tal Galili; 27.09.2017

Итак, решение этой проблемы (если кто-нибудь может предоставить более подробную информацию, пожалуйста, потому что я действительно не понимаю, почему это вообще имеет значение) состоит в том, чтобы добавить второй вызов dend <- as.dendrogram(hc) после определения меток. Итак, код выглядит так:

d <- dist(hydro[7:19], method="euclidean") 
hc <- hclust(d, method = "average")
dend <- as.dendrogram(hc)
hydro$River <- as.character(hydro$River)
labels(dend) <- hydro$River[order.dendrogram(dend)]
dend <- as.dendrogram(hc)
circlize_dendrogram(dend)

ПРИМЕЧАНИЕ другого пользователя: это не решает вопрос.

person Scott    schedule 18.09.2017
comment
Боюсь, это неправильный ответ. Все, что вы сделали, - это проигнорировали изменение меток дендрограммы, в результате чего функция circlize_dendrogram просто построила дендрограмму со старыми метками. - person Tal Galili; 27.09.2017