Уменьшить размер дендограммы (или оси Y) ggplot

У меня есть этот код для дендрограммы. Как я могу уменьшить размер дендрограммы (или оси Y)?

Я использую этот код в качестве примера. В моем наборе данных у меня большие метки, поэтому у меня недостаточно места для их включения. По этой причине я хотел бы уменьшить пространство, используемое для оси y, уменьшить расстояние от 0 до 150. Кроме того, когда я сохраняю фигуру как tiff, большая часть фигуры является дендограммой, и я не могу четко видеть надписи.

df   <- USArrests                 # really bad idea to muck up internal datasets
labs <- paste("sta_",1:50,sep="") # new labels
rownames(df) <- labs              # set new row names

library(ggplot2)
library(ggdendro)
hc       <- hclust(dist(df), "ave")           # heirarchal clustering
dendr    <- dendro_data(hc, type="rectangle") # convert for ggplot
clust    <- cutree(hc,k=2)                    # find 2 clusters
clust.df <- data.frame(label=names(clust), cluster=factor(clust))
# dendr[["labels"]] has the labels, merge with clust.df based on label column
dendr[["labels"]] <- merge(dendr[["labels"]],clust.df, by="label")
# plot the dendrogram; note use of color=cluster in geom_text(...)
ggplot() + 
  geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_text(data=label(dendr), 
            aes(x, y, label=label, hjust=0, color=cluster), 
            size=3) +
  coord_flip() + 
  scale_y_reverse(expand=c(0.2, 0)) + 
  theme(axis.line.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.text.y=element_blank(),
        axis.title.y=element_blank(),
        panel.background=element_rect(fill="white"),
        panel.grid=element_blank())

two muppets

Как я могу уменьшить размер дендограммы, аналогичный этой тепловой карте?

https://www.r-graph-gallery.com/wp-content/uploads/2016/12/215_heatmap_custom_labels.png

Спасибо большое

2 ответа

Для большей гибкости я рекомендую размещать метки дендрограммы на самой оси x, а не на текстовых метках на графике. В противном случае независимо от того, какие значения вы выбираете expand по оси Y часть меток может быть обрезана для некоторых размеров / размеров изображения.

Определите цветовую палитру для меток дендрограммы:

library(dplyr)
label.colour = label(dendr)$cluster %>% 
  factor(levels = levels(.),
         labels = scales::hue_pal()(n_distinct(.))) %>%
  as.character()

Для иллюстрации сделайте несколько ярлыков очень длинными:

label.values <- forcats::fct_recode(
  label(dendr)$label,
  sta_45_abcdefghijklmnop = "sta_45",
  sta_31_merrychristmas = "sta_31",
  sta_6_9876543210 = "sta_6")

Участок:

p <- ggplot(segment(dendr)) + 
  geom_segment(aes(x=x, y=y, xend=xend, yend=yend)) +
  coord_flip() +
  scale_x_continuous(breaks = label(dendr)$x,

                     # I'm using label.values here because I made
                     # some long labels for illustration. you can
                     # simply use `labels = label(dendr)$label`
                     labels = label.values, 

                     position = "top") +
  scale_y_reverse(expand = c(0, 0)) +
  theme_minimal() +
  theme(axis.title = element_blank(),
        axis.text.y = element_text(size = rel(0.9),
                                   color = label.colour),
        panel.grid = element_blank())
p

# or if you want a color legend for the clusters
p + geom_point(data = label(dendr), 
               aes(x = x, y = y, color = cluster), alpha = 0) +
  scale_color_discrete(name = "Cluster",
                       guide = guide_legend(override.aes = list(alpha = 1))) +
  theme(legend.position = "bottom")

сюжет

Вы можете сделать это, добавив параметр size в axis.text.y следующим образом:

theme(axis.line.y=element_blank(),
    axis.ticks.y=element_blank(),

    axis.text.y=element_text(size=12),

    axis.title.y=element_blank(),
    panel.background=element_rect(fill="white"),
    panel.grid=element_blank())
Другие вопросы по тегам