✅从 circlize 包 0.4.10 开始,chordDiagram() 新增了 group 参数。你可以给每个节点(扇区)指定一个“组别”,函数会自动把同组的扇区排在一起,并在不同组之间留更大的间隙(也可用 big.gap 控制),从而更轻松地画出多组(分组)Chord 图。
📌参考网址:https://jokergoo.github.io/2020/06/08/multiple-group-chord-diagram/
library(circlize)mat1 = matrix(rnorm(25), nrow = 5)rownames(mat1) = paste0("A", 1:5)colnames(mat1) = paste0("B", 1:5)mat2 = matrix(rnorm(25), nrow = 5)rownames(mat2) = paste0("A", 1:5)colnames(mat2) = paste0("C", 1:5)mat3 = matrix(rnorm(25), nrow = 5)rownames(mat3) = paste0("B", 1:5)colnames(mat3) = paste0("C", 1:5)mat = matrix(0, nrow = 10, ncol = 10)rownames(mat) = c(rownames(mat2), rownames(mat3))colnames(mat) = c(colnames(mat1), colnames(mat2))mat[rownames(mat1), colnames(mat1)] = mat1mat[rownames(mat2), colnames(mat2)] = mat2mat[rownames(mat3), colnames(mat3)] = mat3mat
nm = unique(unlist(dimnames(mat)))group = structure(gsub("\\d", "", nm), names = nm)group
grid.col = structure(c(rep(2, 5), rep(3, 5), rep(4, 5)),names = c(paste0("A", 1:5), paste0("B", 1:5),paste0("C", 1:5)))chordDiagram(mat, group = group, grid.col = grid.col)circos.clear()
group = structure(gsub("^\\w", "", nm), names = nm)groupchordDiagram(mat, group = group, grid.col = grid.col)circos.clear()
group = structure(gsub("\\d", "", nm), names = nm)group = factor(group[sample(length(group), length(group))], levels = c("C", "A", "B"))groupchordDiagram(mat, group = group, grid.col = grid.col)circos.clear()
🧩在 chordDiagram() 里使用 group 参数时,组的顺序会决定扇区(sector)的排列顺序。如果你把 group 变量设为因子(factor)类型,那么因子的水平(levels)顺序就会决定这些组在图中的排列顺序。
具体来说就是 你设定levels是CAB 那就是在画图时候,从C开始找顺序 所以是C3 C2 C5 C1 C4 A1 A4以此类推这样
group = structure(gsub("\\d", "", nm), names = nm)chordDiagram(mat, group = group, grid.col = grid.col, big.gap = 20, small.gap = 5)circos.clear()
big.gap:控制不同组之间的空隙有多大。
👉 也就是组与组之间的“宽缝隙”。
small.gap:控制同一组内的扇区之间的空隙有多大。
👉 也就是组内扇区之间的“小缝隙”。
group = structure(gsub("\\d", "", nm), names = nm)chordDiagram(mat, group = group, grid.col = grid.col,annotationTrack = c("grid", "axis"),preAllocateTracks = list(track.height = mm_h(4),track.margin = c(mm_h(4), 0)))circos.track(track.index = 2, panel.fun = function(x, y) {sector.index = get.cell.meta.data("sector.index")xlim = get.cell.meta.data("xlim")ylim = get.cell.meta.data("ylim")circos.text(mean(xlim), mean(ylim), sector.index,cex = 0.6, niceFacing = TRUE)}, bg.border = NA)highlight.sector(rownames(mat1), track.index = 1, col = "red",text = "A", cex = 0.8, text.col = "white", niceFacing = TRUE)highlight.sector(colnames(mat1), track.index = 1, col = "green",text = "B", cex = 0.8, text.col = "white", niceFacing = TRUE)highlight.sector(colnames(mat2), track.index = 1, col = "blue",text = "C", cex = 0.8, text.col = "white", niceFacing = TRUE)
mat:流量/关联的矩阵(行列名对应扇区)。group = group:使用上面生成的分组信息。grid.col = grid.col:给每个扇区指定颜色(名字需与扇区名匹配)。annotationTrack = c("grid","axis"):要求在外圈轨道显示扇区底盘(grid)和刻度轴(axis)。preAllocateTracks = ...:先预留一条外层轨道(高度 4mm,外侧留 4mm 间距)。这样后面可以在这条轨道里放文字或做高亮。mm_h():用毫米指定高度/边距,便于版面控制。
track.index = 2:指当前要操作第 2 条轨道(第 1 条是最外层,上一句预留的那条;画弦图时通常还会生成一条用于链接/轴等,索引可能因设置而不同,这里作者明确选择第 2 条)。get.cell.meta.data("sector.index"):取到当前面板对应的扇区名。xlim/ylim:得到该扇区在当前轨道里的 x/y 范围,mean()取中心点坐标。circos.text(...):把扇区名写在该扇区这条轨道的中心位置;niceFacing=TRUE让文字随圆弧方向自动调整朝向。bg.border = NA:不要轨道边框线。
highlight.sector(sectors, ...):对给定的一组扇区在指定轨道上画一条彩色背景带,并可在该组上方写一个组标签文字。这里分别用三次调用,把三组扇区高亮为红/绿/蓝,并用
text="A"/"B"/"C"作为该组的名字。
rownames(mat1)、colnames(mat1)、colnames(mat2):各自代表三组扇区的名称集合(要与你的扇区名一致)。作者用不同来源(行名/列名)只是方便从已有对象里取到想要的一组扇区。
track.index = 1:在最外层那条预留的轨道上做高亮(看起来更像“组带”)。
cex=0.8、text.col="white":标签大小与颜色;niceFacing=TRUE同样让文字顺着圆形朝向。
好啦,本期分享分享就到这结束啦,感谢大家关注支持,祝大家科研顺利~




