多个组别的和弦图
和弦图(Chord diagram)使用的最多的情形是可视化两个组别之间的相互关系。circlize从0.4.10版本开始,我在chordDiagram()
函数中加入了一个新的group
参数。此参数可以用来控制多个组别的和弦图的绘制。
首先我创建了一个随机矩阵,其中包含着三个组别之间的相互关系(A
,B
和C
)。请注意,这个新的功能同样也适用于数据框。
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)] = mat1
mat[rownames(mat2), colnames(mat2)] = mat2
mat[rownames(mat3), colnames(mat3)] = mat3
mat
## B1 B2 B3 B4 B5 C1 C2 C3 C4 C5
## A1 1.799 0.647 -1.35 0.23 1.340 0.045 -1.03 -0.001 1.667 -0.33
## A2 0.317 0.931 1.58 -0.33 -1.980 0.104 -2.29 -1.650 -1.065 -0.50
## A3 0.774 1.090 0.55 -0.52 -1.415 0.616 1.09 0.873 -0.310 -0.62
## A4 0.061 0.036 0.87 -0.90 0.024 -0.224 1.58 -0.782 -0.035 0.44
## A5 -0.262 -0.413 0.40 0.13 1.113 0.542 1.05 1.045 1.147 2.60
## B1 0.000 0.000 0.00 0.00 0.000 -1.433 -1.22 0.065 1.444 0.41
## B2 0.000 0.000 0.00 0.00 0.000 -1.035 -0.38 -0.413 -1.425 1.31
## B3 0.000 0.000 0.00 0.00 0.000 -0.942 0.51 0.137 0.017 -0.65
## B4 0.000 0.000 0.00 0.00 0.000 0.142 -1.12 -0.272 0.960 0.22
## B5 0.000 0.000 0.00 0.00 0.000 -1.247 1.66 -0.204 -0.986 0.16
矩阵中的数值表示两个元素之间连接的强度,此数值将会被映射到最终的和弦图上的link的宽度上。
此新功能最主要的一点是用户需要创建一个“分组变量”,此变量包含了每个组的名字,并且组中的元素作为变量的名字。请见如下例子:
nm = unique(unlist(dimnames(mat)))
group = structure(gsub("\\d", "", nm), names = nm)
group
## A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5
## "A" "A" "A" "A" "A" "B" "B" "B" "B" "B" "C" "C" "C" "C" "C"
即元素A1
-A5
属于A
组,B1
-B5
属于B
组,C1
-C5
属于C
组。
我们把group
变量赋予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)

哈,成功被分成了三组!
我们可以试一试另一种分组方式(组名为1, 2, 3, 4, 5)
group = structure(gsub("^\\w", "", nm), names = nm)
group
## A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5
## "1" "2" "3" "4" "5" "1" "2" "3" "4" "5" "1" "2" "3" "4" "5"
chordDiagram(mat, grou
p = group,
grid.col = grid.col)
类似的,A1
,B1
和C1
被分到了一个组中。

group
变量控制着和弦图中每个sector的顺序(也就是A1
,A2
,...),如果group
变量是一个factor,那么factor的level的顺序控制着和弦图中组之间的顺序。
下面的这个group
变量中,我们定义组之间的顺序为C
,A
和B
,同时我们也手动设置所有sector的顺序:
group = structure(gsub("\\d", "", nm), names = nm)
group = factor(group[sample(length(group), length(group))], levels = c("C", "A", "B"))
group
## B2 C1 A5 A2 A1 C4 B5 C5 C2 A4 B1 A3 B4 B3 C3
## B C A A A C B C C A B A B B C
## Levels: C A B
chordDiagram(mat, group = group,
grid.col = grid.col)
生成的图和我们设定的顺序一样。

为了突出组与组之间的差别,组之间的间隙较大,而组内各个sector的间隙较小。这两个间隙的值可以通过big.gap
和small.gap
来控制,它们两个的单位是圆上的度。
group = structure(gsub("\\d", "", nm), names = nm)
chordDiagram(mat, group = group,
grid.col = grid.col,
big.gap = 20, small.gap = 5)

我们可以通过常规的对和弦图定制化的方法对多组别的和弦图进行定制化。如下图,我在最外圈加上了三个条带用来强调这里有三个组。而在内部,我们把每个sector的名字写在了其格子中。完整代码请见“阅读原文”。

往期精品(点击图片直达文字对应教程)
后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集