R语言circlize包:如何在弦图各扇区内按年份分组
解决circlize弦图按年份分组扇区的问题
要实现按年份分组扇区,核心是将组织(Org)与年份(Year)组合成新的扇区标识,并给这些新扇区指定对应的年份分组。以下是具体步骤:
1. 生成带年份的扇区名称
将每个组织和对应的年份拼接成新的扇区ID,这样每个扇区代表「某年份的某组织」:
# 生成带年份的扇区列 stack.df$Org_1_Year <- paste(stack.df$Org_1, stack.df$Year, sep = "_") stack.df$Org_2_Year <- paste(stack.df$Org_2, stack.df$Year, sep = "_")
2. 准备分组向量
创建命名向量,其中名称是带年份的扇区ID,值是对应的年份,确保同一年份的扇区被归为一组:
# 获取所有带年份的扇区 all_sectors <- union(stack.df$Org_1_Year, stack.df$Org_2_Year) # 提取每个扇区对应的年份作为分组 group_vec <- sapply(all_sectors, function(x) strsplit(x, "_")[[1]][2]) # 设置命名(扇区ID为名称,年份为分组值) names(group_vec) <- all_sectors
3. 准备带年份扇区的颜色映射
沿用原组织的颜色,给每个带年份的扇区分配对应颜色:
year_sector_cols <- sapply(all_sectors, function(x) { org <- strsplit(x, "_")[[1]][1] Type_Cols[org] })
4. 绘制带年份分组的弦图
使用新的扇区列,指定group参数完成分组,并可调整分组的显示样式:
library(circlize) chordDiagramFromDataFrame(stack.df[, c("Org_1_Year", "Org_2_Year")], group = group_vec, # 关键:指定分组向量 grid.col = year_sector_cols, link.lty = stack.df$lty, directional = 1, direction.type = "arrows", link.arr.col = c("black", rep("white", nrow(stack.df) - 1)), group.height = 0.05, # 分组之间的间隔高度 group.col = unique(stack.df$Link_cols) # 分组标签的颜色 ) # 自定义分组标签显示(可选,优化标签方向) circos.track(track.index = 1, panel.fun = function(x, y) { if(abs(CELL_META$xcenter) < 1e-6) { circos.text(CELL_META$xcenter, CELL_META$ylim[1], CELL_META$group, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5)) } }, bg.border = NA)
为什么之前的尝试失败?
你之前的group向量格式错误:circlize要求group是命名向量,名称为扇区ID,值为该扇区所属的组。同时,原始的扇区是不带年份的组织(如OOP),每个组织跨多个年份,无法直接给单个组织指定唯一分组,必须将组织与年份组合成新扇区,才能按年份实现分组。
内容的提问来源于stack exchange,提问作者Purrsia
相关产品推荐
相关产品推荐

