前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言Circlize包绘制和弦图

R语言Circlize包绘制和弦图

作者头像
DoubleHelix
发布2019-08-07 08:21:01
12.4K0
发布2019-08-07 08:21:01
举报
文章被收录于专栏:生物信息云

1.和弦图

1.1.和弦图简洁

和弦图可用于表示数据间的关系和流量。外围不同颜色圆环表示数据节点,弧长表示数据量大小。内部不同颜色连接带,表示数据关系流向、数量级和位置信息,连接带颜色还可以表示第三维度信息。首尾宽度一致的连接带表示单向流量(从与连接带颜色相同的外围圆环流出),而首尾宽度不同的连接带表示双向流量。外层加入比例尺,还可以一目了然的发现数据流量所占比例。

和弦图的用途:

  • 和弦图即可以反映2类变量之间的相互作用关系,也可以反映相互作用强度,这是其它图比不了的
  • 和弦图的弦link的宽度代表所连接的两个对象的相互作用强弱,link越宽,则相互作用越强
  • 和弦图常用于绘制国家之间的贸易往来量,城市之间的航班往来量,还有细胞和基因数据可视化(这个领域不了解)
和弦图在线工具:http://circos.ca/intro/tabular_visualization/

和弦图R包:Circlize包是R语言中实现Circos功能的一个常用包,作者是Zuguang Gu

1.2. 初步绘图

1.2.1. 数据格式——邻接表(和弦图数据源)

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

  • 邻接矩阵:通常表示为一个矩阵,矩阵中元素对应弦link的宽度,表示所在行名称和列名称的相互作用强弱
  • 邻接列表:通常表示为一个列表,通常前2列分别为2类对象,第3列的值对应弦link的宽度,表示前2列对应行的元素相互作用强弱

circlize内置的和弦图绘制函数chordDiagram()对这2种邻接表都支持,但对于后续参数修改,使用邻接列表更方便。

邻接表:

代码语言:javascript
复制
 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)

参数解释:

  • nr:表示指定产生数据行数
  • nc:表示指定产生数据列数, 数据值的列
  • fun:表示指定参数随机数的方法
  • species:表示种类,传递给read.cytoband
代码语言:javascript
复制
 > 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

1.2.2. 绘图

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

构造数据:

代码语言:javascript
复制
 > # 构造一个邻接矩阵
 > 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
 > 

绘图:

代码语言:javascript
复制
 > library(circlize)
 > # 使用邻接矩阵
 > chordDiagram(mat)
 > circos.clear() # 结束绘图,否则会继续叠加图层
 > # 使用邻接列表
 > chordDiagram(df)
 > circos.clear()

2. 参数调整

调整了参数,绘图结束后,使用circos.clear()重置参数,使返回到默认状态。参数分为3大类:

  • 第1类为par内置参数
  • 第2类为circos.par()内置参数
  • 第3类为chordDiagram()内置参数

2.1. par参数:

2.1.1. par介绍

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("参数名")

2.1.2. 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":不绘坐标轴

2.1.3. par - 第二类参数

分类

参数

描述

第二类参数

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:纵坐标取对数

2.2. circos.par内置参数

分类

参数

描述

sectors间隙

gap.after

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

sectors旋转方向

clock.wise

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

sectors起点位置

start.degree

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

2.2.1. gap 间隙调整

sectors之间的间隙可以用gap.after =调整,指定间隙的数字向量长度应该与sectors数量一致。

代码语言:javascript
复制
 > 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()

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

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

  • circos.par(start.degree = )可以调整起点位置,起点位置还与旋转方向有关
  • circos.par(clock.wise = FALSE/TRUE) 可以调整旋转方向
代码语言:javascript
复制
 > library(circlize)
 > 
 > circos.par(start.degree = 90, clock.wise = FALSE) # 逆时针旋转,起点位置在逆时针90度方向,即12点针方向 
 > chordDiagram(mat)
 > circos.clear()

2.3. 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")标签,网格和刻度

2.3.1. 外围sectors的顺序

  • 对于邻接矩阵,外围sector的顺序与union(rownames(mat), colnames(mat))一致,默认从3点钟方向顺时针旋转
  • 对于邻接列表,外围sector的顺序与union(df[[1]], df[[2]])一致
  • order参数调整外围sector的顺序,当然指定字符串向量的长度应与sectors的数量一致 如图所示:
代码语言:javascript
复制
 > library(circlize)
 > 
 > chordDiagram(mat, order = c("S1", "E1", "E2", "S2", "E3", "E4", "S3", "E5", "E6"))  # 使用order参数调整顺序,默认3点钟顺时针方向 
 > circos.clear()

2.3.2. 颜色调整

通常外围sector分为2类,第1类代表邻接矩阵的行名或邻接列表的第一列,第2类代表邻接矩阵的列名和邻接列表的第2列。连接弦link就是将2类sectors连接起来, 默认连接弦link的颜色与第1类对象的颜色一致。改变外围sector中第1类对象的颜色,连接弦的颜色也会随之改变。

  1. 外围sector的颜色可以用chordDiagram(grid.col= )参数调整 指定的颜色向量最好有一个名称属性,该名称属性与secters名称一样,这样才能一一匹配,否则没有名称属性则按顺序匹配
  2. 连接弦link的透明度可以用transparency参数调整,从0(完全不透明)到1(完全透明),默认透明度为0.5
  3. 连接弦link的参数可以用col参数调整,需要指定颜色矩阵(数据为邻接矩阵) 或颜色向量(数据为邻接列表) 可以用函数rand_color()产生随机颜色矩阵,可以在里面设置透明度参数,再指定透明度会被忽略 当相互作用relation为连续变量时,可以通过colorRamp2()产生连续的颜色向量,col参数也支持
  4. 当数据是连接矩阵时,可以不提供颜色矩阵,link颜色指定还可以用颜色向量指定,使用参数row.colcolumn.col指定 仅仅提供与行名或列名长度相同的颜色向量,颜色向量可以用颜色名称,hex色值,甚至数字表示

调整sectors颜色和link透明度

代码语言:javascript
复制
 > 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) 

2.3.3. 调整link颜色及透明度

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

代码语言:javascript
复制
 > 
 > # 数据是邻接矩阵
 > 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()

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

link属性设置的三个参数:

  1. link,lwd:参数调整link边缘线宽度
  2. link.lty: 参数调整link边缘线线型
  3. link.border:参数调整link边缘线的颜色

当数据是邻接矩阵时,这3个参数均可以用长度为1的向量指定,或矩阵。

代码语言:javascript
复制
 > 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()

2.3.5. link弦可见

在需要强调某些relation时,需要高亮对应的弦,一般有4种高亮方式:

  • 设置弦边缘颜色(前面已经介绍了),
  • 设置不同的透明度,
  • 或只显示某些弦,其它全是透明的灰色
  • 通过link.visible参数指定要显示的弦,其它都不显示,可以用逻辑矩阵(对于邻接矩阵)或逻辑向量(对于邻接列表)进行指定
代码语言:javascript
复制
 > 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()

2.3.6. 弦在同一个sector上的顺序调整

有时候为了方便查询,需要将弦link按宽窄顺序排列,可以用参数link.sortlink.decreasing设定:

  • link.sort = TRUE 表示设置顺序,默认为了好看自动调整弦的顺序,指定该参数后,link.decreasing 参数才有效
  • link.decreasing = TRUE/FALSE 表示降序或升序,默认顺时针,降序表示宽度沿顺时针方向逐渐下降
代码语言:javascript
复制
 > 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()

2.3.7. 弦在多个sectors上的顺序调整

添加弦link的顺序对于视觉效果影响很大,默认安装数据源的顺序进行添加,可以用参数link.rank参数调整弦的添加顺序

  • 通常给邻接列表增加一列,为relation的秩,然后用秩指定link.rank参数,则relation越小,秩越大, 则link.rank参数先添加最大秩对应的弦,即最小的relation,于是relation越大,越出现在表层
  • 反之,如果要将宽的relation调整到下面,则直接用relation列指定link.rank参数
代码语言:javascript
复制
 > 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()

2.3.8. 自我连接

当信息需要复制的时候,可以使用自我连接,使用参数self.link指定,用1或2指定,分别代表2种情形 这个用在基因或细胞复制的可视化中,其它用的比较少。

代码语言:javascript
复制
 > 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()

2.3.9. 对称矩阵

当数据源是对称矩阵时,通过参数symmetric = TRUE,只有矩阵下三角部分relation会被可视化(不包括对角线)。

代码语言:javascript
复制
 > 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()

2.3.10. 弦link的方向

很多时候,数据源是有方向性的,如城市的航班来往,贸易来往,

  • 对于邻接矩阵,本身就可以是有方向性的,如以行名为方向的起点,或以列名为方向的起点
  • 对于邻接列表,通常用前2列的列的顺序表示方向,从第1列到第2列,或从第2列到1列 用directional指定弦的方向,directional = 1directional = -1
  • 对于邻接矩阵,1 表示从行名到列名,-1则反之
  • 对于邻接列表,1 表示从从第1列到第2列,-1则反之
  • 不设置方向属性时,弦的高度都相等,即与sectors之间的gap都相等,当设置方向后,则其中一端会缩短一些,如果短的地方不对,则反转方向
  • 如果缩短的量不够,则可以通过diffHeight参数设置, 也可以设置负数
  • 有时候,数据源的行名或列名可能存在相同值,这时候设置方向就很容易区分,
代码语言:javascript
复制
 > 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()

数据源的行名和列名存在相同值

代码语言:javascript
复制
 > 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

代码语言:javascript
复制
 > 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()

2.3.11. link方向、箭头及高度调整

弦link有方向属性,就可以增加箭头,有2个参数可以增加箭头

  • direction.type = "arrows" 给弦增加带箭头的曲线,曲线位于弦的中心线上,默认给所有弦增加箭头
  • link.arr.col 给部分弦增加带箭头的曲线,并指定箭头的颜色,指定方式跟颜色的指定类似, 必须设置direction.type = "arrows"参数
  • link.arr.length 指定带箭头曲线中,箭头的长度
  • link.arr.type 指定箭头类型,可以用link.arr.type = "big.arrow" 产生大尺寸箭头,将箭头和箭杆合二为一
代码语言:javascript
复制
 > 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()

2.3.12. 窄弦丢失

对于relation值相对太小,其对应的弦的宽度也非常小,对于这种极小值,在程序绘图时,会自动去除,不给予显示。可以通过reduce参数控制link宽度的下限,超出该范围的将不显示,

reduce参数为0到1的数字(包含0), 表示占所有弦宽度之和的百分比

代码语言:javascript
复制
 > 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()

2.3.13. 轨道调整

chordDiagram()默认创建2个外围轨道,一个标签(列名和行名)轨道,一个带有刻度线的网格轨道 circos.info()显示的"All your tracks"下面就是所有的轨道,

  • annotationTrack参数可以调整轨道,从c("name", "grid", "axis")中指定任意值,可以多个值,表示只显示指定的轨道,
  • annotationTrackHeight参数可以指定轨道环高,用数字向量指定,向量长度与annotationTrack参数一致。
代码语言:javascript
复制
 > 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()

3. 实践

下面,我想构建出Pathway和Disease之间的关系图,它们之间的关系强弱已经通过共同的基因个数来定量。常规思路,大家是通过Cytoscape构建出一个Network图来表示两者之间的关系。这里,我想试试和弦图。具体过程如下:

  1. 构建邻接矩阵 常用方法:Excel构建矩阵,另存为csv文件

2.R绘图

我的代码是:

代码语言:javascript
复制
 ## 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处理,另存为其他格式的图片:tifjip

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MedBioInfoCloud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.和弦图
    • 1.1.和弦图简洁
      • 1.2. 初步绘图
        • 1.2.1. 数据格式——邻接表(和弦图数据源)
          • 1.2.2. 绘图
      • 2. 参数调整
        • 2.1. par参数:
          • 2.1.1. par介绍
          • 2.1.2. par - 第三类参数
          • 2.1.3. par - 第二类参数
        • 2.2. circos.par内置参数
          • 2.2.1. gap 间隙调整
          • 2.2.2. sector起点位置及旋转方向调整
        • 2.3. chordDiagram内置参数
          • 2.3.1. 外围sectors的顺序
          • 2.3.2. 颜色调整
          • 2.3.3. 调整link颜色及透明度
          • 2.3.4. link边线宽,边线型,边线颜色
          • 2.3.5. link弦可见
          • 2.3.6. 弦在同一个sector上的顺序调整
          • 2.3.7. 弦在多个sectors上的顺序调整
          • 2.3.8. 自我连接
          • 2.3.9. 对称矩阵
          • 2.3.10. 弦link的方向
          • 2.3.11. link方向、箭头及高度调整
          • 2.3.12. 窄弦丢失
          • 2.3.13. 轨道调整
      • 3. 实践
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档