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

ggraph/igraph圆形打包图标签与层级结构错误修复咨询

问题修复方案

问题根源

  1. 子节点数值错误:原代码中品类节点的销售额被计算为所有国家该品类的总和,而非对应国家下的单个品类销售额。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:00:37