R语言如何绘制弦图

什么是弦图

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

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

绘图前的数据准备

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

demo数据可以从这下载:https://www.r2omics.cn/res/demodata/chord.txt

# A tibble: 36 x 3
   from  to    value
   <chr> <chr> <dbl>
 1 A     A     3.14 
 2 B     B     1.63 
 3 G     B     0.526
 4 H     B     0.145
 5 A     C     2.11 
 6 B     C     0.601
 7 C     C     2.40 
 8 D     C     1.76 
 9 E     C     1.22 
10 F     C     0.170
# i 26 more rows

R语言如何绘制弦图

# 代码来源:https://www.r2omics.cn/
library(circlize)

# 读取数据
df <- read.delim("https://www.r2omics.cn/res/demodata/chord.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                            # 线条透明度
)

附录

# 1.修改数据标签和坐标轴,使用下面代码时,需要把annotationTrack里的name和axis选项去掉。
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() # 清除设置