如何用Base R/ggplot2替换树状图标签并调整聚类布局
层次聚类树状图:标签替换与布局调整方案
问题根源
原代码中数据宽表结构错误:将时间点作为行、国家作为列,导致聚类对象是时间点而非国家,树状图标签显示的是values.国家名格式的列名,而非目标国家名称。
修正步骤与代码
1. 正确整理数据结构
重新整理数据,让每一行对应一个国家,每一列对应一个时间点的HICP数值,并将国家名称设为行名:
# 替换原data_widened的生成代码 data_widened <- hicp_filtered %>% select(geo, time, values) %>% pivot_wider(names_from = time, values_from = values) %>% column_to_rownames(var = "geo")
2. 重新计算距离与聚类
基于正确的国家维度数据计算Minkowski距离并执行层次聚类:
# 计算Minkowski距离(p=1.5) distance_matrix <- dist(data_widened, method = "minkowski", p = 1.5) # 使用ward.D2法进行层次聚类 hc <- hclust(distance_matrix, method = "ward.D2")
3. Base R 绘制带国家名称的树状图
通过调整plot()参数实现标签替换与布局优化:
plot(hc, main = "欧盟国家HICP层次聚类树状图", xlab = "", ylab = "Minkowski距离", cex = 0.8, # 缩小标签适配布局 hang = -1, # 让所有国家标签垂直对齐底部 labels = rownames(data_widened) # 显式指定国家名称为标签 )
4. ggplot2 绘制树状图(符合项目要求)
若需用ggplot2实现,可将聚类结果转为dendrogram对象后可视化:
library(ggplot2) # 将聚类结果转为dendrogram并提取可视化数据 dend <- as.dendrogram(hc) dend_data <- dendro_data(dend, type = "rectangle") # 绘制树状图 ggplot(segment(dend_data)) + geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) + geom_text(data = label(dend_data), aes(x = x, y = y, label = label), hjust = 1, vjust = 0, size = 3) + coord_flip() + # 翻转坐标轴,避免标签重叠 theme_minimal() + labs(title = "欧盟国家HICP层次聚类树状图", y = "Minkowski距离") + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.title.y = element_blank())
关键说明
- 数据结构修正:确保聚类对象是国家(行)而非时间点(列)是核心解决点
- 标签控制:通过
rownames()指定行名,聚类后树状图会直接使用国家名称作为标签 - 布局调整:Base R中
hang=-1可实现标签对齐,cex调整标签大小;ggplot2通过coord_flip()优化标签显示
内容的提问来源于stack exchange,提问作者Radeq2137
相关产品推荐
相关产品推荐

