ggraph/igraph圆形打包图标签与层级结构错误修复咨询
问题修复方案
问题根源
- 子节点数值错误:原代码中品类节点的销售额被计算为所有国家该品类的总和,而非对应国家下的单个品类销售额。
- US/UK无子女圆形:
circlepack布局要求树状结构(每个子节点仅属于一个父节点),原数据中同一品类属于多个国家,不符合树结构规范,导致布局异常。
修复后代码
library(ggraph) library(igraph) library(tidyverse) library(viridis) # 原始数据 base <- data.frame(from =c('US','US','UK','UK','DE','DE'), to = c('cat_a','cat_b','cat_a','cat_b','cat_a','cat_b'), sales=c(1,3,5,4,3,1.5)) # 1. 将子节点改为唯一标识(国家_品类),满足树结构要求 base <- base %>% mutate(to = paste(from, to, sep = "_")) # 2. 分别构建父/子节点的销售额数据 # 父节点:计算每个国家的总销售额 parent_nodes <- base %>% group_by(from) %>% summarise(sales = sum(sales)) %>% rename(name = from) # 子节点:保留对应国家下的单个品类销售额 child_nodes <- base %>% select(name = to, sales) # 合并所有节点数据 vetic <- bind_rows(parent_nodes, child_nodes) # 构建树状图(无向,确保层级结构正确) mdf <- graph_from_data_frame(base, directed = FALSE, vertices = vetic) # 绘图 ggraph(mdf, layout = 'circlepack', weight = sales) + geom_node_circle(aes(fill = depth)) + geom_node_text(size = 6, aes(label = paste0(str_remove(name, "_.*"), "\n", sales))) + theme_void() + scale_fill_distiller(palette = "RdPu")
修复说明
- 子节点唯一化:通过拼接国家与品类名称,让每个子节点仅归属一个父节点,符合
circlepack的树结构要求,解决US/UK无子女圆形的问题。 - 销售额修正:拆分父节点(国家总销售额)和子节点(对应品类销售额)的计算逻辑,确保DE的子节点显示正确的3.0和1.5数值。
- 文本优化:移除子节点名称中的品类后缀,让标签显示更简洁清晰。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

