R_circlize包_和弦图(二)

2018 年 11 月 16 日 R语言中文社区


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


往期精彩: 

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



接上一篇:R_circlize包_和弦图(一)


link弦可见

在需要强调某些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()






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

有时候为了方便查询,需要将弦link按宽窄顺序排列,可以用参数link.sortlink.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()

弦在多个sectors上的顺序调整

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

  • 通常给邻接列表增加一列,为relation的秩,然后用秩指定link.rank参数,则relation越小,秩越大,
    link.rank参数先添加最大秩对应的弦,即最小的relation,于是relation越大,越出现在表层

  • 反之,如果要将宽的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()


弦link的方向

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

  • 对于邻接矩阵,本身就可以是有方向性的,如以行名为方向的起点,或以列名为方向的起点

  • 对于邻接列表,通常用前2列的列的顺序表示方向,从第1列到第2列,或从第2列到1列
    directional指定弦的方向,directional = 1directional = -1

  • 对于邻接矩阵,1 表示从行名到列名,-1则反之

  • 对于邻接列表,1 表示从从第1列到第2列,-1则反之
    不设置方向属性时,弦的高度都相等,即与sectors之间的gap都相等,当设置方向后,则其中一端会缩短一些,如果短的地方不对,则反转方向
    如果缩短的量不够,则可以通过
    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
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 

chordDiagram(mat3, grid.col = 1:7, directional = 1, row.col = 1:5) # 设置弦方向为从行名到列名,设置弦颜色
circos.clear()

link方向、箭头及高度调整

弦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),则表示被移除了
circos.clear()

# reduce参数调整
mat[2, ] <- 1e-2
chordDiagram(mat, reduce = 1e-3) # 控制reduce参数比C2小,则C2行不会被移除
circos.info()
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()


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

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

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

登录查看更多
0

相关内容

[ICML2020]层次间消息传递的分子图学习
专知会员服务
33+阅读 · 2020年6月27日
因果图,Causal Graphs,52页ppt
专知会员服务
246+阅读 · 2020年4月19日
注意力图神经网络的多标签文本分类
专知会员服务
111+阅读 · 2020年3月28日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
必读的10篇 CVPR 2019【生成对抗网络】相关论文和代码
专知会员服务
32+阅读 · 2020年1月10日
已删除
AI掘金志
7+阅读 · 2019年7月8日
Python 热图进阶
专知
15+阅读 · 2019年5月4日
【泡泡读者来稿】VINS 论文推导及代码解析(一)
泡泡机器人SLAM
114+阅读 · 2019年3月3日
数据分析师应该知道的16种回归技术:弹性网络回归
数萃大数据
91+阅读 · 2018年8月16日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
面试整理:关于代价函数,正则化
数据挖掘入门与实战
8+阅读 · 2018年3月29日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
机器学习(19)之支持向量回归机
机器学习算法与Python学习
12+阅读 · 2017年10月3日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
Advances in Online Audio-Visual Meeting Transcription
Arxiv
4+阅读 · 2019年12月10日
Arxiv
4+阅读 · 2019年12月2日
Multi-Grained Named Entity Recognition
Arxiv
6+阅读 · 2019年6月20日
Arxiv
7+阅读 · 2019年5月31日
SepNE: Bringing Separability to Network Embedding
Arxiv
3+阅读 · 2019年2月26日
Arxiv
6+阅读 · 2018年10月3日
Arxiv
3+阅读 · 2018年4月9日
VIP会员
相关VIP内容
[ICML2020]层次间消息传递的分子图学习
专知会员服务
33+阅读 · 2020年6月27日
因果图,Causal Graphs,52页ppt
专知会员服务
246+阅读 · 2020年4月19日
注意力图神经网络的多标签文本分类
专知会员服务
111+阅读 · 2020年3月28日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
必读的10篇 CVPR 2019【生成对抗网络】相关论文和代码
专知会员服务
32+阅读 · 2020年1月10日
相关资讯
已删除
AI掘金志
7+阅读 · 2019年7月8日
Python 热图进阶
专知
15+阅读 · 2019年5月4日
【泡泡读者来稿】VINS 论文推导及代码解析(一)
泡泡机器人SLAM
114+阅读 · 2019年3月3日
数据分析师应该知道的16种回归技术:弹性网络回归
数萃大数据
91+阅读 · 2018年8月16日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
面试整理:关于代价函数,正则化
数据挖掘入门与实战
8+阅读 · 2018年3月29日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
机器学习(19)之支持向量回归机
机器学习算法与Python学习
12+阅读 · 2017年10月3日
MATLAB人工神经网络教程
七月在线实验室
8+阅读 · 2017年9月6日
相关论文
Advances in Online Audio-Visual Meeting Transcription
Arxiv
4+阅读 · 2019年12月10日
Arxiv
4+阅读 · 2019年12月2日
Multi-Grained Named Entity Recognition
Arxiv
6+阅读 · 2019年6月20日
Arxiv
7+阅读 · 2019年5月31日
SepNE: Bringing Separability to Network Embedding
Arxiv
3+阅读 · 2019年2月26日
Arxiv
6+阅读 · 2018年10月3日
Arxiv
3+阅读 · 2018年4月9日
Top
微信扫码咨询专知VIP会员