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
相关产品推荐
相关产品推荐

