40  弦图

40.1 什么是弦图?

弦图(chord diagram)又称和弦图。可以显示不同实体之间的相互关系和彼此共享的一些共通之处,因此这种图表非常适合用来比较数据集或不同数据组之间的相似性。节点围绕着圆周分布,点与点之间以弧线或贝塞尔曲线彼此连接以显示其中关系,然后给每个连接分配数值(通过每个圆弧的大小比例表示)。此外,也可以用颜色将数据分成不同类别,有助于进行比较和区分。

弦图的特点在于,它有助于我们看出数据之间的关系,适用于比较数据集或不同数据组之间的相似性。连接两个数据点的弧线可以以颜色、弧线与圆的接触面积大小为不同的维度,表达不同的数值。正因为弦图能在表达大量复杂数据的同时,尽可能把这种复杂的关系可视化,所以弦图被广泛应用于各个方面。弦图的缺点是过于混乱,尤其是当要显示太多连接的时候。

本文我们就来讨论一下弦图是如何绘制的。

40.2 绘图前的数据准备

demo数据可以在https://www.bioladder.cn/shiny/zyp/bioladder2/demoData/Chord/data.csv下载。

数据共包含3列。前2列定义从哪到哪的连线关系,第三列是数值定义连线的粗细。

40.3 R语言怎么画弦图

library(circlize)

# 读取数据
df <- read.delim("https://www.bioladder.cn/shiny/zyp/bioladder2/model/bioladder1/Chord/demoData.txt")

# 绘图
chordDiagram(
  x = df,
  grid.col = hcl.colors(11),                     # 颜色方案,数字向量11要和实际的数据相符
  directional = 1,                               # 箭头方向。选项有1,0,-1
  direction.type = c("arrows", "diffHeight"),    # 线条两端的形状
  diffHeight = -0.02,                            # 线条两端距离边缘的距离差
  annotationTrack = c("name", "grid", "axis"),   # 都绘制哪些内容,name标签;grid边缘形状;axis刻度
  annotationTrackHeight = c(0.05, 0.08),         # 标签距离图形的距离; 环形边缘的宽度
  link.arr.type = "big.arrow",                   # 形状"curved", "triangle", "circle", "ellipse".
  link.sort = TRUE,                              # 内部排序
  link.largest.ontop = TRUE,                     # 控制添加链接的顺序,是否基于绝对值?
  transparency = 0.25                            # 线条透明度
)
# 更多参数?chordDiagram查看

40.3.1 附录:拓展加强(可选)

# 附录 拓展
# 1.修改数据标签和坐标轴
circos.trackPlotRegion(
  track.index = 1,
  bg.border = NA,
  panel.fun = function(x, y) {
    xlim = get.cell.meta.data("xlim")
    sector.index = get.cell.meta.data("sector.index")
    # 添加数据标签
    circos.text(
      x = mean(xlim),
      y = 3.2,
      labels = sector.index,
      facing = "bending",
      cex = 1
    )
    # 添加坐标轴
    circos.axis(
      h = "top",
      major.at = seq(from = 0, to = xlim[2], by = ifelse(test = xlim[2]>10, yes = 2, no = 1)),
      minor.ticks = 1,
      major.tick.percentage = 0.5,
      labels.niceFacing = FALSE)
  })



# 2.调节边距,起始角度,间隔角度等参数

circos.par(start.degree = 90,
           gap.degree = 4,
           track.margin = c(-0.1, 0.1), 
           points.overflow.warning = FALSE)
circos.clear()

40.4 BioLadder生信云平台在线绘制弦图

不想写代码?可以用BioLadder生信云平台在线绘制弦图。

网址:https://www.bioladder.cn/web/#/chart/37