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

如何基于调查数据生成同结构、带属性控制的层级边束图

如何基于调查数据生成同结构、带属性控制的层级边束图

嘿,我完全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:03:12