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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:15:46