和弦图可用于表示数据间的关系和流量。外围不同颜色圆环表示数据节点,弧长表示数据量大小。内部不同颜色连接带,表示数据关系流向、数量级和位置信息,连接带颜色还可以表示第三维度信息。首尾宽度一致的连接带表示单向流量(从与连接带颜色相同的外围圆环流出),而首尾宽度不同的连接带表示双向流量。外层加入比例尺,还可以一目了然的发现数据流量所占比例。
和弦图的用途:
和弦图R包:Circlize
包是R语言中实现Circos功能的一个常用包,作者是Zuguang Gu
邻接表强调2类对象之间的相互作用强弱,分为邻接矩阵(adjacency matrix)和邻接列表(adjacency list)
circlize
内置的和弦图绘制函数chordDiagram()
对这2种邻接表都支持,但对于后续参数修改,使用邻接列表更方便。
邻接表:
library(circlize)
mat <- matrix(1:9, 3) # 第1列不是id列,通过行命名替代
rownames(mat) <- letters[1:3]
colnames(mat) <- LETTERS[1:3]
mat
可以使用内置函数generateRandomBed()产生随机基因类数据:
语法:generateRandomBed(nr = 10000, nc = 1, fun = function(k) rnorm(k, 0, 0.5), species = NULL)
参数解释:
read.cytoband
> set.seed(999)
> bed <- generateRandomBed() # 默认参数
> head(bed)
chr start end value1
1 chr1 39485 159163 -0.1887635
2 chr1 897195 1041959 -0.2435220
3 chr1 1161957 1177159 0.3749953
4 chr1 1201513 1481406 -0.2600839
5 chr1 1487402 1531773 -0.4633990
6 chr1 1769949 2736215 -0.8159909
>
> bed <- generateRandomBed(nr = 200, nc = 4)
> nrow(bed)
[1] 205
>
> bed <- generateRandomBed(nc = 2, fun = function(k) sample(letters, k, replace = TRUE)) # 默认产生1000行数据
> head(bed)
chr start end value1 value2
1 chr1 98740 566688 e e
2 chr1 769960 887938 b q
3 chr1 906851 933021 u o
4 chr1 1241911 1243537 k f
5 chr1 1385344 1410947 v x
6 chr1 1498302 1585389 u v
输入邻接表数据,默认参数,自动绘图
构造数据:
> # 构造一个邻接矩阵
> set.seed(999)
> mat <- matrix(sample(18, 18), 3, 6) # 3行6列的矩阵
> rownames(mat) <- paste0("S", 1:3) # 生成行名
> colnames(mat) <- paste0("E", 1:6) # 生成列名
> mat
E1 E2 E3 E4 E5 E6
S1 8 13 18 6 11 14
S2 10 12 1 3 5 7
S3 2 16 4 17 9 15
> # 构造一个邻接列表
> 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
from to value
1 S1 E1 8
2 S2 E1 10
3 S3 E1 2
4 S1 E2 13
5 S2 E2 12
6 S3 E2 16
7 S1 E3 18
8 S2 E3 1
9 S3 E3 4
10 S1 E4 6
11 S2 E4 3
12 S3 E4 17
13 S1 E5 11
14 S2 E5 5
15 S3 E5 9
16 S1 E6 14
17 S2 E6 7
18 S3 E6 15
>
绘图:
> library(circlize)
> # 使用邻接矩阵
> chordDiagram(mat)
> circos.clear() # 结束绘图,否则会继续叠加图层
> # 使用邻接列表
> chordDiagram(df)
> circos.clear()
调整了参数,绘图结束后,使用circos.clear()
重置参数,使返回到默认状态。参数分为3大类:
par
内置参数circos.par()
内置参数chordDiagram()
内置参数par()函数是R里有关绘图的重要函数之一,以下是对par()函数说明内容的一些整理。
描述:
par函数用于设定或询问绘图参数。参数设定可通过par(参数名 = 取值)或par(赋值参数列表)的形式进行。
用法:
par(..., no.readonly = FALSE)
函数变量:
... :“参数名 = 取值”或“赋值参数列表”形式的变量。
no.readonly 逻辑变量。如= TRUE且没有其他变量, 则返回当前绘图设备下已设定好的绘图参数。
参数:
参数分为三类:
一、仅仅用于询问不能被设定的参数:cin,cra,csi,cxy,dim
二、仅能通过par()设定参数:ask,fig,fin,lheight,mai,mar,mex,mfcol,mfrow,mfg,new,oma,omd,omi,pin,plt,ps,pty,usr,xlog,ylog
三、除了par(),也能在其他高级绘图函数中设定的参数
应用中,涉及这三类参数最多的是第三类,最少的是第一类
查看当前参数的赋值用par("参数名")
分类 | 参数 | 描述 |
---|---|---|
第三类参数 | adj | 调整函数text,mtext,title里文本串的位置。= 0:文本串左对齐;= 0.5(缺省):文本串 居中;= 1:文本串右对齐 |
第三类参数 | ann | = FALSE:不进行绘图解释标记(例如横轴标题等) |
第三类参数 | bg | 设置绘图区背景色。缺省为bg = "transparent" |
第三类参数 | bty | 设置绘图边框的形式。= "o"(缺省):四周边框;= "l":左下边框;= "7":右上边框;= "c":上左 下边框;= "u":左下右边框;= "]":上右下边框;= "n";无边框 |
第三类参数 | cex | 设置文字和符号相对于默认值的大小, 为一个比例数值,当使用 mfrow 或 mfcol 也会改变该值。缺省时候为cex = 1 |
第三类参数 | cex.axis | 相对于当前的cex设置,放大坐标标记(坐标轴标记的数字)。缺省为cex.axis = 1 |
第三类参数 | cex.lab | 相对于当前的cex设置,放大坐标轴标题。缺省为cex.lab = 1 |
第三类参数 | cex.main | 相对于当前的cex设置,放大图标题。缺省为cex.main = 1 |
第三类参数 | cex.sub | 相对于当前的cex设置,放大图副标题。缺省为cex.sub = 1 |
第三类参数 | col | 设置绘图颜色。缺省为col = "black" |
第三类参数 | col.axis | 设置坐标标记颜色。缺省为col.axis = "black" |
第三类参数 | col.lab | 设置坐标轴标题颜色。缺省为col.lab = "black" |
第三类参数 | col.main | 设置图标题颜色。缺省为col.main = "black" |
第三类参数 | col.sub | 设置图副标题颜色。缺省为col.sub = "black" |
第三类参数 | crt | 缺省为crt = 0 |
第三类参数 | err | 期望的错误报告程度(像该参数目前在R中未生效),缺省为err = 0 |
第三类参数 | family | 设置文本字体字体族,缺省为family = "" |
第三类参数 | fg | 设置前景色,主要用于坐标轴,边框,图形等,对坐标标记与坐标轴标题等外围无影响。缺省 为fg = "black" |
第三类参数 | font | 设置文本字体。= 1(缺省):普通字体;= 2:粗体;= 3:斜体;= 4:粗斜体;... |
第三类参数 | font.axis | 设置坐标标记字体 |
第三类参数 | font.lab | 设置坐标轴标题字体 |
第三类参数 | font.main | 设置图标题字体 |
第三类参数 | font.sub | 设置图副标题字体。 |
第三类参数 | lab | 设置坐标轴刻度数,lab = c(x,y,len)形式,目前len的设置在R中未生效。缺省为lab = c(5,5,7) |
第三类参数 | las | :设置坐标标记显示方向。= 0(缺省):平行于坐标轴;= 1:平行于x轴;= 2:垂直于坐标 轴;= 3:平行于y轴 |
第三类参数 | lend | 设置线结束端的形状(只有把线画很粗才能看出来)。= 0(缺省):圆形;= 1:“短”方 形;= 2:“长”方形 |
第三类参数 | ljoin | 设置线交接处的性质(只有把线画很粗才能看出来)。= 0(缺省):圆角;= 1:方角;= 2:切方角顶角 |
第三类参数 | lmitre | 设置ljoin里方角向切方角顶角过渡的程度。缺省为lmitre = 10 |
第三类参数 | lty | 设置线的类型。= 0:空白;= 1:(缺省)实线;= 2:短线虚线;= 3:点虚线;= 4:短线点虚线;= 5:长线虚线;= 6:长短线虚线 |
第三类参数 | lwd | 设置线宽。缺省为lwd = 1 |
第三类参数 | mgp | 设置坐标轴标题,坐标标记和坐标轴边界宽度。mgp[1]影响坐标轴标题,mgp[2,3]影响坐标标 记和坐标轴。缺省为mgp = c(3,1,0) |
第三类参数 | pch | 设置点的类型。缺省为pch = 1 |
第三类参数 | srt | 逆时针选择字符串,单位为°,只用于text函数。缺省srt = 0 |
第三类参数 | tck | 设置坐标刻度线长与方向(与图宽和高的较小者成比例)。缺省为tck = "NA" |
第三类参数 | tcl | 设置坐标刻度线长与方向(与文本行高成比例)。缺省为tcl = -0.5 |
第三类参数 | xaxs,yaxs | 设置坐标轴的范围。= "r"(缺省):先将数据范围向双边扩大4%,然后绘图;= "i":在原始 数据范围内绘图 |
第三类参数 | xaxt,yaxt | 设置坐标轴样式。= "s"(缺省):标准样式;= "n":不绘坐标轴 |
分类 | 参数 | 描述 |
---|---|---|
第二类参数 | ask | = TRUE:在新图绘制前进行提示 |
第二类参数 | fig | 设定图在绘图设备中的位置,fig = c(x1,x2,y1,y2)的数值向量(0<=x1<x2<=1; 0<=y1<y2<=1)。缺省为fig = c(0,1,0,1)。(注:设定即开始新的绘图) |
第二类参数 | fin | 设定绘图区的宽和高。缺省为fin = c(6.999999,6.999999)。(注:设定即开始新的绘图) |
第二类参数 | lheight | 设置文本行高。缺省为lheight = 1 |
第二类参数 | mai | 设置图形空白边界,mai =c(bottom, left, top, right),单位为英寸。缺省 为mai = c(1.02,0.82,0.82,0.42) |
第二类参数 | mar | 设置图形空白边界行数,mar = c(bottom, left, top, right)。缺省为mar = c(5.1,4.1,4.1,2.1) |
第二类参数 | mex | 设置图形空白边界尺度。缺省为mex = 1 |
第二类参数 | mfcol,mfrow | 设置小图数量与位置,取值为数值型向量c(nr, nc)形式,表示把图分为nr行nc列个小图,图 形顺序按列排(mfcol)或按行排(mfrow) |
第二类参数 | mfg | 设置工作小图,mfg = c(i,j),表示把第i行第j列的小图设为当前工作小图。(需在mfcol 或mfrow使用后才能使用该参数) |
第二类参数 | new | = TRUE:下一高水平绘图指令不会清楚已绘的图,而是在原有图基础上继续绘新图 |
第二类参数 | oma | 设定图形的外边界大小,oma = c(bottom,left,to,right),单位为文本行数。缺省为oma = c(0,0,0,0) |
第二类参数 | omd: | 设定图形外边界内部占图形设备的比例,omd = c(x1,x2,y1,y2)。缺省为omd = c(0,1,0,1) |
第二类参数 | omi | 设定图形的外边界大小,omi = c(bottom,left,to,right),单位为英寸。缺省为oma = c(0,0,0,0) |
第二类参数 | pin | 设定当前图的长宽,pin = c(width,height) |
第二类参数 | plt | 设定绘图区(plot region)占图形区(figure region)的比例,plt=c(x1,x2,y1,y2) |
第二类参数 | ps | 设置文本点的大小。缺省为ps = 12 |
第二类参数 | pty | 设置作图类型。= “m”(缺省):最大化作图;= “s":方形图 |
第二类参数 | usr | 设置图的坐标范围,usr = c(x1,x2,y1,y2),即横坐标在x1到x2之间,纵坐标在y1到y2之 间。若xlog或ylog参数为TRUE,则usr设置的点按10^c(x1,x2,y1,y2)使用 |
第二类参数 | xlog | = TRUE:横坐标取对数 |
第二类参数 | ylog | = TRUE:纵坐标取对数 |
circos.par
内置参数分类 | 参数 | 描述 |
---|---|---|
sectors间隙 | gap.after | 调整外围sectors之间的间隙,用数字向量进行指定 |
sectors旋转方向 | clock.wise | 为逻辑值,设置外围sectors的旋转方向 |
sectors起点位置 | start.degree | 为-360到360的数字,调整第一个sector的位置,与旋转方向有关 |
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默认为3点钟顺时针方向:
circos.par(start.degree = )
可以调整起点位置,起点位置还与旋转方向有关circos.par(clock.wise = FALSE/TRUE)
可以调整旋转方向 > 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")标签,网格和刻度 |
union(rownames(mat), colnames(mat))
一致,默认从3点钟方向顺时针旋转union(df[[1]], df[[2]])
一致order
参数调整外围sector的顺序,当然指定字符串向量的长度应与sectors的数量一致 如图所示: > library(circlize)
>
> chordDiagram(mat, order = c("S1", "E1", "E2", "S2", "E3", "E4", "S3", "E5", "E6")) # 使用order参数调整顺序,默认3点钟顺时针方向
> circos.clear()
通常外围sector分为2类,第1类代表邻接矩阵的行名或邻接列表的第一列,第2类代表邻接矩阵的列名和邻接列表的第2列。连接弦link就是将2类sectors连接起来, 默认连接弦link的颜色与第1类对象的颜色一致。改变外围sector中第1类对象的颜色,连接弦的颜色也会随之改变。
chordDiagram(grid.col= )
参数调整
指定的颜色向量最好有一个名称属性,该名称属性与secters名称一样,这样才能一一匹配,否则没有名称属性则按顺序匹配rand_color()
产生随机颜色矩阵,可以在里面设置透明度参数,再指定透明度会被忽略 当相互作用relation为连续变量时,可以通过colorRamp2()
产生连续的颜色向量,col参数也支持row.col
或column.col
指定
仅仅提供与行名或列名长度相同的颜色向量,颜色向量可以用颜色名称,hex色值,甚至数字表示调整sectors颜色和link透明度:
> library(circlize)
> # 构建颜色向量,指定名称属性,则按名称匹配
> grid_col <- c(S1 = "red", S2 = "green", S3 = "blue",
+ E1 = "grey", E2 = "grey", E3 = "grey", E4 = "grey", E5 = "grey", E6 = "grey")
># 调整外围sector颜色,增加透明度
> chordDiagram(mat, grid.col = grid_col, transparency = 0.7)
># 按名称匹配,则link颜色与mat矩阵的列名一致,全变为灰色
> chordDiagram(t(mat), grid.col = grid_col)
colorRamp2(breaks, colors, transparency = 0, space = "LAB")
离散色板连续化,space表示色彩空间.
>
> # 数据是邻接矩阵
> 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属性设置的三个参数:
当数据是邻接矩阵时,这3个参数均可以用长度为1的向量指定,或矩阵。
> 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()
在需要强调某些relation时,需要高亮对应的弦,一般有4种高亮方式:
link.visible
参数指定要显示的弦,其它都不显示,可以用逻辑矩阵(对于邻接矩阵)或逻辑向量(对于邻接列表)进行指定 > library(circlize)
>
> # 通过指定不同的颜色进行高亮
> chordDiagram(mat, grid.col = grid_col, row.col = c("#FF000080", "#00FF0010", "#0000FF10"))
> circos.clear()
>
> # 通过指定透明色给某些在范围之外的relation
> col_mat[mat < 12] <- "#00000000" # relation < 12则变为透明色
> chordDiagram(mat, grid.col = grid_col, col = col_mat) #
> circos.clear()
>
> # 通过函数同时指定透明色和高亮色,对邻接列表数据源也适用
> col_fun <- function(x) {ifelse(x < 12, "#00000000", "#FF000080") }# relation小于12则为透明色,反之为#FF000080石榴红
> chordDiagram(mat, grid.col = grid_col, col = col_fun, transparency = 0.7)
> circos.clear()
>
> # 事实上,所有颜色矩阵或颜色生成函数中色彩都是绘制在图形中的,只是程序内部将其透明度设置为了1,
> # 通过3列特殊数据框指定的颜色,其缺失的颜色的relation将不会画出
> col_df <- data.frame(c("S1","S2", "S3"), c("E5", "E6", "E4"),
+ c("#FF000080", "#00FF0080", "#0000FF80"))
> chordDiagram(mat, grid.col = grid_col, col = col_df)
> circos.clear()
>
> # 对于邻接列表数据源,高亮弦调整更简单,只需要设置要高亮的颜色,其它为透明色就行了
> cols <- rand_color(nrow(df))
> cols[df[[3]] < 10] <- "#00000000" # 将df中第3列,即relation列,列值小于10的都更新为透明色HEX色值
> chordDiagram(df, grid.col = grid_col, col = cols)
>
> # 通过link.visible参数调整
> cols <- rand_color(nrow(df))
> chordDiagram(df, grid.col = grid_col, link.visible = df[[3]] >= 10) # 只显示df第3列大于10的弦
> circos.clear()
有时候为了方便查询,需要将弦link按宽窄顺序排列,可以用参数link.sort
和link.decreasing
设定:
link.sort = TRUE
表示设置顺序,默认为了好看自动调整弦的顺序,指定该参数后,link.decreasing
参数才有效link.decreasing = TRUE/FALSE
表示降序或升序,默认顺时针,降序表示宽度沿顺时针方向逐渐下降 > library(circlize)
>
> chordDiagram(mat, grid.col = grid_col, link.sort = TRUE, link.decreasing = TRUE) #按弦宽度下降排列,则弦宽沿顺时针方向逐渐下降
> title("link.sort = TRUE, link.decreasing = TRUE",cex = 0.8) # 添加标题
> circos.clear()
>
> chordDiagram(mat, grid.col = grid_col, link.sort = TRUE, link.decreasing = FALSE) # 弦宽沿顺时针方向逐渐增大
> title("link.sort = TRUE, link.decreasing = FALSE", cex = 0.8)
> circos.clear()
添加弦link的顺序对于视觉效果影响很大,默认安装数据源的顺序进行添加,可以用参数link.rank
参数调整弦的添加顺序
link.rank
参数,则relation越小,秩越大, 则link.rank
参数先添加最大秩对应的弦,即最小的relation,于是relation越大,越出现在表层link.rank
参数 > library(circlize)
>
> # 邻接矩阵数据源,求矩阵的秩,然后指定给link.rank参数
> chordDiagram(mat, grid.col = grid_col, transparency = 0, link.rank = )# 设置透明度为0,方便观察
> chordDiagram(mat, grid.col = grid_col, transparency = 0, link.rank = rank(mat)) # 用mat中的秩进行排序,秩最大先添加
> circos.clear()
>
> # 邻接列表数据源,对relation列求秩,然后指定给link.rank参数
> chordDiagram(df, grid.col = grid_col, transparency = 0, link.rank = rank(df[[3]])) # 第3列为relation列,求秩
> circos.clear()
当信息需要复制的时候,可以使用自我连接,使用参数self.link
指定,用1或2指定,分别代表2种情形 这个用在基因或细胞复制的可视化中,其它用的比较少。
> library(circlize)
>
> df2 <- data.frame(start = c("a", "b", "c", "a"), end = c("a", "a", "b", "c"))
> chordDiagram(df2, grid.col = 1:3, self.link = 1) #
> chordDiagram(df2, grid.col = 1:3, self.link = 2)
> circos.clear()
当数据源是对称矩阵时,通过参数symmetric = TRUE
,只有矩阵下三角部分relation会被可视化(不包括对角线)。
> library(circlize)
>
> mat3 <- matrix(rnorm(25), 5) # 生成25个均匀分布的随机数, 5行排列
> colnames(mat3) <- letters[1:5]
> cor_mat <- cor(mat3) # 求相关系数,则变为对称矩阵
>
> col_fun <- colorRamp2(c(-1, 0, 1), c("green", "white", "red"))
> chordDiagram(cor_mat, grid.col = 1:5, symmetric = TRUE, col = col_fun)
> title("symmetric = TRUE") # 增加标题
> circos.clear()
>
> chordDiagram(cor_mat, grid.col = 1:5, col = col_fun)
> title("symmetric = FALSE")
> circos.clear()
很多时候,数据源是有方向性的,如城市的航班来往,贸易来往,
directional
指定弦的方向,directional = 1
或directional = -1
:diffHeight
参数设置, 也可以设置负数 > library(circlize)
>
> par(mfrow = c(1, 3)) # 设置绘图环境,多图布局,1行3列布局
>
> chordDiagram(mat, grid.col = grid_col, directional = 1) # 结束端要短一些
> chordDiagram(mat, grid.col = grid_col, directional = 1, diffHeight = uh(5, "mm")) # 设定缩短量为5mm, uh表示传递单位
> chordDiagram(mat, grid.col = grid_col, directional = -1) # 反转方向,这行名对应的端要短一些
> circos.clear()
数据源的行名和列名存在相同值
> library(circlize)
>
> mat2 <- matrix(sample(100, 35), nrow = 5)
> rownames(mat2) <- letters[1:5]
> colnames(mat2) <- letters[1:7]
> mat2
a b c d e f g
a 37 89 5 19 68 86 32
b 23 71 18 75 62 34 16
c 94 67 81 66 28 41 39
d 72 9 4 12 17 6 44
e 85 63 2 55 40 60 79
> chordDiagram(mat2, grid.col = 1:7, directional = 1, row.col = 1:5)
> circos.clear()
如果不需要显示自我连接的弦 则更改数据源中对应的值,使该值为0
> library(circlize)
>
> mat3 <- mat2
> for (cn in intersect(rownames(mat3), colnames(mat3))) {
+ mat3[cn, cn] <- 0 # 将行名和列名相同的值更改为0
+
+ }
> mat3
a b c d e f g
a 0 89 5 19 68 86 32
b 23 0 18 75 62 34 16
c 94 67 0 66 28 41 39
d 72 9 4 0 17 6 44
e 85 63 2 55 0 60 79
>
> chordDiagram(mat3, grid.col = 1:7, directional = 1, row.col = 1:5) # 设置弦方向为从行名到列名,设置弦颜色
> circos.clear()
弦link有方向属性,就可以增加箭头,有2个参数可以增加箭头
direction.type = "arrows"
给弦增加带箭头的曲线,曲线位于弦的中心线上,默认给所有弦增加箭头link.arr.col
给部分弦增加带箭头的曲线,并指定箭头的颜色,指定方式跟颜色的指定类似, 必须设置direction.type = "arrows"
参数link.arr.length
指定带箭头曲线中,箭头的长度link.arr.type
指定箭头类型,可以用link.arr.type = "big.arrow"
产生大尺寸箭头,将箭头和箭杆合二为一 > library(circlize)
>
> arr_col <- data.frame(c("S1", "S2", "S3"), c("E5", "E6", "E4"),
+ c("black", "black", "black")) # 生成箭头的颜色3列特征数据框
> chordDiagram(mat, grid.col = grid_col, directional = 1,
+ link.arr.col = arr_col, direction.type = "arrows", link.arr.length = 0.2)
> circos.clear()
>
> # 同时设置箭头和弦高diffHeight
> chordDiagram(mat, grid.col = grid_col, directional = 1,
+ direction.type = c("diffHeight", "arrows"), # 同时设置箭头和弦高
+ link.arr.col = arr_col, link.arr.length = 0.2)
> circos.clear()
>
> par(mfrow = c(1, 2))
> # 指定箭头类型为大箭头
> matx <- matrix(rnorm(64), 8)
>
> chordDiagram(matx, directional = 1, direction.type = c("diffHeight", "arrows"),
+ link.arr.type = "big.arrow") # 大箭头,箭头和箭杆合二为一
> circos.clear()
>
> # 大箭头加调整弦高diffHeight
> chordDiagram(matx, directional = 1, direction.type = c("diffHeight", "arrows"),
+ link.arr.type = "big.arrow", diffHeight = -uh(2, "mm")) # 设置弦高为-2mm
> circos.clear()
对于relation值相对太小,其对应的弦的宽度也非常小,对于这种极小值,在程序绘图时,会自动去除,不给予显示。可以通过reduce
参数控制link宽度的下限,超出该范围的将不显示,
reduce
参数为0到1的数字(包含0), 表示占所有弦宽度之和的百分比
> library(circlize)
>
> # 默认移除小比例值
> mat <- matrix(rnorm(36), 6, 6)
> rownames(mat) <- paste0("R", 1:6)
> colnames(mat) <- paste0("C", 1:6)
> mat[2, ] <- 1e-10 # 将第2行所有值改成很小的值
> mat[, 3] <- 1e-10 # 将第3列所有值改成很小的值
>
> chordDiagram(mat)
> circos.info() # 显示绘图的对象,不包含第2行的行名(R2)和第3列的列名(C3),则表示被移除了
All your sectors:
[1] "R1" "R3" "R4" "R5" "R6" "C1" "C2" "C4" "C5" "C6"
All your tracks:
[1] 1 2
Your current sector.index is C6
Your current track.index is 2
> circos.clear()
>
> # reduce参数调整
> mat[2, ] <- 1e-2
> chordDiagram(mat, reduce = 1e-3) # 控制reduce参数比C2小,则C2行不会被移除
> circos.info()
All your sectors:
[1] "R1" "R2" "R3" "R4" "R5" "R6" "C1" "C2" "C4" "C5" "C6"
All your tracks:
[1] 1 2
Your current sector.index is C6
Your current track.index is 2
> circos.clear()
chordDiagram()
默认创建2个外围轨道,一个标签(列名和行名)轨道,一个带有刻度线的网格轨道 circos.info()
显示的"All your tracks"下面就是所有的轨道,
annotationTrack
参数可以调整轨道,从c("name", "grid", "axis")
中指定任意值,可以多个值,表示只显示指定的轨道,annotationTrackHeight
参数可以指定轨道环高,用数字向量指定,向量长度与annotationTrack
参数一致。 > library(circlize)
>
> par(mfrow = c(1, 3)) # 多图布局,分3列排版
> chordDiagram(mat, grid.col = grid_col, annotationTrack = "grid") # 只显示网格,不显示刻度线和标签轨道
> chordDiagram(mat, grid.col = grid_col, annotationTrack = c("name", "grid"), # 指定显示标签和网格轨道
+ annotationTrackHeight = c(0.03, 0.01)) # 指定标签轨道和网格轨道的环高
>
> chordDiagram(mat, grid.col = grid_col, annotationTrack = NULL) # 移除所有轨道
> circos.clear()
下面,我想构建出Pathway和Disease之间的关系图,它们之间的关系强弱已经通过共同的基因个数来定量。常规思路,大家是通过Cytoscape构建出一个Network图来表示两者之间的关系。这里,我想试试和弦图。具体过程如下:
csv
文件
2.R绘图
我的代码是:
## Data
# read the data
mat <- read.csv("D:/Pathway-Disease.csv",
header = T,
row.names = 1,
stringsAsFactors = F)
# converted to matrix
mat <- as.matrix(mat)
# drop small flows, here: quantile(mat,0.65)=3, any element <=3 is drop
mat[mat<=quantile(mat,0.65)] <-0
## Chord Siagram
# load circlize
library("circlize")
# setting reset
circos.clear()
# Open a window interface
#win.graph(width=20, height=20,pointsize=12)
# plot chord siagram
chordDiagram(mat,
annotationTrack = "grid",
preAllocateTracks = 1)
#chordDiagram(mat,
# directional = 1,
# annotationTrack = "grid",
# annotationTrackHeight = c(0.1, 0.1),
# diffHeight = -0.04,
# preAllocateTracks = 1)
# add labels
circos.track(track.index = 1, panel.fun = function(x, y) {
circos.text(CELL_META$xcenter, CELL_META$ylim[1], CELL_META$sector.index,
facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex = 1)
}, bg.border = NA)
# save the image as a pdf file
3.保存图片
4.PS处理,另存为其他格式的图片:tif
,jip
等
本文分享自 MedBioInfoCloud 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!