R_circlize包_和弦图
卖萌控的博客
点击这里进入电脑版页面!体验更好
R_circlize包_和弦图
2022-6-30 萌小白


作者:李誉辉四川大学在读研究生



R_插值_拟合_回归_样条



[参考来源](https://jokergoo.github.io/circlize_book/book/the-chorddiagram-function.html)



par参数:



和弦图 和弦图简介


和弦图长什么样子:



和弦图在线



(http://circos.ca/intro/tabular_visualization/)



和弦图即可以反映2类变量之间的相互作用关系,也可以反映相互作用强度,这是其它图比不了的



和弦图的弦link的宽度代表所连接的两个对象的相互作用强弱,link越宽,则相互作用越强



和弦图常用于绘制国家之间的贸易往来量,城市之间的航班往来量,还有细胞和基因数据可视化(这个领域不了解)



邻接表(和弦图数据源)



邻接表强调2类对象之间的相互作用强弱,分为邻接矩阵(adjacency matrix)和邻接列表(adjacency list)



library(circlize) # 编一个邻接矩阵 mat <-
matrix(1:9, 3) # 第1列不是id列,通过行命名替代 rownames(mat) <- letters[1:3]
colnames(mat) <- LETTERS[1:3] mat # 编一个邻接列表 df <- data.frame(from =
letters[1:3], to = LETTERS[1:3], value = 1:3) df





可以使用内置函数generateRandomBed()产生随机基因类数据:



语法:



generateRandomBed(nr = 10000, nc = 1, fun = function(k) rnorm(k, 0, 0.5), species = NULL)



参数解释:



library(circlize) set.seed(999) bed =
generateRandomBed() # 默认参数 head(bed) bed = generateRandomBed(nr = 200,
nc = 4) nrow(bed) bed = generateRandomBed(nc = 2, fun = function(k)
sample(letters, k, replace = TRUE)) # 默认产生1000行数据 head(bed)





初步绘图



输入邻接表数据,默认参数,自动绘图,



构造数据



library(circlize) # 构造一个邻接矩阵
set.seed(999) mat <- matrix(sample(18, 18), 3, 6) # 3行6列的矩阵
rownames(mat) <- paste0("S", 1:3) # 生成行名 colnames(mat) <-
paste0("E", 1:6) # 生成列名 # 构造一个邻接列表 df <- data.frame(from =
rep(rownames(mat), times = ncol(mat)), # 第1列对象 to = rep(colnames(mat),
each = nrow(mat)), # 第2列对象 value = as.vector(mat), # 第3列前2列对象相互作用强度
stringsAsFactors = FALSE) df






绘图



library(circlize) # 使用邻接矩阵 chordDiagram(mat) circos.clear() # 结束绘图,否则会继续叠加图层 # 使用邻接列表 chordDiagram(df) circos.clear()









参数调整



调整了参数,绘图结束后,使用circos.clear()重置参数,使返回到默认状态



参数分为2大类:



circos.par 内置参数
























分类

参数

描述

sectors间隙

gap.after

调整外围sectors之间的间隙,用数字向量进行指定

sectors旋转方向

clock.wise

为逻辑值,设置外围sectors的旋转方向

sectors起点位置

start.degree

为-360到360的数字,调整第一个sector的位置,与旋转方向有关

gap 间隙调整


sectors之间的间隙可以用gap.after =调整



指定间隙的数字向量长度应该与sectors数量一致



library(circlize) # 使用邻接矩阵时
circos.par(gap.after = c(rep(5, nrow(mat)-1), # 2个5,表示3个行名之间的间隙分别为5个单位
15, # 表示行名与列名之间的间隙,为15个单位 rep(5, ncol(mat)-1), # 5个5,表示6个列名之间的间隙分别为5个单位
15)) # 表示列名与行名之间的间隙,为15个单位 chordDiagram(mat) circos.clear() # 返回默认设置 #
使用邻接列表时 circos.par(gap.after = c(rep(5, length(unique(df[[1]]))-1), #
表示第1列元素之间的间隙为5个单位 15, # 表示第1列与第2列之间的间隙为15个单位 rep(5,
length(unique(df[[2]]))-1), # 表示第2列元素之间的间隙为5个单位 15)) #
表示第2列与第1列之间的间隙为15个单位 chordDiagram(df) circos.clear()









sector起点位置及旋转方向调整



sector默认为3点钟顺时针方向,



library(circlize) circos.par(start.degree
= 90, clock.wise = FALSE) # 逆时针旋转,起点位置在逆时针90度方向,即12点针方向
chordDiagram(mat) circos.clear()





chordDiagram内置参数



chordDiagram()内置参数很多,分类及作用如下:
































































































分类

参数

描述

sectors顺序

order

调整外围sectors排列顺序,用字符串向量指定,其长度与sectors数量一致

sectors颜色

grid.col

调整外围sectors颜色,颜色向量指定,通常使用名称属性进行匹配,默认顺序匹配

link颜色

col

用颜色矩阵或颜色向量指定,对于邻接矩阵和邻接列表不一样

link透明度

transparency

用0(不透明)到1(透明)的数字指定,如果要设置不同的透明度,则用法与颜色指定类似

link边线宽

link.lwd

用数字指定link弦边缘线宽度

link边线型

link.lty

用数字指定link弦边缘线的线型,与par参数一致

link边线颜色

link.border

指定link弦边缘线的颜色

link弦可见

link.visible

指定要显示的弦,用逻辑向量或矩阵指定,只显示逻辑值为正的弦

sectors内的顺序

link.decreasing

为逻辑值,表示指定link在sector内的顺序,需要先指定link.sort = TRUE

sectors外顺序

link.rank

指定link在各个sector之间的顺序,用数字向量或矩阵指定,值大的后添加在表层

自我连接

self.link

指定自我连接的类型,=1 或 =2

对称矩阵

symmetric

为逻辑值,symmetric = TRUE表示只画邻接矩阵下三角部分,不包括对角线

link方向

directional

=1或 =-1,设置方向后,link终点高度将缩短,可以调节缩短量

link箭头

direction.type

指定方向类型: "arrows"c("arrows", "diffHeight")"big.arrow"大箭头

link高度

diffHeight

指定link终点缩短量,可以为负数,必须先在direction.type中设定diffHeight

窄弦丢弃

reduce

从0到1的数字,表示link宽度小于弦总宽度百分比的link将不予显示,circos.info()可查看

轨道显示

annotationTrack

表示指定要显示的轨道,NULL隐藏,c("name", "grid", "axis")标签,网格和刻度

外围sectors的顺序






颜色调整



通常外围sector分为2类,第1类代表邻接矩阵的行名或邻接列表的第一列,第2类代表邻接矩阵的列名和邻接列表的第2列,



连接弦link就是将2类sectors连接起来, 默认连接弦link的颜色与第1类对象的颜色一致



改变外围sector中第1类对象的颜色,连接弦的颜色也会随之改变



library(circlize) grid_col <- c(S1 =
"red", S2 = "green", S3 = "blue", E1 = "grey", E2 = "grey", E3 = "grey",
E4 = "grey", E5 = "grey", E6 = "grey") # 构建颜色向量,指定名称属性,则按名称匹配
chordDiagram(mat, grid.col = grid_col, transparency = 0.7) #
调整外围sector颜色,增加透明度 chordDiagram(t(mat), grid.col = grid_col) #
按名称匹配,则link颜色与mat矩阵的列名一致,全变为灰色








调整link颜色及透明度



colorRamp2(breaks, colors, transparency = 0, space = "LAB")离散色板连续化,space表示色彩空间



library(circlize) # 数据是邻接矩阵 col_mat
<- rand_color(length(mat), transparency = 0.7) # 产生随机颜色矩阵,并指定透明度
dim(col_mat) <- dim(mat) # 以确保col_mat是一个矩阵 chordDiagram(mat, grid.col
= grid_col, col = col_mat) # 设置link颜色, circos.clear() # 数据是邻接列表 cols
<- rand_color(nrow(df), transparency = 0.7) chordDiagram(df, grid.col
= grid_col, col = cols) circos.clear() # link为连续变量 col_fun <-
colorRamp2(range(mat), c("#FFEEEE", "#FF0000"), transparency = 0.5) #
产生连续色块并指定透明度 chordDiagram(mat, grid.col = grid_col, col = col_fun)
circos.clear() # 用数字指定link颜色 chordDiagram(mat, grid.col = grid_col,
row.col = 1:3, transparency = 0.7) # 用数字向量指定颜色,向量长度与连接矩阵的行数相同
chordDiagram(mat, grid.col = grid_col, column.col = 1:6, transparency =
0.7) # 用数字向量指定颜色,向量长度与连接矩阵的列数相同 circos.clear()


















link边线宽,边线型,边线颜色



library(circlize) # 用长度的1的向量指定
chordDiagram(mat, grid.col = grid_col, link.lwd = 2, link.lty = 2,
link.border = "red") # 指定link边线宽度,边线线型,边线颜色 circos.clear() # 用矩阵指定
lwd_mat <- matrix(1, nrow = nrow(mat), ncol = ncol(mat)) #
元素为1的矩阵,其维度与源数据mat一致 lwd_mat[mat > 12] <- 2 # relation >
12,则加宽link边线 border_mat <- matrix(NA, nrow = nrow(mat), ncol =
ncol(mat)) # 元素为NA的矩阵,其维度与源数据mat一致 border_mat[mat > 12] <- "red" #
relation > 2,则为红色边缘线 chordDiagram(mat, grid.col = grid_col, link.lwd
= lwd_mat, link.border = border_mat) # 指定link边缘线宽度,边缘线颜色 circos.clear()
# 参数矩阵维度与数据源不一致,则改变部分颜色,必须按名称属性匹配 border_mat2 <- matrix("black",
nrow = 1, ncol = ncol(mat)) # 生成1行的矩阵,其宽与数据源mat一致 rownames(border_mat2)
<- rownames(mat)[2] # 将mat第2个行名赋值给border_mat2,则只会改变第mat第2行的边缘线颜色
colnames(border_mat2) <- colnames(mat) # 赋值列名,与数据源mat一致
chordDiagram(mat, grid.col = grid_col, link.lwd = 2, link.border =
border_mat2) # circos.clear() #
参数矩阵还可以设置为特殊的3列格式,前2列分别对应数据源的行名称和列名称,第3列为参数列,相当于邻接列表格式的参数矩阵 lty_df <-
data.frame(c("S1", "S2", "S3"), c("E5", "E6", "E6"), c(1, 2, 3)) #
link边缘线分别为1, 2, 3 lwd_df <- data.frame(c("S1", "S2", "S3"), c("E5",
"E6", "E4"), c(2, 2, 2)) # link边线线宽为2 border_df <- data.frame(c("S1",
"S2", "S3"), c("E5", "E6", "E4"), c(1, 1, 1)) # link边缘线颜色为1
chordDiagram(mat, grid.col = grid_col, link.lty = lty_df, link.lwd =
lwd_df, link.border = border_df) circos.clear() #
当数据源是邻接列表时,只需要指定跟源数据一样行数的向量,特别方便 chordDiagram(df, grid.col = grid_col,
link.lty = sample(1:3,nrow(df), replace = TRUE), link.lwd =
runif(nrow(df)) * 2, link.border = sample(0:1, nrow(df), replace =
TRUE)) circos.clear()

















发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容