和弦圖 - Chord Diagram

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ì)得到相同的圖片


Fig 2.2 Basic usages of chordDiagram()

3. 圖片調(diào)整參數(shù)

和弦圖主要由三個(gè)部分組成:

  1. 標(biāo)簽 (labels)
  2. 扇區(qū) (sectors / grids)
  3. 扇區(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()
Fig 3.1 Adjust sector orders in Chord diagram

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()
Fig 3.2.1 Set gaps in Chord diagram.
  • 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()
Fig 3.2.3 逆時(shí)針放置 扇區(qū)

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()
Fig 3.3.1 Set grid colors in Chord diagram

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()
Fig 3.3.2 指定扇區(qū)顏色 grid.col 和連線顏色 col_mat
  • 對(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()
Fig 3.3.2 Set a color mapping function for links in Chord diagram.

顏色映射函數(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)
Fig 3.3.2 將鏈接顏色設(shè)置為與和弦圖中的行扇區(qū)或列扇區(qū)相同。

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)
)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容