如何在R中重构Treemap树状图,清晰展示geo、dataset及perc数值
解决treemap树状图标签混乱及多字段显示问题
问题说明
使用treemap包绘制树状图时,出现标签重叠混乱、无法显示perc数值的情况,需求为每个树状图方块同时展示geo地区名、dataset数据集名以及对应的perc数值。
数据集
fd=structure(list(geo = c("FR", "ID", "KE", "NG", "TH", "BD", "BF", "GB", "ID", "US", "DE", "FR", "GB", "US", "ZA", "BR", "DE", "GB", "IN", "US", "GB", "KR", "TR", "US", "UZ", "AU", "CA", "CI", "SN", "TH", "DE", "FR", "GB", "ID", "US", "DE", "GB", "SA", "TH", "US" ), total_gross = c(74800.179198648, 206351.720296498, 87104.011204479, 230279.098284536, 88416.123570242, 30649.923307, 1797.704424, 7203.416263, 20182.697799371, 1248.065576, 3884.255650215, 4312.951986, 7590.300395, 6124.868841, 5223.464131, 8579.658550893, 5105.435153999, 7041.527072472, 28142.360652436, 34010.800759784, 2274.429363, 1032.775403, 3611.359533, 27850.021229, 21428.923638, 3428.672326, 1596.969545249, 3506.142073, 1137.637902, 1932.374443, 7028.91663786, 9778.256711419, 6271.898612455, 5442.656310329, 47786.935549483, 46615.8912281, 34268.94122415, 20576.448612643, 20973.696070114, 288397.397156119), dataset = c("data0_50", "data0_50", "data0_50", "data0_50", "data0_50", "data10001_50000", "data10001_50000", "data10001_50000", "data10001_50000", "data10001_50000", "data1001_5000", "data1001_5000", "data1001_5000", "data1001_5000", "data1001_5000", "data101_500", "data101_500", "data101_500", "data101_500", "data101_500", "data50001", "data50001", "data50001", "data50001", "data50001", "data5001_10000", "data5001_10000", "data5001_10000", "data5001_10000", "data5001_10000", "data501_1000", "data501_1000", "data501_1000", "data501_1000", "data501_1000", "data51_100", "data51_100", "data51_100", "data51_100", "data51_100"), perc = c(4L, 8L, 18L, 14L, 5L, 3L, 4L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 3L, 1L, 2L)), class = "data.frame", row.names = c(NA, -40L))
解决方案代码
# 加载treemap包 if (!require(treemap)) { install.packages("treemap") library(treemap) } # 数据处理:聚合后过滤掉perc为0的行,避免无效小方块干扰标签 treemap_data <- aggregate(perc ~ geo + dataset, data = fd, sum) treemap_data <- treemap_data[treemap_data$perc > 0, ] # 自定义标签:拼接geo、dataset、perc为多行文本 treemap_data$label <- paste0(treemap_data$geo, "\n", treemap_data$dataset, "\nperc: ", treemap_data$perc) # 绘制树状图并保存 png("treemap.png", width = 3200, height = 2400, res = 300) treemap( treemap_data, index = c("geo", "dataset"), vSize = "perc", vColor = "perc", label = "label", # 使用自定义的多行标签 fontsize.labels = 12, # 调整标签字体大小适配方块 fontcolor.labels = "black", align.labels = list(c("center", "center")), # 标签居中显示 overlap.labels = 0.5, # 允许少量重叠,防止标签被强制隐藏 inflate.labels = FALSE # 不放大标签,保持合适比例 ) dev.off()
关键调整说明
- 过滤无效数据:移除
perc=0的行,这类方块无实际展示价值,还会导致标签拥挤混乱。 - 自定义多行标签:用
paste0拼接三个字段,通过\n实现换行,让每个方块内清晰展示全部所需信息。 - 标签参数优化:设置标签居中、调整字体大小、控制重叠程度,确保标签清晰可见且布局合理。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

