ref:
https://jokergoo.github.io/circlize_book/book/the-chorddiagram-function.html
和弦圖
corclize::chordDiagram(mat)
圓形布局的一個(gè)獨(dú)特特征是通過鏈接對(duì)對(duì)象之間的關(guān)系進(jìn)行循環(huán)可視化。這種類型的圖稱為和弦圖。在circlize中,可以很容易地以簡(jiǎn)單或高度定制的方式繪制和弦圖。
1. 數(shù)據(jù)數(shù)據(jù)
chordDiagram() 接收兩種格式的輸入數(shù)據(jù):
- 鄰接矩陣
mat - 鄰接表
df
1.1 鄰接矩陣 mat
mat = matrix(1:9, 3)
rownames(mat) = letters[1:3]
colnames(mat) = LETTERS[1:3]
mat
## A B C
## a 1 4 7
## b 2 5 8
## c 3 6 9
1.2 鄰接表 df
df = data.frame(from = letters[1:3], to = LETTERS[1:3], value = 1:3)
df
## from to value
## 1 a A 1
## 2 b B 2
## 3 c C 3
1.3 鄰接矩陣 mat -> 鄰接表 df
df = data.frame(from = rep(rownames(mat), times = ncol(mat)),
to = rep(colnames(mat), each = nrow(mat)),
value = as.vector(mat),
stringsAsFactors = FALSE)
2. 制作和弦圖的基本用法
2.1 生成隨機(jī)Demo數(shù)據(jù)
生成鄰接矩陣 mat
set.seed(999)
mat = matrix(sample(18, 18), 3, 6)
rownames(mat) = paste0("S", 1:3)
colnames(mat) = paste0("E", 1:6)
mat
## E1 E2 E3 E4 E5 E6
## S1 4 14 13 17 5 2
## S2 7 1 6 8 12 15
## S3 9 10 3 16 11 18
鄰接矩陣 mat -> 鄰接表 df
df = data.frame(from = rep(rownames(mat), times = ncol(mat)),
to = rep(colnames(mat), each = nrow(mat)),
value = as.vector(mat),
stringsAsFactors = FALSE)
df
## from to value
## 1 S1 E1 4
## 2 S2 E1 7
## 3 S3 E1 9
## 4 S1 E2 14
## 5 S2 E2 1
## 6 S3 E2 10
## 7 S1 E3 13
## 8 S2 E3 6
## 9 S3 E3 3
## 10 S1 E4 17
## 11 S2 E4 8
## 12 S3 E4 16
## 13 S1 E5 5
## 14 S2 E5 12
## 15 S3 E5 11
## 16 S1 E6 2
## 17 S2 E6 15
## 18 S3 E6 18
2.2 基于 鄰接矩陣 mat 或者 鄰接表 df,繪制 和弦圖
- 基于鄰接矩陣?yán)L圖
library(circlize)
# 繪制和弦圖
chordDiagram(mat)
# 每次繪制完需要清空繪圖
circos.clear()
- 基于鄰接表繪圖
library(circlize)
# 繪制和弦圖
chordDiagram(df)
# 每次繪制完需要清空繪圖
circos.clear()
兩種方法都會(huì)得到相同的圖片

3. 圖片調(diào)整參數(shù)
和弦圖主要由三個(gè)部分組成:
- 標(biāo)簽 (labels)
- 扇區(qū) (sectors / grids)
- 扇區(qū)間的連線 (links)
3.1 調(diào)整 扇區(qū)的位置 chordDiagram(..., order = ...)
扇區(qū)的默認(rèn)順序是:
輸入是鄰接矩陣: union(rownames(mat), colnames(mat))
輸入是鄰接表:union(df[[1]], df[[2]])
par(mfrow = c(1, 2))
chordDiagram(mat, order = c("S2", "S1", "S3", "E4", "E1", "E5", "E2", "E6", "E3"))
circos.clear()
chordDiagram(mat, order = c("S2", "S1", "E4", "E1", "S3", "E5", "E2", "E6", "E3"))
circos.clear()

3.2 通過 circos.par() 調(diào)整圖形
由于和弦圖是通過基本的 circlize 函數(shù)實(shí)現(xiàn)的,就像普通的圓形圖一樣,因此可以通過circos.par()自定義布局。
3.2.1 扇區(qū)之間的間隙 circos.par(gap.after = ...)
-
gap.after接收 向量
#自定義布局
circos.par(gap.after = c(
rep(5, nrow(mat)-1), # gap at [S1 S2 S3]
15, # gap at [S3 E1]
rep(5, ncol(mat)-1), # gap at [E1 E2 E3 E4 E5 E6]
15 # gap at [E6 S1]
))
# 繪圖
chordDiagram(mat)
# 重置圖形設(shè)置
circos.clear()

-
gap.after接收 命名向量
#自定義布局
circos.par(
gap.after = c("S1" = 5, "S2" = 5, "S3" = 15, "E1" = 5,
"E2" = 5, "E3" = 5, "E4" = 5, "E5" = 5, "E6" = 15)
)
# 繪圖
chordDiagram(mat)
# 重置圖形設(shè)置
circos.clear()
-
全局調(diào)整 gap
chordDiagram(..., big.gap = ..., small.gap = ...)big.gap的值對(duì)應(yīng)于行扇區(qū)和列扇區(qū)(或者輸入是數(shù)據(jù)幀中的第一列扇區(qū)和第二列扇區(qū))之間的間隙。
small.gap參數(shù)控制與矩陣行或列對(duì)應(yīng)的扇區(qū)之間的間隙。默認(rèn)值為1度,一般情況下無需設(shè)置。
3.2.2 和弦圖角度 circos.par(start.degree = ...)
- 默認(rèn)是 0 度
# 設(shè)置初始角度是 85 度
circos.par(start.degree = 85)
# 逆時(shí)針放置 扇區(qū)
chordDiagram(mat, order = c(rev(colnames(mat)), rev(rownames(mat))))
circos.clear()
3.2.3 逆時(shí)針放置 扇區(qū)
- 注:不建議用
clock.wise = FALSE
# 設(shè)置初始角度是 85 度
circos.par(start.degree = 85)
# 逆時(shí)針放置 扇區(qū)
chordDiagram(mat, order = c(rev(colnames(mat)), rev(rownames(mat))))
circos.clear()

3.3 設(shè)置顏色
一般來說,扇區(qū)分為兩組。一個(gè)包含在矩陣的行或數(shù)據(jù)幀的第一列中定義的扇區(qū),另一個(gè)包含在矩陣的列或數(shù)據(jù)幀的第二列中定義的扇區(qū)。因此,鏈接連接兩個(gè)組中的對(duì)象。默認(rèn)情況下,鏈接顏色與第一組中相應(yīng)扇區(qū)的顏色相同。
3.3.1 設(shè)置扇區(qū)(網(wǎng)格)顏色 chordDiagram(..., grid.col = ...)
par(mfrow = c(1, 2))
# 定義扇區(qū)顏色的映射 (命名向量)
grid.col = c(S1 = "red", S2 = "green", S3 = "blue",
E1 = "grey", E2 = "grey", E3 = "grey", E4 = "grey", E5 = "grey", E6 = "grey")
# 通過 grid.col 參數(shù) 指定自定義的扇區(qū)顏色, 默認(rèn)連線顏色與第一組扇區(qū)顏色相同
chordDiagram(mat, grid.col = grid.col)
circos.clear()
# 轉(zhuǎn)置 鄰接矩陣, 設(shè)置連線顏色設(shè)置與第二組扇區(qū)顏色相同
chordDiagram(t(mat), grid.col = grid.col)
circos.clear()

3.3.2 設(shè)置鏈接(link)顏色 chordDiagram(..., col = ...)
- 對(duì)于鄰接矩陣
mat,可以通過提供顏色矩陣來自定義 link 的顏色。col = col_mat
# 定義扇區(qū)顏色的映射
grid.col = c(S1 = "red", S2 = "green", S3 = "blue",
E1 = "grey", E2 = "grey", E3 = "grey", E4 = "grey", E5 = "grey", E6 = "grey")
# 用rand_color()生成隨機(jī)顏色矩陣,用于連線顏色映射
col_mat = rand_color(length(mat), transparency = 0.5)
# to make sure it is a matrix
dim(col_mat) = dim(mat)
# 分別指定扇區(qū)顏色 grid.col 和連線顏色 col_mat
chordDiagram(mat, grid.col = grid.col, col = col_mat)
circos.clear()

- 對(duì)于鄰接表
df,link 的顏色可以自定義為 向量col = col
# 定義扇區(qū)顏色的映射
grid.col = c(S1 = "red", S2 = "green", S3 = "blue",
E1 = "grey", E2 = "grey", E3 = "grey", E4 = "grey", E5 = "grey", E6 = "grey")
# 用rand_color()生成隨機(jī)顏色矩陣,用于連線顏色映射
col = rand_color(nrow(df))
# 分別指定扇區(qū)顏色 grid.col 和連線顏色 col_mat
chordDiagram(mat, grid.col = grid.col, col = col)
circos.clear()
圖片效果和上面一樣
- link 顏色為連續(xù)的值,比如相關(guān)性值等
col = col_fun
當(dāng)關(guān)系的強(qiáng)度(例如相關(guān)性)表示為連續(xù)值時(shí), col也可以指定為自定義的顏色映射函數(shù)。 chordDiagram()接受由colorRamp2()生成的顏色映射
# 定義扇區(qū)顏色的映射
grid.col = c(S1 = "red", S2 = "green", S3 = "blue",
E1 = "grey", E2 = "grey", E3 = "grey", E4 = "grey", E5 = "grey", E6 = "grey")
# 由colorRamp2()生成的顏色映射,用于連線顏色映射
col_fun = colorRamp2(range(mat), c("#FFEEEE", "#FF0000"), transparency = 0.5)
# 分別指定扇區(qū)顏色 grid.col 和連線顏色 col_mat
chordDiagram(mat, grid.col = grid.col, col = col_fun)
circos.clear()

顏色映射函數(shù)也適用于鄰接表
chordDiagram(df, grid.col = grid.col, col = col_fun)
- 當(dāng)輸入是矩陣時(shí),有時(shí)不需要生成整個(gè)顏色矩陣。您可以只提供與行或列相對(duì)應(yīng)的顏色,以便來自同一行/列的鏈接將具有相同的顏色
這里注意顏色值可以設(shè)置為數(shù)字、顏色名稱或十六進(jìn)制代碼,與基本 R 圖形中相同。
# 將link顏色設(shè)置為與和弦圖中的行扇區(qū)相同
chordDiagram(mat, grid.col = grid.col, row.col = 1:3)
# 將link顏色設(shè)置為與和弦圖中的列扇區(qū)相同
chordDiagram(mat, grid.col = grid.col, column.col = 1:6)

3.4 調(diào)整 link 的順序 chordDiagram(..., link.zindex = ...)
將鏈接添加到圖中的默認(rèn)順序基于它們?cè)诰仃嚮驍?shù)據(jù)框中的順序。通常,應(yīng)將鏈接顏色設(shè)置為透明度,以便它們不會(huì)相互重疊。在大多數(shù)情況下,這看起來不錯(cuò),但有時(shí),它可以改善可視化效果,將寬鏈接放在更靠前的位置,將小鏈接放在更靠后的位置。
# 默認(rèn)不排序
chordDiagram(mat, grid.col = grid.col,
transparency = 0
)
# 添加link的順序, 按照 mat 中值的大小排序
chordDiagram(mat, grid.col = grid.col,
transparency = 0,
link.zindex = rank(mat)
)