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

环形树状图(Circular Dendrogram)边分组着色实现求助

给环形树状图的边分组着色(ggraph/igraph)

要实现环形树状图中部分边分组着色的效果,核心是给边数据添加分组标识,再通过ggraph的边图层映射该标识到颜色。以下是具体实现步骤:

步骤1:给边数据添加分组标签

在构建边数据时,根据所属大组为每条边标记分组(示例中将group1-5归为红色组,group6-10归为蓝色组):

# 构建边数据并添加分组
d1 <- data.frame(from="origin", to=paste("group", seq(1,10), sep=""))
d2 <- data.frame(from=rep(d1$to, each=10), to=paste("subgroup", seq(1,100), sep="_"))
edges <- rbind(d1, d2) %>%
  mutate(
    edge_group = case_when(
      # 中心到group的边按目标group归属分组
      to %in% paste("group", 1:5, sep="") ~ "red_group",
      to %in% paste("group", 6:10, sep="") ~ "blue_group",
      # 子组边根据父group归属分组
      str_detect(from, "group [1-5]") ~ "red_group",
      str_detect(from, "group [6-9]|group 10") ~ "blue_group"
    )
  )

步骤2:保留边属性创建图对象

使用graph_from_data_frame创建igraph对象时,边数据中的edge_group列会作为边属性被保留:

# 创建顶点数据(补充原代码缺失的group列)
vertices <- data.frame(
  name = unique(c(as.character(edges$from), as.character(edges$to))),
  value = runif(111),
  # 给顶点添加分组,用于后续节点着色(可选)
  group = case_when(
    str_detect(name, "group [1-5]") ~ "red_group",
    str_detect(name, "group [6-9]|group 10") ~ "blue_group",
    str_detect(name, "subgroup") ~ str_extract(name, "group \\d+"),
    TRUE ~ "center"
  )
)

mygraph <- graph_from_data_frame(edges, vertices=vertices)

步骤3:绘图时映射边分组到颜色

在geom_edge_diagonal0中通过aes(colour = edge_group)绑定分组与颜色,再用scale_colour_manual指定自定义颜色:

ggraph(mygraph, 'dendrogram', circular = TRUE) +
  # 边按分组着色,可调整linewidth控制边宽
  geom_edge_diagonal0(aes(colour = edge_group), linewidth = 1.2) +
  geom_node_text(aes(filter = leaf, angle = node_angle(x, y), label = name),
                 hjust = 'outward', size = 2) +
  # 修正节点颜色映射(使用顶点的group列)
  geom_node_point(aes(filter = leaf, x = x*1.07, y=y*1.07, colour=group, size=value, alpha=0.2)) +
  # 指定边和节点的自定义颜色
  scale_colour_manual(
    values = c(
      red_group = "#e53935",
      blue_group = "#1e88e5",
      center = "#757575",
      # 子组节点继承父group颜色
      !!!set_names(rep("#e53935",5), paste("group",1:5,sep="")),
      !!!set_names(rep("#1e88e5",5), paste("group",6:10,sep=""))
    )
  ) +
  scale_size_continuous(range = c(0.1,10)) +
  theme_void() +
  theme(
    legend.position="none",
    plot.margin=unit(c(0,0,0,0),"cm"),
  ) +
  expand_limits(x = c(-1.3, 1.3), y = c(-1.3, 1.3))

关键说明

  • 边的分组逻辑可根据实际需求调整,比如按不同层级或自定义规则划分;
  • 若需要更“块化”的填充效果(而非线条着色),可尝试geom_edge_fan配合fill属性,需注意环形树状图的适配;
  • 原代码中geom_node_point的colour=group存在顶点数据无group列的问题,已在顶点数据中补充该列并适配颜色映射。

内容的提问来源于stack exchange,提问作者Akram H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:43:15