【问题标题】:How to plot a data table of 0's and 1's as a two-color grid in R?如何在 R 中将 0 和 1 的数据表绘制为双色网格?
【发布时间】:2020-08-11 11:15:47
【问题描述】:

我有一些类似下面的文件。每行包含 26 行,由样本名称和多个 0 和 1 组成。

mem/Bur_05_sorted.bam_A 0   0   0   0   0   1   1   0   0   1   1   0   0   0   1   1   1   1   1   1   1   1
mem/Bur_05_sorted.bam_B 1   1   1   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0
mem/Ell_06_sorted.bam_A 1   1   0   0   0   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0
mem/Ell_06_sorted.bam_B 0   0   0   0   0   1   1   1   1   1   1   1   1   0   1   1   0   0   0   0   0   0
mem/Ell_07_sorted.bam_A 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Ell_07_sorted.bam_B 1   1   1   1   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
mem/Ste_01_sorted.bam_A 0   0   0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   0   0   0   0   0
mem/Ste_01_sorted.bam_B 0   0   0   0   0   1   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0
mem/Sto_02_sorted.bam_A 0   0   0   0   0   0   0   0   0   1   1   1   1   0   1   1   1   1   1   1   1   1
mem/Sto_02_sorted.bam_B 1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Sto_03_sorted.bam_A 1   1   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0
mem/Sto_03_sorted.bam_B 0   0   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   0   0
mem/Sto_07_sorted.bam_A 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Sto_07_sorted.bam_B 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_01_sorted.bam_A 1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_01_sorted.bam_B 0   0   0   0   0   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0
mem/Vog_02_sorted.bam_A 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_02_sorted.bam_B 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_03_sorted.bam_A 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_03_sorted.bam_B 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_04_sorted.bam_A 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_04_sorted.bam_B 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
mem/Vog_05_sorted.bam_A 1   1   1   1   1   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0
mem/Vog_05_sorted.bam_B 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   1
mem/Vog_06_sorted.bam_A 1   1   0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0
mem/Vog_06_sorted.bam_B 1   1   1   1   1   0   0   0   0   0   0   0   0   1   1   1   0   0   0   0   0   0

线条代表混合血统个体的基因组序列。每个数字代表一个长度为 0.01 兆碱基的 bin,该值表示 binned 段的祖先。 我想使用这个文件来生成两种颜色的网格图(例如红色的 0 和蓝色的 1),其中 y 轴显示样本名称。像this 这样的情节。

我对 R 没有经验,但我最初的猜测是将表格读取为矩阵:

data <- as.matrix(read.table("L_1616.vit.txt"), rownames = 1)

然后使用 image() 进行绘图。但我不太清楚该命令提供什么作为参数。 任何人都可以解释如何做到这一点? image() 方法正确吗?

谢谢!

【问题讨论】:

    标签: r matrix plot


    【解决方案1】:

    考虑以下示例。根据您的代码,在加载数据集时删除 as.matrix 应该可以让您获得类似的结构)

    df <- data.frame(row.names = LETTERS[1:20],
                     col1 = sample(c(0,1),20, replace = TRUE),
                     col2 = sample(c(0,1),20, replace = TRUE),
                     col3 = sample(c(0,1),20, replace = TRUE))  
    
    > head(df)
      col1 col2 col3
    A    0    1    0
    B    1    1    1
    C    1    0    0
    D    0    1    0
    E    0    1    0
    F    0    0    1 
    

    使用image,您可以:

    image(as.matrix(df), col = c("red","blue"))
    

    但是,另一种选择可能是使用ggplot2geom_tile 函数进行绘图。

    您可以使用pivot_longer 将数据框转换为更长的格式并获取以下数据集:

    library(tidyr)
    library(dplyr)
    
    df %>% mutate(Row = rownames(df)) %>%
      pivot_longer(-Row)
    
    # A tibble: 60 x 3
       Row   name  value
       <chr> <chr> <dbl>
     1 A     col1      0
     2 A     col2      1
     3 A     col3      0
     4 B     col1      1
     5 B     col2      1
     6 B     col3      1
     7 C     col1      1
     8 C     col2      0
     9 C     col3      0
    10 D     col1      0
    # … with 50 more rows
    

    除了前面的代码,还可以通过follwoign代码获取情节:

    library(tidyr)
    library(dplyr)
    library(ggplot2)
    
    df %>% mutate(Row = rownames(df)) %>%
      pivot_longer(-Row) %>%
      ggplot(aes(x = Row, y = reorder(name, desc(name)), fill = as.factor(value)))+
      geom_tile()+
      scale_fill_manual(name = "Code", values = c("red","blue"))+
      labs(y = "")
    

    它回答了你的问题吗?

    【讨论】:

    • 这非常有帮助!非常感谢!
    猜你喜欢
    • 2015-01-13
    • 2022-09-23
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多