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

使用R的ggraph包绘制嵌套圆图:颜色与布局问题求助

解决圆堆积图(Circle Pack)的颜色分配与元素位置问题

问题描述

现有如下数据框,需要绘制层级圆堆积图:根节点为白色圆,包含NS2A和NS5两个白色子圆,子圆内的子项颜色由df$cc指定。但现有代码存在两个问题:

  1. 颜色分配错误,未按预期对应;
  2. NS5子圆中最大的子项位于中间,不符合需求。

原始数据

df <- structure(list(group = c("root", "root", "NS2A", "NS2A", "NS2A", 
"NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5", 
"NS5", "NS5", "NS5", "NS5", "NS5", "NS5", "NS5"), subitem = c("NS2A", 
"NS5", "NS2A_C_to_A_Nonsynonymous_3931_1.0015", "NS2A_C_to_A_Nonsynonymous_3931_0.9404", 
"NS2A_C_to_A_Nonsynonymous_3931_1.0141", "NS5_G_to_A_Synonymous_8561_2.6323", 
"NS5_A_to_T_Synonymous_9728_2.4983", "NS5_G_to_A_Synonymous_8561_2.5331", 
"NS5_A_to_T_Synonymous_9728_2.3962", "NS5_G_to_A_Synonymous_8561_2.1411", 
"NS5_A_to_T_Synonymous_9728_2.6646", "NS5_G_to_A_Synonymous_8561_2.0874", 
"NS5_A_to_T_Synonymous_9728_2.6065", "NS5_G_to_A_Synonymous_8561_2.3789", 
"NS5_A_to_T_Synonymous_9728_2.6322", "NS5_G_to_A_Synonymous_8561_3.2712", 
"NS5_A_to_C_Nonsynonymous_9276_2.8576", "NS5_A_to_T_Synonymous_9728_2.7555", 
"NS5_G_to_A_Synonymous_8561_1.9121", "NS5_A_to_C_Nonsynonymous_9276_5.1328", 
"NS5_A_to_T_Synonymous_9728_2.6368"), size = c(0, 0, 1.0015, 
0.9404, 1.0141, 2.6323, 2.4983, 2.5331, 2.3962, 2.1411, 2.6646, 
2.0874, 2.6065, 2.3789, 2.6322, 3.2712, 2.8576, 2.7555, 1.9121, 
5.1328, 2.6368), Pass = c("PA", "PA", "P1", "P7", "P12", "P0", 
"P0", "P1", "P1", "P3", "P3", "P5", "P5", "P7", "P7", "P10", 
"P10", "P10", "P12", "P12", "P12"), cc = c("#FFFFFF", "#FFFFFF", 
"#fc2f92", "#b84592", "#8e43e7", "#3369e7", "#3369e7", "#fc2f92", 
"#fc2f92", "#00aeff", "#00aeff", "#ff4f81", "#ff4f81", "#b84592", 
"#b84592", "#Cf6c5f", "#Cf6c5f", "#Cf6c5f", "#8e43e7", "#8e43e7", 
"#8e43e7")), row.names = c(NA, -21L), class = "data.frame")

解决方案

修正要点

  1. 颜色映射错误:之前直接引用外部数据框的颜色,未将颜色信息关联到图的顶点数据中,导致映射错位。需将cc字段整合到顶点数据里,让ggraph直接从顶点读取颜色。
  2. 元素位置异常:父节点(NS2A、NS5)的size设为0,导致布局算法无法正确分配空间,大元素被挤到中间。需将父节点的size计算为子节点的总和,同时调整布局的排序逻辑。

修正后代码

library(tidyverse)
library(ggraph)
library(igraph)

# 1. 修正父节点的size:计算NS2A和NS5的子项size总和
df_fixed <- df %>%
  group_by(group) %>%
  mutate(size = ifelse(subitem %in% c("NS2A", "NS5"), sum(size[subitem != group]), size)) %>%
  ungroup()

# 2. 构建顶点数据,包含每个节点的size和对应cc
vertices <- df_fixed %>%
  distinct(subitem, size, cc) %>%
  add_row(subitem = "root", size = sum(df_fixed$size[df_fixed$group == "root"]), cc = "#FFFFFF")

# 3. 构建图对象
graph <- graph_from_data_frame(df_fixed, vertices = vertices)

# 4. 绘制圆堆积图,调整布局排序与颜色映射
ggraph(graph, layout = "circlepack", weight = size, sort.by = -size) +
  geom_node_circle(aes(fill = cc, color = ifelse(name %in% c("root", "NS2A", "NS5"), "#FFFFFF", NA))) +
  scale_fill_identity() +
  scale_color_identity() +
  coord_fixed() +
  theme_void()

代码说明

  • 父节点size修正:通过分组计算,将NS2A和NS5的size设为各自子节点size的总和,确保父节点能容纳所有子元素,避免布局错乱。
  • 顶点数据整合:将每个节点的颜色cc直接加入顶点数据,确保ggraph能正确映射颜色,不会出现错位。
  • 布局排序:sort.by = -size让大元素优先排列在外侧,解决大元素在中间的问题。
  • 边框颜色设置:父节点(root、NS2A、NS5)的边框设为白色,区分层级,子节点去掉边框避免干扰。

内容的提问来源于stack exchange,提问作者Paolo Lorenzini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:39:53