如何基于调查数据生成同结构、带属性控制的层级边束图
如何基于调查数据生成同结构、带属性控制的层级边束图
嘿,我完全get到你的需求了——想要基于不同的调查数据,生成结构完全一致但边的样式(比如宽度)随调查属性变化的层级边束图。咱们一步步来实现这个效果:
第一步:准备工作与固定布局
首先加载需要的工具包,然后生成固定的层级布局(这是保证所有图结构一致的关键):
library(tidyverse) library(ggraph) library(tidygraph) # 你的原始数据 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"), attr=c("e","f","g","f")) survey = data.frame(loc=c("A","A","B","C","C","D","D"), from=c("1.3.1","1.3.1","1.4.2","1.3.1","1.4.2","1.3.1","1.4.2"), n=c(2,5,3,4,1,3,3)) # 创建层级图并生成固定布局,后续所有图都用这个布局 hierarchy_gr <- as_tbl_graph(hierarchy) fixed_layout <- create_layout(hierarchy_gr, 'cactustree', upright=TRUE)
第二步:关联调查数据与连接关系
我们需要把survey中的n值和rel里的对应连接绑定起来,这样每条边都能拿到对应的属性值:
# 给原始连接数据添加ID,方便和调查数据关联 rel_with_id <- rel %>% mutate(rel_id = row_number()) # 整理调查数据:按地点和节点分组,把n值对应到每条连接上 survey_processed <- survey %>% group_by(loc, from) %>% mutate(rel_id = row_number()) # 假设同一节点的连接按顺序对应survey的行 ungroup() %>% left_join(rel_with_id, by = c("from", "rel_id")) %>% select(loc, from = from.x, to, n)
注:如果你的调查数据和连接的对应逻辑不同(比如直接通过
from和to配对),可以修改这里的关联条件,比如用by = c("from", "to")来匹配。
第三步:编写函数一键生成对应图
把绘图逻辑封装成函数,这样只需要传入地点名称就能生成对应的层级边束图:
plot_survey_bundle <- function(loc_name) { # 筛选当前地点的连接数据 current_rel <- survey_processed %>% filter(loc == loc_name) # 匹配节点在图中的ID vertices <- hierarchy_gr %>% V() from_ids <- match(current_rel$from, vertices$name) to_ids <- match(current_rel$to, vertices$name) # 使用固定布局绘图,边宽由n控制 ggraph(fixed_layout) + geom_node_text(aes(label = name, size = 0.5), check_overlap = TRUE) + geom_conn_bundle(data = get_con(from = from_ids, to = to_ids), aes(linewidth = n), colour = "red", tension = 1) + theme(legend.position = "right") + coord_fixed() + labs(title = paste("调查地点:", loc_name)) } # 生成各个地点的图 plot_survey_bundle("A") # 地点A的图 plot_survey_bundle("B") # 地点B的图 plot_survey_bundle("C") # 地点C的图 plot_survey_bundle("D") # 地点D的图
关键说明
- 固定布局:通过
create_layout预先生成布局,确保所有调查图的节点位置完全一致,方便对比不同数据的差异。 - 属性控制:通过
aes(linewidth = n)让边的宽度随调查数据中的n值变化,你也可以改成其他属性(比如颜色、透明度)来展示不同的调查指标。
备注:内容来源于stack exchange,提问作者Enrico Gabrielli
相关产品推荐
相关产品推荐

