как увеличить длину листового узла в дендрограмме и добавить метки узла - PullRequest
0 голосов
/ 25 апреля 2018

Моя задача - создать дендрограмму, но узлы листьев показывают тупые края.Как мне увеличить длину конечного узла и добавить метки узла?

Пожалуйста, посмотрите текущие и ожидаемые изображения ниже.

Данные:

df1 <- data.frame( z1 = c(rep('P1', 5), rep('P2', 5), rep('P3', 3), rep('P4', 4)),
                   z2 = c(letters[1:5], letters[6:10], letters[11:13], letters[14:17]),
                   stringsAsFactors = FALSE)

Код:

library('data.table')
library('ggplot2')
library('ggdendro')
library('grid')

setDT(df1)
ddata <- dcast( data = df1[, .(z1, z2)],
                formula = z2 ~ z1, 
                fill = 0, 
                fun.aggregate = length, 
                value.var = 'z2')
setDF( ddata)
row.names(ddata) <- ddata$z2
ddata$z2 <- NULL
ddata <- dendro_data( as.dendrogram( hclust( dist( ddata), method = "average")))
p <- ggplot(segment(ddata)) + 
  geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
  theme_dendro()
print(p)

Текущий участок:

enter image description here

Ожидаемый участок:

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Есть несколько способов сделать это, самый простой - вероятно, применить рекурсивную функцию к узлам дендрограммы, используя dendrapply.

Если вы вставите новую строку, чтобы назначить объект дендрограммы:

dendro <-  as.dendrogram(hclust(dist(ddata), method = "average"))

, а затем создайте простую функцию, которая уменьшает высоту листовых узлов на заданную величину (d):

dropleaf <- function(x, d = 1){
  if(is.leaf(x)) attr(x, "height") <- attr(x, "height") - d
  return(x)
}

Функция может быть применена ко всем узлам следующим образом:

dendro <- dendrapply(dendro, dropleaf, d = 0.2)

Если вы намереваетесь построить ось, вы можете изменить масштаб графика так, чтобы самая низкая точка была сброшена до нуля, используя:

dendro <- phylogram::reposition(dendro, shift = "reset")

Затем вы можете перейти костальная часть вашего кода ..

ddata <- dendro_data(dendro)
p <- ggplot(segment(ddata)) + 
  geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + 
  theme_dendro()
print(p)

, выдающая следующий вывод:

dendrogram

...