繁体   English   中英

如何在 r 中创建和弦图?

[英]How to create a chord diagram in r?

我以前从来没有像这样制作过 plot ,很抱歉,这可能是一个基本问题,但我被困在如何制作和弦图并专门让外部部分成为我的列标题(药物机制)和内部部分之间的连接是不需要在 plot 中命名的行(基因),因为有很多。

我的数据是由零或一标记为与药物机制列相互作用的基因行。

例如,我的数据子集如下所示:

Gene    Diuretic  Beta_blocker  ACE_inhibitor
Gene1      1          0              0
Gene2      0          0              1
Gene3      1          1              1
Gene4      0          1              1 

我的总数据实际上是 15 列药物机制的 700 个基因,其中包含所有 zeor 和 one。 我目前正在创建一个和弦图:

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)

根据我的总数据,这个 plot 看起来像: 在此处输入图像描述

试图让这个 plot 成为 15 个部分(甚至只是试图让这些部分具有列名)时,我遇到了各种错误。

有没有办法给我 plot 一个和弦图,各部分代表每列? 那么对于该部分和弦图中显示的任何其他部分具有交互作用的基因/行(数据中的 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")

如果你有 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)

在此处输入图像描述

但是,如果我们制作一个与您的真实数据规模相同的样本数据集,我们会得到更令人满意的结果:

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)

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM