如何在Hierarchical Edge Bundle中仅可视化二级连接的文本?
仅显示层次边束图中二级连接相关节点文本的解决方案
你需要基于层级结构和二级连接数据生成cactustree布局的层次边束图,但仅保留与二级连接相关的节点文本,可通过筛选节点并控制文本显示条件实现,具体步骤如下:
原始数据
hierarchy=data.frame(from=c("1","1","1","1","1.1","1.1","1.2","1.2","1.3","1.3","1.4","1.4"), to=c("1.1","1.2","1.3","1.4","1.1.1","1.1.2","1.2.1","1.2.2","1.3.1","1.3.2","1.4.1","1.4.2")) rel = data.frame(from=c("1.3.1","1.3.1","1.4.2","1.4.2"), to=c("1.1.2","1.3.2","1.2.1","1.1.1"))
常规生成代码(显示所有节点文本)
hierarchy_gr = as_tbl_graph(hierarchy) vertices_hierarchy = hierarchy_gr %>% V() from <- match( rel$from, vertices_hierarchy$name) to <- match( rel$to, vertices_hierarchy$name) ggraph(hierarchy_gr, 'cactustree',upright=TRUE) + # geom_node_circle(aes(fill = depth), size = 0.25, alpha = 0.2) + geom_conn_bundle(data = get_con(from = from, to = to), colour="red",linewidth=1,tension = 1) + geom_node_text(aes(label = name, size=0.5),check_overlap = TRUE) + theme(legend.position = "none") + coord_fixed()
修改后的代码(仅显示二级连接相关节点文本)
核心思路:提取二级连接rel中所有涉及的节点名称,在绘制文本时仅对这些节点显示名称,其余节点不输出文本。
library(tidygraph) library(ggraph) # 加载数据 hierarchy=data.frame(from=c("1","1","1","1","1.1","1.1","1.2","1.2","1.3","1.3","1.4","1.4"), to=c("1.1","1.2","1.3","1.4","1.1.1","1.1.2","1.2.1","1.2.2","1.3.1","1.3.2","1.4.1","1.4.2")) rel = data.frame(from=c("1.3.1","1.3.1","1.4.2","1.4.2"), to=c("1.1.2","1.3.2","1.2.1","1.1.1")) # 创建图对象 hierarchy_gr = as_tbl_graph(hierarchy) vertices_hierarchy = hierarchy_gr %>% V() from <- match( rel$from, vertices_hierarchy$name) to <- match( rel$to, vertices_hierarchy$name) # 提取所有二级连接涉及的节点名称(去重) relevant_nodes <- unique(c(rel$from, rel$to)) # 绘图:仅显示相关节点的文本 ggraph(hierarchy_gr, 'cactustree', upright=TRUE) + geom_conn_bundle(data = get_con(from = from, to = to), colour="red", linewidth=1, tension = 1) + # 通过ifelse控制文本显示:仅在relevant_nodes中的节点才显示name,否则为空 geom_node_text(aes(label = ifelse(name %in% relevant_nodes, name, "")), size=0.5, check_overlap = TRUE) + theme(legend.position = "none") + coord_fixed()
关键说明
relevant_nodes集合包含了所有二级连接的起点和终点节点,确保只保留这些节点的文本geom_node_text中通过ifelse(name %in% relevant_nodes, name, "")实现条件显示:符合条件的节点显示名称,其余节点文本为空(即不显示)
内容的提问来源于stack exchange,提问作者Enrico Gabrielli
相关产品推荐
相关产品推荐

