You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的刻度,需要手动覆盖原有刻度,具体代码如下:

  1. 绘制弦图并关闭默认刻度
library(circlize)
circos.par(gap.degree = 0.8)
# 仅保留网格线,不生成默认刻度
chordDiagram(dat, transparency = 0.5, annotationTrack = "grid")
  1. 添加自定义刻度
# 定义刻度的位置和标签
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:57:07