You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Dendrogram树状图绘图美化及导出问题求助

树状图批量绘制优化解决方案

原问题概述

尝试在同一张画布绘制4种不同聚类算法的树状图,各划分为4个簇,原绘图效果如下:
原绘图效果示意图
原使用代码如下:

data <- df[, c(2, 1305:2185)]

data_HC <-
  data %>% remove_rownames %>% column_to_rownames(var = "Name")

h1 <- data_HC %>% dist %>% hclust(method='average') %>% as.dendrogram
h2 <- data_HC %>% dist %>% hclust(method='complete') %>% as.dendrogram
h3 <- data_HC %>% dist %>% hclust(method='ward.D') %>% as.dendrogram
h4 <- data_HC %>% dist %>% hclust(method='single') %>% as.dendrogram

compare_clusters <- function(data_1, data_2, data_3, data_4){
  par(mfrow=c(2,2))
  cols = c('red', 'green', 'blue', 'pink')
  plot(data_1, main='Average Linkage')
  cut_avg_h1 <- cutree(data_1, k = 4)
  rect.dendrogram(data_1 , k = 4, border = cols)
  plot(data_2, main='Complete Linkage')
  cut_avg_h2 <- cutree(data_2, k = 4)
  rect.dendrogram(data_2 , k = 4, border = cols)
  plot(data_3, main="Ward's Linkage")
  cut_avg_h3 <- cutree(data_3, k = 4)
  rect.dendrogram(data_3 , k = 4, border = cols)
  plot(data_4, main='Single Linkage')
  cut_avg_h4 <- cutree(data_4, k = 4)
  rect.dendrogram(data_4 , k = 4, border = cols)
}

plot <- compare_clusters(h1, h2, h3, h4)

需要解决4个需求:

  • 裁剪Ward法树状图,仅显示高度50及以下的部分,突出4个簇
  • 缩小所有样本标签字号,避免重叠
  • 缩小树枝和标签之间的空隙
  • 实现绘图结果的本地导出

修改后可运行代码

# 数据预处理部分保持不变
data <- df[, c(2, 1305:2185)]
data_HC <- data %>% remove_rownames %>% column_to_rownames(var = "Name")

h1 <- data_HC %>% dist %>% hclust(method='average') %>% as.dendrogram
h2 <- data_HC %>% dist %>% hclust(method='complete') %>% as.dendrogram
h3 <- data_HC %>% dist %>% hclust(method='ward.D') %>% as.dendrogram
h4 <- data_HC %>% dist %>% hclust(method='single') %>% as.dendrogram

compare_clusters <- function(data_1, data_2, data_3, data_4){
  par(mfrow=c(2,2), mar = c(2,2,2,2)) # 缩小页边距进一步节省空间
  cols = c('red', 'green', 'blue', 'pink')
  # 所有plot新增cex(标签字号)、offset(树枝与标签间距)参数
  plot(data_1, main='Average Linkage', cex = 0.5, offset = 0.1)
  rect.dendrogram(data_1 , k = 4, border = cols)
  
  plot(data_2, main='Complete Linkage', cex = 0.5, offset = 0.1)
  rect.dendrogram(data_2 , k = 4, border = cols)
  
  # Ward法新增ylim参数裁剪高度,仅显示0-50区间
  plot(data_3, main="Ward's Linkage", cex = 0.5, offset = 0.1, ylim = c(0,50))
  rect.dendrogram(data_3 , k = 4, border = cols)
  
  plot(data_4, main='Single Linkage', cex = 0.5, offset = 0.1)
  rect.dendrogram(data_4 , k = 4, border = cols)
}

# 先开绘图设备,设置合适的宽高避免标签截断,单位为像素,分辨率可按需调整
png("dendrogram_compare.png", width = 1200, height = 1000, res = 150)
compare_clusters(h1, h2, h3, h4)
dev.off() # 关闭设备完成保存

参数说明

  • cex = 0.5:调整样本标签的缩放比例,数值越小字号越小,可根据样本数量自行调整
  • offset = 0.1:调整标签和树枝末端的距离,默认值为1,数值越小间距越小
  • ylim = c(0,50):限制Y轴(树高度)的显示范围,仅展示高度0到50的部分,实现顶部分支裁剪
  • 保存时用png()函数可直接导出为png格式,需要导出矢量图可替换为pdf("dendrogram_compare.pdf", width = 12, height = 10)

内容的提问来源于stack exchange,提问作者AP_98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:06:01