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

往期精彩:

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

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

par参数:

  • lty: line type. 可以是数字或者字符,
    (0 = “blank”, 1 = “solid” (default), 2 = “dashed”, 3 = “dotted”, 4 = “dotdash”, 5 = “longdash”, 6 = “twodash”)

  • lwd: line width. 默认是 1, 设置线宽的放大倍数.

  • cex: 设置文字和符号相对于默认值的大小, 为一个比例数值. 当使用 mfrow 或 mfcol 也会改变该值.

  • mai: 以 inch 为单位的图像边距, c(bottom, left, top, right).

  • mar: 以行数来表示图像边距, c(bottom, left, top, right), 默认是 c(5, 4, 4, 2) + 0.1.

  • mfcol, mfrow: 调整图形输出设备中子图排列的向量, c(nrow, ncol),
    mfcol 让子图按照列优先排列, 相应的, mfrow 让子图按照行优先排列.当设置 mfcol mfrow 后, cex 和 mex 的基本单位都相应减小.

和弦图

和弦图简介

和弦图长什么样子:
和弦图在线

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

邻接表(和弦图数据源)

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

  • 邻接矩阵为表示矩阵格式,邻接矩阵的元素映射到弦link的宽度,表示所在行名称和列名称的相互作用强弱

  • 邻接列表通常前2列分别为2类对象,第3列映射到弦link的宽度,表示前2列对应行的元素相互作用强弱
    circlize内置的和弦图绘制函数chordDiagram()对这2种邻接表都支持,但对于后续参数修改,使用邻接列表更方便
    邻接表:

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)
参数解释:

  • nr 表示指定产生数据行数

  • nc 表示指定产生数据列数, 数据值的列

  • fun 表示指定参数随机数的方法

  • species 表示种类,传递给read.cytoband

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大类:

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

  • 第2类为chordDiagram()内置参数

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点钟顺时针方向,

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

外围sectors的顺序

  • 对于邻接矩阵,外围sector的顺序与union(rownames(mat), colnames(mat))一致,默认从3点钟方向顺时针旋转

  • 对于邻接列表,外围sector的顺序与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类对象的颜色,连接弦的颜色也会随之改变

  • 外围sector的颜色可以用chordDiagram(grid.col= )参数调整,
    指定的颜色向量最好有一个名称属性,该名称属性与secters名称一样,这样才能一一匹配,否则没有名称属性则按顺序匹配

  • 连接弦link的透明度可以用transparency参数调整,从0(完全不透明)到1(完全透明),默认透明度为0.5

  • 连接弦link的参数可以用col参数调整,需要指定颜色矩阵(数据为邻接矩阵) 或颜色向量(数据为邻接列表)
    可以用函数rand_color()产生随机颜色矩阵,可以在里面设置透明度参数,再指定透明度会被忽略
    当相互作用relation为连续变量时,可以通过colorRamp2()产生连续的颜色向量,col参数也支持

  • 当数据是连接矩阵时,可以不提供颜色矩阵,link颜色指定还可以用颜色向量指定,使用参数row.colcolumn.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") # 构建颜色向量,指定名称属性,则按名称匹配
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边线宽,边线型,边线颜色

  • link,lwd 参数调整link边缘线宽度

  • link.lty 参数调整link边缘线线型

  • link.border 参数调整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()





公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

R_circlize包_和弦图(一)相关推荐

  1. R_circlize包_和弦图(二)

    作者:李誉辉 四川大学在读研究生 往期精彩: R_插值_拟合_回归_样条 接上一篇:R_circlize包_和弦图(一) link弦可见 在需要强调某些relation时,需要高亮对应的弦,一般有4种 ...

  2. R_circlize包_和弦图

    tiltle: circlize包画和弦图 作者:Li_Yuhui 四川大学在读研究生 参考来源 文章目录 tiltle: circlize包画和弦图 作者:Li_Yuhui 四川大学在读研究生 [参 ...

  3. 使用circlize包绘制和弦图

    在写这个教程是3月16号凌晨的5点钟,这个点还没睡的话,一是在外面玩,二是有事情.我是属于第二种情况,昨晚从下班6点后一直在办公室,点了个外卖,吃结束后差不多7点.然后,就一直在弄自己的事情,一直到凌 ...

  4. acrobat xi pro 简体中文语言支持包_出图利器佳能PRO-541S绘图仪现货报价-佳能 PRO-541S_西安大幅面打印机行情...

    (中关村在线西安行情) 近日,佳能PRO-541S图文广告利器在中关村在线认证经销商"西安优杰电子(佳能授权)"处有售,联系电话:13363997297(赵经理).佳能PRO-54 ...

  5. python 交互式流程图_使用Python创建漂亮的交互式和弦图

    python 交互式流程图 Python中的数据可视化 (Data Visualization in Python) R vs Python is a constant tussle when it ...

  6. 用计算机打出惊雷这首,惊雷表情包图片-惊雷表情包图片动图大全高清免费分享 v1.0预约_手机乐园...

    软件简介 惊雷表情包图片动图大全高清免费分享这里汇聚了当下十分火爆的喊麦表情包图片,不仅图片十分搞笑,配上的文字更是点睛之笔,不仅幽默风趣,还非常符合沙雕的气质,下面就为整理了十分全面的惊雷喊麦图片, ...

  7. python绘制简单城市剪影图_利用Python的folium包绘制城市道路图的实现示例

    写在前面 很长一段时间内,我都在研究在线地图的开发者文档,百度地图和高德地图的开发者中心提供了丰富的在线地图服务,虽然有一定的权限限制,但不得不说,还是给我的科研工作提供了特别方便的工具,在博客前面我 ...

  8. 水文分析提取河网_基于图的河网段地理信息分析排序算法

    水文分析提取河网 The topic of this article is the application of information technologies in environmental s ...

  9. 打蚊子表情包_打蚊子表情包 - 打蚊子微信表情包 - 打蚊子QQ表情包 - 发表情 fabiaoqing.com...

    拍打蚊子GIF - 蚊子表情包_蚊子表情 夏天来了,打蚊子_蚊子_夏天表情 为什么蚊子只爱我 - 蚊子表情包_蚊子表情 采访蚊子 请问你为什么要咬我 - 蚊子表情包_蚊子表情 蚊子飞在屎上 - 打屎打 ...

  10. 打蚊子表情包_蚊子表情包 - 蚊子微信表情包 - 蚊子QQ表情包 - 发表情 fabiaoqing.com...

    为什么蚊子只爱我 - 蚊子表情包_蚊子表情 拍打蚊子GIF - 蚊子表情包_蚊子表情 采访蚊子 请问你为什么要咬我 - 蚊子表情包_蚊子表情 蚊子飞在屎上 - 打屎打屎_屎_蚊子表情 我想,最爱我的是 ...

最新文章

  1. Jetson TX2 开机测试及刷机
  2. 015_面向对象_异常,包和Object类
  3. 开发人员必读的11本最具影响力书籍
  4. 使用正确的垃圾收集器将Java内存使用量降至最低
  5. Python——pip安装报错:is not a supported wheel on this platform
  6. react router v4 简介
  7. vue仿网易云音乐播放器
  8. cocos2d-x学习资源整理(持续更新)
  9. 佛系前端面试题记录--第四周
  10. 服务器搭建centos7系统操作过程(使用系统盘搭建centos7系统)
  11. 北邮科技园首个元宇宙产业创新平台落地朝阳区IDP国际大数据交易产业园
  12. 中心极限定理和Berry-Esseen中心极限定理
  13. 字符间距加宽5磅怎么设置_如何设置将word文档的字符间距加宽
  14. mysql 1273错误
  15. java类的继承,接口,抽象类总结
  16. iMeta: 整合宏组学重新认识生命和环境科学
  17. java实现数组的奇偶数互换
  18. Chrome HackBar工具下载
  19. c语言中float是什么类型的数据,float是什么数据类型?
  20. SetContentView源码解析

热门文章

  1. 曲线救国:提高github下载速度到2MB/s
  2. IDEA高级玩法:集成JIRA、UML类图插件、SSH、FTP、Database管理...
  3. 腾讯亿级排行榜系统实践及挑战
  4. Google 开发者大会纪念 T 恤赠送(全球限量)
  5. 从0开始学习 GitHub 系列之「05.Git 进阶」
  6. python人脸比对算法_Python的人脸识别,欧式距离比对,机器训练,人脸采集,离线识别...
  7. 【luogu P2831 愤怒的小鸟】 题解
  8. 20160504课堂作业
  9. 如何搭建j2ee开发环境
  10. 20个非常棒的Jquery实用工具