R语言中chordDiagram()函数的数值位置调整问题
问题原因
你遇到的刻度位置偏差,是因为设置了scale = T参数:这个参数会将每个扇区的总宽度归一化到1,但你手动添加的x轴刻度是基于0-1的比例区间,而实际想要的刻度应该对应原始相关系数的总和数值,两者不匹配导致位置错位。比如X3扇区的原始总和约为1.506,归一化后0.21的占比仅约0.14,所以落在0-0.25区间,但原始数值更接近0.25。
解决方法
有两种修正方式,根据你的需求选择:
方法1:移除归一化(推荐)
直接去掉scale = T参数,让扇区宽度保留原始总和的比例,同时调整x轴刻度为对应原始总和的区间:
circos.par(gap.degree = 0.8) # 移除scale=T,保留原始扇区宽度 chordDiagram(dat, transparency = 0.5, annotationTrack = c("name", "grid")) # 计算每个扇区的原始总和,生成对应刻度 sector_sums <- colSums(dat) for (i in 1:ncol(dat)) { sector_name <- paste0("X", i) max_sum <- sector_sums[sector_name] # 生成等距刻度,按0.25间隔,不超过扇区总和 ticks <- seq(0, ceiling(max_sum * 4)/4, 0.25) ticks <- ticks[ticks <= max_sum] circos.xaxis(sector.index = sector_name, major.at = ticks, minor.ticks = 0, labels.cex = .5) }
方法2:保留归一化,修正刻度映射
如果需要保持所有扇区宽度一致(scale=T),则需要将原始数值转换为归一化后的位置,再设置刻度:
circos.par(gap.degree = 0.8) # 保留scale=T,同时记录扇区的原始总和 chordDiagram(dat, transparency = 0.5, scale = T, annotationTrack = c("name", "grid")) sector_sums <- colSums(dat) for (i in 1:ncol(dat)) { sector_name <- paste0("X", i) max_sum <- sector_sums[sector_name] # 原始数值转换为归一化位置:value / max_sum ticks_raw <- seq(0, ceiling(max_sum * 4)/4, 0.25) ticks_raw <- ticks_raw[ticks_raw <= max_sum] ticks_norm <- ticks_raw / max_sum # 显示原始数值,位置用归一化后的坐标 circos.xaxis(sector.index = sector_name, major.at = ticks_norm, labels = ticks_raw, minor.ticks = 0, labels.cex = .5) }
效果说明
以X3和X4的连接为例:
- 方法1中X3扇区的总和约为1.506,0.21的位置会直接对应刻度0.21附近,和你期望的位置一致;
- 方法2中0.21对应的归一化位置约为0.14,但刻度显示的是原始数值0.21,视觉上匹配你想要的数值标注。
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

