如何在R中创建弦图?

3
我从未制作过这样的图表,所以很抱歉这可能是一个基本问题,但我无法理解如何制作弦图,并具体使外部区域成为我的列标题(药物机制),内部连接成为行(基因),其中不需要在绘图中命名,因为太多了。
我的数据是一些基因行通过0或1标记与药物机制列互动。
例如,我的数据子集如下:
Gene    Diuretic  Beta_blocker  ACE_inhibitor
Gene1      1          0              0
Gene2      0          0              1
Gene3      1          1              1
Gene4      0          1              1 

我的总数据实际上是 700 个基因,涉及 15 列药物机制,所有的值都是零和一。目前我只是在创建一个切尔德图,具体细节如下:

df <- fread('df.csv')
df[is.na(df)] <- 0

df <- df %>% data.frame %>% set_rownames(.$Gene) %>% dplyr::select(-Gene)
mt <- as.matrix(df)

circos.par(gap.degree = 0.9) #set this as I was otherwise getting an error with my total data
chordDiagram(mt, transparency = 0.5)

根据我的全部数据,这个图看起来是这样的:enter image description here

在尝试将此图形设置为仅有15个部分(甚至只是尝试使每个部分具有列名称)时,我遇到了各种错误。

有没有一种方法可以绘制弦图,使得每个部分代表每一列?对于具有交互作用(数据中的1)的基因/行,以及任何其他部分,都可以在弦图中显示?我不需要看到基因名称,我只想可视化我的列/部分之间的重叠程度。

示例输入数据(我的问题是尝试使其每个列仅有3个部分,以显示它们的重叠):

df <- structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4"), 
    Diuretic = c(1L, 0L, 1L, 0L), Beta_blocker = c(0L, 0L, 1L, 
    1L), ACE_inhibitor = c(0L, 1L, 1L, 1L)), row.names = c(NA, 
-4L), class = c("data.table", "data.frame")

我不是完全清楚你想要这个表示看起来像什么。大概,对于这个小样本,你只想要在图表周围有三个彩色的部分:一个用于贝塔受体阻滞剂,一个用于利尿剂和一个用于ACE抑制剂。但是,基因1应该如何表示,因为它只在利尿剂下出现为1。这将如何表示?从哪里到哪里的弦? - Allan Cameron
1个回答

3
如果你有15种不同的药物机制,最好计算各种机制共有的基因,并将其用作药物效应之间链接的加权值。
你的样本数据太有限了,无法感受到这个过程的具体情况,但代码大致如下:
new_df <-apply(df, 1, function(x) {
  x <- names(df)[which(x == 1)]
  m <- 1 - diag(length(x))
  dimnames(m) <- list(x, x)
  inds <- which(lower.tri(m), arr.ind = TRUE)
  data.frame(from = x[inds[,1]], to = x[inds[,2]])}) %>%
  bind_rows() %>%
  mutate(wt = 1)  %>%
  group_by(from, to) %>%
  summarize(wt = sum(wt), .groups = 'drop')

new_df
#> # A tibble: 3 x 3
#>   from          to              wt
#>   <chr>         <chr>        <dbl>
#> 1 ACE_inhibitor Beta_blocker     2
#> 2 ACE_inhibitor Diuretic         1
#> 3 Beta_blocker  Diuretic         1

我们可以看到,有两个基因对ACE抑制剂和β受体阻断剂机制有共同作用(这是您的表所暗示的),还有一个单一的基因将利尿剂与β受体阻断剂和ACE抑制剂联系起来。这产生了以下相当乏味的弦图:
chordDiagram(new_df)

enter image description here

然而,如果我们制作一个与您的真实数据相同规模的样本数据集,我们将获得更加令人满意的结果:
set.seed(123)

big_dat <- as.data.frame(matrix(rbinom(15 * 700, 1, 0.5), 700),
              row.names = paste0('Gene', 1:700)) %>%
  setNames(c('ACE_inhibitor', 'Diuretic', 'Beta_Blocker', 
             'CCB', 'Nitrate', 'K_channel', 'Aldosterone_blocker',
             'Vasodilator', 'PDEI', 'Central', 'Relaxant',
             'ARB', 'Alpha_blocker', 'Dopaminergic', 'Unknown'))

big_df <- apply(big_dat, 1, function(x) {
  x <- names(big_dat)[which(x == 1)]
  m <- 1 - diag(length(x))
  dimnames(m) <- list(x, x)
  inds <- which(lower.tri(m), arr.ind = TRUE)
  data.frame(from = x[inds[,1]], to = x[inds[,2]])}) %>%
  bind_rows() %>%
  mutate(wt = 1) %>%
  subset(complete.cases(.)) %>%
  group_by(from, to) %>%
  summarize(wt = sum(wt), .groups = 'drop')

chordDiagram(big_df)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接