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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:24:55