带有值的热图(ggplot2)

Tyl*_*ker 31 r ggplot2

我已经看到了各种R图形系统中包含晶格和基底的值的热图,如下所示:

在此输入图像描述

我倾向于使用ggplot2一点,并希望能够制作具有相应单元格值的热图.这是热图和尝试使用geom_text:

library(reshape2, ggplot2)
dat <- matrix(rnorm(100, 3, 1), ncol=10)
names(dat) <- paste("X", 1:10)
dat2 <- melt(dat, id.var = "X1")
p1 <- ggplot(dat2, aes(as.factor(Var1), Var2, group=Var2)) +
    geom_tile(aes(fill = value)) +
    scale_fill_gradient(low = "white", high = "red") 
p1

#attempt
labs <- c(apply(round(dat[, -2], 1), 2, as.character))
p1 +  geom_text(aes(label=labs), size=1)
Run Code Online (Sandbox Code Playgroud)

通常我可以找出要传递的x和y值,但在这种情况下我不知道,因为此信息未存储在数据集中.如何将文字放在热图上?

Tyl*_*ker 76

这已经更新,以符合tidyverse原则,并改善ggplot2的不良使用

根据SlowLeraner的评论我很容易做到这一点:

library(tidyverse)

## make data
dat <- matrix(rnorm(100, 3, 1), ncol=10)

## reshape data (tidy/tall form)
dat2 <- dat %>%
    tbl_df() %>%
    rownames_to_column('Var1') %>%
    gather(Var2, value, -Var1) %>%
    mutate(
        Var1 = factor(Var1, levels=1:10),
        Var2 = factor(gsub("V", "", Var2), levels=1:10)
    )

## plot data
ggplot(dat2, aes(Var1, Var2)) +
    geom_tile(aes(fill = value)) + 
    geom_text(aes(label = round(value, 1))) +
    scale_fill_gradient(low = "white", high = "red") 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 5

还有另一种更简单的方法来制作带有值的热图。您可以使用pheatmap来做到这一点。

dat <- matrix(rnorm(100, 3, 1), ncol=10)
names(dat) <- paste("X", 1:10)
install.packages('pheatmap') # if not installed already
library(pheatmap)
pheatmap(dat, display_numbers = T)
Run Code Online (Sandbox Code Playgroud)

这会给你一个这样的情节

带值的热图

如果你想删除聚类并使用你的配色方案,你可以这样做

pheatmap(dat, display_numbers = T, color = colorRampPalette(c('white','red'))(100), cluster_rows = F, cluster_cols = F, fontsize_number = 15)
Run Code Online (Sandbox Code Playgroud)

没有聚类和红白颜色的热图

您还可以更改显示数字的字体大小、格式和颜色。