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

如何在R中优化欧盟HICP指数聚类树状图,仅显示国名

问题解决:欧盟HICP数据层次聚类树状图优化

问题说明

基于2000-2022年欧盟成员国HICP指数数据,使用minkowski距离(p=1.5)进行层次聚类,生成包含4个簇的树状图,要求仅显示国家名称且保证可读性,仅允许使用eurostat、dplyr、ggplot2及R基础包。现有代码生成的树状图杂乱,国名显示不清。

修正后的完整代码

1. 数据预处理(优化核心逻辑)

# 安装并加载所需包
install.packages("eurostat")
install.packages("dplyr")
install.packages("ggplot2")
library(eurostat)
library(dplyr)
library(ggplot2)

# 下载HICP数据集
hicp <- get_eurostat("prc_hicp_manr", time_format = "date")

# 欧盟成员国代码列表
member_states <- c("AT", "BE", "BG", "HR", "CY", "CZ",
                   "DK", "EE", "FI", "FR", "DE", "GR", 
                   "HU", "IE", "IT", "LV", "LT", "LU", 
                   "MT", "NL", "PL", "PT", "RO", "SK", 
                   "SI", "ES", "SE", "EL")

# 数据筛选与预处理
hicp_filtered <- hicp %>% 
  filter(time >= as.Date("2000-02-01") & time <= as.Date("2022-09-01")) %>%
  filter(coicop == "CP00") %>%  # 筛选总HICP指数
  filter(geo %in% member_states) %>%
  mutate(geo = case_when(
    geo == "AT" ~ "Austria",
    geo == "BE" ~ "Belgium",
    geo == "BG" ~ "Bulgaria",
    geo == "HR" ~ "Croatia",
    geo == "CY" ~ "Cyprus",
    geo == "CZ" ~ "Czech Republic",
    geo == "DK" ~ "Denmark",
    geo == "EE" ~ "Estonia",
    geo == "FI" ~ "Finland",
    geo == "FR" ~ "France",
    geo == "DE" ~ "Germany",
    geo == "GR" ~ "Greece",
    geo == "HU" ~ "Hungary",
    geo == "IE" ~ "Ireland",
    geo == "IT" ~ "Italy",
    geo == "LV" ~ "Latvia",
    geo == "LT" ~ "Lithuania",
    geo == "LU" ~ "Luxembourg",
    geo == "MT" ~ "Malta",
    geo == "NL" ~ "Netherlands",
    geo == "PL" ~ "Poland",
    geo == "PT" ~ "Portugal",
    geo == "RO" ~ "Romania",
    geo == "SK" ~ "Slovakia",
    geo == "SI" ~ "Slovenia",
    geo == "ES" ~ "Spain",
    geo == "SE" ~ "Sweden",
    geo == "EL" ~ "Greece",
    TRUE ~ geo
  )) %>%
  distinct(geo, time, .keep_all = TRUE)  # 去除重复行,避免同一国家同一时间多条数据

# 转换为宽格式:每个国家一行,每个时间点的HICP作为列(使用R基础包reshape)
hicp_wide <- reshape(hicp_filtered, 
                     idvar = "geo", 
                     timevar = "time", 
                     direction = "wide")
rownames(hicp_wide) <- hicp_wide$geo  # 将国家名称设为行名,用于聚类
hicp_wide <- hicp_wide[, -1]  # 移除geo列,仅保留数值列

2. 层次聚类与树状图绘制(优化可读性)

# 计算Minkowski距离(p=1.5)
dist_matrix <- dist(hicp_wide, method = "minkowski", p = 1.5)

# 进行层次聚类(默认使用ward.D2方法,可根据需求调整)
hc <- hclust(dist_matrix)

# 将聚类结果转换为树状图,并切割为4个簇
dend <- as.dendrogram(hc)
dend <- cut(dend, h = hc$height[length(hc$height)-3])$upper  # 精准切割出4个簇

# 绘制优化后的树状图
par(mar = c(8, 4, 4, 2))  # 调整边距,给底部国家标签留出足够空间
plot(dend, 
     main = "欧盟成员国HICP指数层次聚类树状图(4个簇,Minkowski距离p=1.5)",
     xlab = "聚类距离",
     ylab = "",
     leaflab = "none",  # 关闭默认叶节点标签,避免重叠
     edgePar = list(col = "gray50", lwd = 1.2))

# 添加清晰的国家名称标签
labels <- labels(dend)
text(x = 1:length(labels), 
     y = rep(-0.8, length(labels)),  # 将标签放在树状图下方
     labels = labels, 
     srt = 45,  # 标签倾斜45度,避免重叠
     adj = 1, 
     cex = 0.8)  # 调整标签大小,保证可读性

关键优化点说明

  • 数据格式修正:将原长格式数据转换为宽格式,确保聚类基于每个国家的完整时间序列数据(而非单个数值),这是原代码的核心错误。
  • 边距调整:通过par(mar)增加底部边距,避免国家名称被截断。
  • 标签优化:将标签移至树状图下方并倾斜,避免重叠,同时调整字体大小提升可读性。
  • 簇数控制:通过cut()函数精准切割为4个簇,简化树状图结构,避免杂乱。

内容的提问来源于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 19:05:19