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

如何在R中制作环形桑基图?求可行方案及代码示例

实现类似WEF转型地图的环形桑基图(R语言方案)

推荐R包

  • circlize:专门用于环形可视化的工具包,原生支持弦图(环形桑基的核心形式),可灵活控制节点布局、连接样式和颜色映射
  • ggiraph:将静态图形转为交互式,支持hover提示、点击交互等功能,满足Info字段的探索需求
  • dplyr:辅助数据预处理,简化节点分类和格式转换

实现思路

  1. 数据预处理:明确区分内圈(Point_from)和外圈(Point_to)节点,避免节点名称冲突;将Value作为连接宽度的映射依据,Info用于定义连接颜色或交互提示内容
  2. 环形布局设置:通过circlize的轨道参数,将内圈节点放在内层轨道、外圈节点放在外层轨道,调整节点间隙、起始角度优化视觉效果
  3. 连接绘制:使用chordDiagram()绘制单向连接(内圈→外圈),用Value控制连接宽度,Info映射连接颜色;添加方向标识(高度差)强化流向
  4. 交互增强:借助ggiraph将静态环形图转为交互式,hover时显示Info等关联信息

代码示例

加载依赖包

library(circlize)
library(ggiraph)
library(dplyr)

准备示例数据

df <- data.frame(
  Point_from = c("A", "A", "B", "B", "C"),
  Point_to = c("D", "E", "E", "F", "G"),
  Value = c(1, 1, 3, 1, 1),
  Info = c("BLUE", "BLUE", "GREEN", "BLUE", "BLUE")
)

定义节点分组与布局参数

# 区分内外圈节点
inner_nodes <- unique(df$Point_from)
outer_nodes <- unique(df$Point_to)
all_nodes <- c(inner_nodes, outer_nodes)

# 初始化环形布局
circos.clear()
circos.par(
  start.degree = 90,
  gap.degree = c(rep(10, length(inner_nodes)-1), 20, rep(10, length(outer_nodes)-1), 20),
  track.height = 0.1
)

# 创建内外层轨道
circos.initialize(factors = all_nodes, xlim = c(0, 1))
circos.trackPlotRegion(factors = inner_nodes, ylim = c(0, 1), track.height = 0.1, bg.col = "white")
circos.trackPlotRegion(factors = outer_nodes, ylim = c(1, 2), track.height = 0.1, bg.col = "white")

绘制环形桑基图

# 颜色映射配置
color_map <- c(BLUE = "#1f77b4", GREEN = "#2ca02c")
node_color <- c(A = "#999999", B = "#999999", C = "#999999", 
                D = "#666666", E = "#666666", F = "#666666", G = "#666666")

# 绘制单向弦连接
chordDiagram(
  df,
  grid.col = node_color,
  col = color_map[df$Info],
  transparency = 0.3,
  directional = 1,
  direction.type = "diffHeight",
  diffHeight = -0.04,
  annotationTrack = "grid",
  annotationTrackHeight = c(0.05, 0.05)
)

# 添加节点标签
circos.trackText(
  factors = inner_nodes, x = 0.5, y = 0.5, 
  labels = inner_nodes, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5)
)
circos.trackText(
  factors = outer_nodes, x = 0.5, y = 1.5, 
  labels = outer_nodes, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5)
)

转为交互式图形

# 提取静态图并添加交互
g <- grid.grab()
ggiraph(
  code = print(g),
  tooltip = paste("强度:", df$Value, "| 信息:", df$Info),  # hover显示组合信息
  tooltip_extra_css = "background-color:white;padding:5px;border-radius:3px;",
  hover_css = "cursor:pointer;"
)

优化提示

  • 若节点数量较多,可调整gap.degree参数减小节点间隙,避免标签重叠
  • 可自定义节点颜色和连接透明度,匹配项目视觉风格
  • 如需点击交互(如跳转详情),可结合ggiraph的onclick参数实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:09:52