Поворот меток листьев на графике дендрограммы pvclust

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

Этот график именно то, что я хочу, за исключением того, что мне нужно, чтобы метки листьев отображались горизонтально, а не вертикально. Насколько я могу судить, в plot.hclust нет возможности вращать метки листьев. Я могу построить объект hclust в виде дендрограммы

(т.е. plot(as.dendrogram(example$hclust), leaflab="textlike") вместо plot(example))

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

Как лучше всего сделать график, максимально похожий на стандартный вывод plot.pvclust(), но с горизонтальными метками листьев?


person JSneathThompson    schedule 21.03.2018    source источник


Ответы (2)


Один из способов получить текст так, как вы хотите, — это plot.dendrogram ничего не печатать, а просто добавить метки самостоятельно. Поскольку вы не предоставляете свои данные, я проиллюстрирую некоторые встроенные данные. По умолчанию на графике не оставалось места для меток, поэтому я установил ylim, чтобы оставить дополнительное необходимое пространство.

set.seed(1234)
HC = hclust(dist(iris[sample(150,6),1:4]))

plot(as.dendrogram(HC), leaflab="none", ylim=c(-0.2, max(HC$height)))
text(x=seq_along(HC$labels), y=-0.2, labels=HC$labels)

Дендрограмма с горизонтальными метками

person G5W    schedule 21.03.2018
comment
Похоже, это хорошая идея, я хочу, чтобы мой график был похож на вывод plot.hclust, а не на вывод plot.dendrogram, поэтому я посмотрю, смогу ли я получить значения y из объекта hclust. - person JSneathThompson; 21.03.2018

Я написал функцию, которая строит стандартный график pvclust с пустыми строками в качестве меток листьев, а затем строит метки листьев отдельно.

plot.pvclust2 <- function(clust, x_adj_val, y_adj_val, ...){
  # Assign the labels in the hclust object to x_labels,
  # then replace x$hclust$labels with empty strings.
  # The pvclust object will be plotted as usual, but without
  # any leaf labels.
  clust_labels <- clust$hclust$labels
  clust$hclust$labels <- rep("", length(clust_labels))

  clust_merge <- clust$hclust$merge #For shorter commands

  # Create empty vector for the y_heights and populate with height vals
  y_heights <- numeric(length = length(clust_labels))
  for(i in 1:nrow(clust_merge)){
    # For i-th merge
    singletons <- clust_merge[i,] < 0 #negative entries in merge indicate
                                      #agglomerations of singletons, and 
                                      #positive entries indicate agglomerations
                                      #of non-singletons.
    y_index <- - clust_merge[i, singletons]
    y_heights[y_index] <- clust$hclust$height[i] - y_adj_val
  }

  # Horizontal text can be cutoff by the margins, so the x_adjust moves values
  # on the left of a cluster to the right, and values on the right of a cluster
  # are moved to the left
  x_adjust <- numeric(length = length(clust_labels))
  # Values in column 1 of clust_merge are on the left of a cluster, column 2
  # holds the right-hand values
  x_adjust[-clust_merge[clust_merge[ ,1] < 0, 1]] <- 1 * x_adj_val
  x_adjust[-clust_merge[clust_merge[ ,2] < 0, 2]] <- -1 * x_adj_val

  # Plot the pvclust object with empty labels, then plot horizontal labels
  plot(clust, ...)
  text(x = seq(1, length(clust_labels)) +
         x_adjust[clust$hclust$order],
       y = y_heights[clust$hclust$order],
       labels = clust_labels[clust$hclust$order])
}
person JSneathThompson    schedule 21.03.2018