【问题标题】:Big and small gaps using circlize in R在R中使用circlize的大小间隙
【发布时间】:2020-09-17 21:51:12
【问题描述】:

如何对类别进行分组,以便它们在使用 R 中的 circlize 包生成的和弦图中出现较大的间隙?

例如,给定以下邻接矩阵:

  A B    C   D  E F    G   H
A 0 0    0   0  0 0 1168   0
B 0 0 2545 278  0 0    0 337
C 0 0    0 817  0 0    0   0
D 0 0    0   0 10 0    0   0
E 0 0    0   0  0 0    0   0
F 0 0    0   0  0 0    0   0
G 0 0  561 326  0 0    0 281
H 0 0   46   8  0 0    0   0

我想创建三个组 {A}、{B,C} 和 {D,E,F,G,H},以便在使用 chordDiagram() 时,其参数 small.gap 在段之间使用组内使用big.gap,组间使用。

请注意,这是每天在生产环境中运行的代码,我不能保证所有类别之间总是会发生变化。在上面的示例中,类别 F 没有发生移动,因此从输出中省略了它。使用gap.after 我硬编码了所需的结果(见图),但这不是一个可行的解决方案,因为我不知道将绘制哪些类别。我还希望解决方案不依赖于矩阵中列和行的顺序。

【问题讨论】:

    标签: r circlize


    【解决方案1】:

    在即将发布的 0.4.10 版本中,circlize 将支持命名向量作为gap.after 的输入。它已经在主分支中,因此在将其拉入 R 之后,可以通过编程方式产生正确的间隙。

    library(devtools)
    install_github("jokergoo/circlize")
    library(circlize) # chord diagrams
    
    mat = read.table(textConnection("
      A B    C   D  E F    G   H
    A 0 0    0   0  0 0 1168   0
    B 0 0 2545 278  0 0    0 337
    C 0 0    0 817  0 0    0   0
    D 0 0    0   0 10 0    0   0
    E 0 0    0   0  0 0    0   0
    F 0 0    0   0  0 0    0   0
    G 0 0  561 326  0 0    0 281
    H 0 0   46   8  0 0    0   0"))
    mat = as.matrix(mat)
    
    big_gap = 10
    small_gap = 2
    
    # For example three groups x,y,z
    sector_grouping = cbind.data.frame(
      "Sec" = c("A","B","C","D","E","F","G","H"), 
      "Grp" = c("x","y","y","z","z","z","z","z")
    )
    # Check which, if any, groups lack both outgoing and incoming
    empty_row = rowSums(mat)[sector_grouping$Sec] == 0
    empty_column = colSums(mat)[sector_grouping$Sec] == 0
    # Remove empty sectors
    sector_grouping = sector_grouping[!(empty_row & empty_column),]
    # Iterate and set a big gap (last sector in group) or small gap.
    for(i in 1:nrow(sector_grouping)) {
      sector_grouping[i,"Gap"] = ifelse(
        sector_grouping[i,2]==sector_grouping[i+1,2],
        small_gap,
        big_gap
      )
    }
    # The last sector needs fixing (always assumed big)
    sector_grouping$Gap[is.na(sector_grouping$Gap)] = big_gap
    # Build named vector
    gap.after = sector_grouping$Gap
    names(gap.after) = sector_grouping$Sec
    
    circos.par(gap.after = gap.after)
    chordDiagram(mat, order = LETTERS[1:8])
    circos.clear()
    

    感谢circlize的作者@Zuguang Gu 在我联系到他后的及时帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      相关资源
      最近更新 更多