如何在R语言和弦图中调整扇区标签并添加计数信息
解决R语言和弦图扇区标签堆叠问题
问题场景
使用circlize包绘制和弦图时,尝试给每个扇区添加事件名称(如A)和对应计数(如N=14)的标签,但所有标签堆叠在图表顶部,无法正常读取。
原始数据集
USUBJID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30) A <- c(1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) B <- c(2, 0, 0, 0, 1, 1, 2, 0, 0, 0, 1, 1, 2, 1, 0, 2, 2, 2, 0, 1, 0, 0, 1, 2, 0, 2, 0, 0, 0, 0) C <- c(0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0) D <- c(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) E <- c(1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0) F <- c(2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0) data <- data.frame(USUBJID, A, B, C, D, E, F)
原始代码(存在标签堆叠问题)
library(circlize) # 提取事件列(排除USUBJID) events <- as.matrix(data[, -1]) # 生成事件共现矩阵 co_occurrence <- t(events) %*% events diag(co_occurrence) <- 0 # 定义扇区数量 num_sectors <- ncol(events) chordDiagram( x = co_occurrence, transparency = 0.5, annotationTrack = "grid" ) # 尝试添加扇区标签及计数 for (i in 1:length(sector_names)) { circos.text( x = 1, y = i, labels = sector_names[i], facing = "clockwise", niceFacing = TRUE, col = "black", adj = c(0, 0.5) ) circos.text( x = 1, y = i, labels = paste("N =", sum(data[, i + 1] == 1)), facing = "clockwise", niceFacing = TRUE, col = "black", adj = c(0, 1) ) }
问题原因
原始代码中circos.text使用了固定的x=1和y=i参数,没有对应到每个扇区的实际位置,导致所有标签堆叠在同一区域,无法区分。
解决方案
提供两种可行的修正方式,确保标签精准对应每个扇区:
方式一:绘制时直接指定自定义标签(简洁版)
直接在chordDiagram函数中配置带计数的扇区标签,无需手动循环添加:
library(circlize) # 生成共现矩阵 events <- as.matrix(data[, -1]) co_occurrence <- t(events) %*% events diag(co_occurrence) <- 0 # 计算每个事件的计数,生成带计数的标签 sector_names <- colnames(events) counts <- sapply(events, function(x) sum(x == 1)) custom_labels <- paste(sector_names, paste0("N=", counts), sep = ", ") # 绘制和弦图,直接使用自定义标签 chordDiagram( x = co_occurrence, transparency = 0.5, annotationTrack = c("grid", "name"), # 显示网格和名称标签 sector.labels = custom_labels, # 设置自定义标签内容 sector.label.col = "black", # 标签颜色 sector.label.cex = 0.8 # 标签字号 ) # 关闭circlize绘图设备 circos.clear()
方式二:手动获取扇区位置添加标签(灵活版)
通过circos.track获取每个扇区的元数据(中心角度、半径位置),精准放置标签:
library(circlize) # 生成共现矩阵 events <- as.matrix(data[, -1]) co_occurrence <- t(events) %*% events diag(co_occurrence) <- 0 # 计算每个事件的计数,生成带计数的标签 sector_names <- colnames(events) counts <- sapply(events, function(x) sum(x == 1)) custom_labels <- paste(sector_names, paste0("N=", counts), sep = ", ") # 先绘制和弦图的网格部分 chordDiagram( x = co_occurrence, transparency = 0.5, annotationTrack = "grid", annotationTrackHeight = c(0.05, 0.1) # 调整轨道高度,预留标签空间 ) # 遍历每个扇区,添加自定义标签 for(i in seq_along(sector_names)){ circos.track(track.index = 1, panel.fun = function(x, y) { current_sector <- get.cell.meta.data("sector.index") if(current_sector == sector_names[i]){ # 获取扇区中心角度和顶部半径 center_theta <- get.cell.meta.data("xcenter") top_radius <- get.cell.meta.data("cell.top.radius") # 在扇区外侧添加标签 circos.text( x = center_theta, y = top_radius + mm_y(5), # 向外偏移5毫米,避免与网格重叠 labels = custom_labels[i], facing = "clockwise", niceFacing = TRUE, col = "black", cex = 0.8 ) } }, bg.border = NA) } # 关闭circlize绘图设备 circos.clear()
两种方式都能实现每个扇区对应显示事件名称及计数的标签,不会出现堆叠问题。
内容的提问来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

