如何在R中修改弦图(Chord Diagram)的刻度范围
问题描述
我在R中有如下相关矩阵:
dat <- as.matrix(cbind(c(1.0000000, 0.5161944, 0.5190630, 0.3717464, 0.5719125), c(0.5161944, 1.0000000, 0.2549985, 0.8469740, 0.7761113), c(0.5190630, 0.2549985, 1.0000000, 0.2130771, 0.2930945), c(0.3717464, 0.8469740, 0.2130771, 1.0000000, 0.5652874), c(0.5719125, 0.7761113, 0.2930945, 0.5652874, 1.0000000)) ) colnames(dat) <- c(paste0("X",1:ncol(dat))) rownames(dat) <- c(paste0("X",1:ncol(dat)))
我希望绘制弦图来可视化这些相关性,使用了如下代码生成基础版本:
library(circlize) circos.par(gap.degree = 0.8) chordDiagram(dat, transparency = 0.5)
现在我想修改每个X对应的刻度值,使其显示范围为0到1,步长为0.25,请问基于当前使用的函数是否可以实现?
解决方案
可以实现。默认情况下,chordDiagram的刻度是基于每个扇区的总权重(对应行的求和值),要改成0到1、步长0.25的刻度,需要手动覆盖原有刻度,具体代码如下:
- 绘制弦图并关闭默认刻度
library(circlize) circos.par(gap.degree = 0.8) # 仅保留网格线,不生成默认刻度 chordDiagram(dat, transparency = 0.5, annotationTrack = "grid")
- 添加自定义刻度
# 定义刻度的位置和标签 tick_pos <- seq(0, 1, by = 0.25) tick_labels <- as.character(tick_pos) # 遍历所有扇区,逐个添加刻度 for(s in get.all.sector.index()) { circos.trackPlotRegion(sector.index = s, track.index = 1, panel.fun = function(x, y) { # 将0-1的刻度映射到当前扇区的长度范围 x_axis_range <- get.cell.meta.data("xlim") mapped_pos <- seq(from = x_axis_range[1], to = x_axis_range[2], length.out = length(tick_pos)) # 添加刻度线与标签 circos.axis(h = "top", labels.cex = 0.6, at = mapped_pos, labels = tick_labels, major.tick.length = mm_y(2)) }) } # 关闭circos绘图环境 circos.clear()
关键说明
annotationTrack = "grid"参数让chordDiagram只绘制扇区的网格边界,不生成默认的权重刻度。- 通过
get.all.sector.index()获取所有扇区名称(X1到X5),循环处理每个扇区。 circos.trackPlotRegion进入对应扇区的绘图轨道,将0-1的刻度均匀映射到扇区的整个长度,再用circos.axis生成自定义刻度。
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

