如何在R中制作环形桑基图?求可行方案及代码示例
实现类似WEF转型地图的环形桑基图(R语言方案)
推荐R包
circlize:专门用于环形可视化的工具包,原生支持弦图(环形桑基的核心形式),可灵活控制节点布局、连接样式和颜色映射ggiraph:将静态图形转为交互式,支持hover提示、点击交互等功能,满足Info字段的探索需求dplyr:辅助数据预处理,简化节点分类和格式转换
实现思路
- 数据预处理:明确区分内圈(
Point_from)和外圈(Point_to)节点,避免节点名称冲突;将Value作为连接宽度的映射依据,Info用于定义连接颜色或交互提示内容 - 环形布局设置:通过
circlize的轨道参数,将内圈节点放在内层轨道、外圈节点放在外层轨道,调整节点间隙、起始角度优化视觉效果 - 连接绘制:使用
chordDiagram()绘制单向连接(内圈→外圈),用Value控制连接宽度,Info映射连接颜色;添加方向标识(高度差)强化流向 - 交互增强:借助
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
相关产品推荐
相关产品推荐

