环形树状图(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
相关产品推荐
相关产品推荐

