使用 ggplot2 在 r 中为热图准备数据框

Posted

技术标签:

【中文标题】使用 ggplot2 在 r 中为热图准备数据框【英文标题】:preparing data frame in r for heatmap with ggplot2 【发布时间】:2021-06-25 22:15:53 【问题描述】:

目前正在尝试创建一些基因数据的热图。这些列当前标记为 s1、s2、s3 等,但我还有一个 .txt 文件,该文件具有每个样本的正确对应标签。我不确定我是否需要首先修改具有基因表达水平的 csv 文件,或者我是否可以将它们单独传输到我正在尝试准备的数据框,最终将其制作成热图。我也不确定数据框的格式应该是什么。如果这很重要,我想使用 ggplot2 创建热图。

到目前为止,这是我的代码:

library(ggplot2)
library(dplyr)
library(magrittr) 

nci <- read.csv('/Users/myname/Desktop/ML Extra Credit/nci.data.csv')
nci.label <-scan(url("https://web.stanford.edu/~hastie/ElemStatLearn/datasets/nci.label",what="")
                 
#Select certain columns (specific years)
mat <- matrix(rexp(200, rate=.1), ncol=20)
rownames(mat) <- paste0('gene',1:nrow(mat))
colnames(mat) <- paste0('sample',1:ncol(mat))
mat[1:5,1:5]

它输出一个如下所示的示例数据框:

    sample1   sample2    sample3   sample4   sample5

gene1 32.278434 16.678512  0.4637713  1.016569  3.353944

gene2  8.719729 11.080337  1.5254223  2.392519  3.503191

gene3  2.199697 18.846487 13.6525699 34.963664  2.511097

gene4  5.860673  2.160185  3.5243884  6.785453  3.947606

gene5 16.363688 38.543575  5.6761373 10.142018 22.481752

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您需要以“长”格式获取数据框以方便绘图。这就是所谓的Tidy Data,构成了使用ggplot2 准备要绘制的数据的基础。

这里的一般想法是您需要一列用于x 值,一列用于y 值,以及一列表示用于平铺颜色的值。有很多方法可以做到这一点(参见melt()pivot_longer()...),但我喜欢使用tidyr::gather()。由于您使用的是行名,而不是基因列,因此我首先将其创建为数据集中的列。

library(dplyr)
library(tidyr)
library(ggplot2)

set.seed(1234)

# create matrix
mat <- matrix(rexp(200, rate=.1), ncol=20)
rownames(mat) <- paste0('gene',1:nrow(mat))
colnames(mat) <- paste0('sample',1:ncol(mat))
mat[1:5,1:5]

# convert to data.frame and gather
mat <- as.data.frame(mat)
mat$gene <- rownames(mat)
mat <- mat %>% gather(key='sample', value='value', -gene)

ggplot 调用非常简单。我们将每一列分配给xyfill 美学,然后使用geom_tile() 创建实际的热图。

ggplot(mat, aes(sample, gene)) + geom_tile(aes(fill=value))

【讨论】:

当我尝试使用收集功能时收到以下错误消息: UseMethod("gather") 中的错误:没有适用于“收集”的方法应用于“列表”类的对象 @Kyle - 抱歉,一开始我没有看到你发帖说你有一个矩阵。您需要先转换为数据框才能使用gather 函数。我已经编辑了答案以反映您的特殊情况。 我实际上最终使用了 melt() 将 df 转换为长格式。现在我的代码稍微简单了一点,只有库、read.csv、head(melt(nci)),然后是 ggplot 来创建热图,但它告诉我现在没有找到对象“值”。 您是否指向正确的数据集? melt() 应该创建一个名为“value”的列,对我来说,它默认为列名X1X2。您可能需要定义数据集的名称,并确保它们与分配给 ggplot 代码中每个美学(xyfill)的名称完全匹配。 @Kyle,我已经回答了你的另一个问题,但这是已经在这里和已经回答的内容的副本。从您那里的帖子中,您使用的是ggplot(nci),它正在尝试绘制“非熔化”数据集。如果要在数据调用中直接使用melt(),可以使用metl(nci)

以上是关于使用 ggplot2 在 r 中为热图准备数据框的主要内容,如果未能解决你的问题,请参考以下文章

R:使用 ggplot2 的离散热图

R 数据可视化 —— 聚类热图 pheatmap

在 r ggplot2 中为百分比值创建条形图

如何在 R 中为多个热图设置动画

R语言ggplot2绘图单元格为方块的热图简单小例子

R:我正在从矩阵制作热图,但 ggplot2 geom_raster 将(数字)值重新排序为字母