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

