R语言 使用ggplot2中矩阵的值创建热图

9o685dep  于 2023-01-03  发布在  其他
关注(0)|答案(2)|浏览(246)

我看到过在各种R图形系统中生成的热图,包括lattice和base,如下所示:

我倾向于使用一些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)

通常我可以计算出要传递的x和y值,但在这种情况下我不知道,因为这些信息没有存储在数据集中。我如何将文本放置在热图上?

bxjv4tth

bxjv4tth1#

关键是给数据添加一个行标识符,并使其“更长”。

2022年12月编辑,使代码可在R 4.2.2 /ggplot 2 3.4.0中重现,并反映tidyverse语义的变化

library(ggplot2)
library(tidyverse)
dat <- matrix(rnorm(100, 3, 1), ncol = 10)
## the matrix needs names
names(dat) <- paste("X", 1:10)

## convert to tibble, add row identifier, and shape "long"
dat2 <-
  dat %>%
  as_tibble() %>%
  rownames_to_column("Var1") %>%
  pivot_longer(-Var1, names_to = "Var2", values_to = "value") %>%
  mutate(
    Var1 = factor(Var1, levels = 1:10),
    Var2 = factor(gsub("V", "", Var2), levels = 1:10)
  )
#> Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if
#> `.name_repair` is omitted as of tibble 2.0.0.
#> ℹ Using compatibility `.name_repair`.

ggplot(dat2, aes(Var1, Var2)) +
  geom_tile(aes(fill = value)) +
  geom_text(aes(label = round(value, 1))) +
  scale_fill_gradient(low = "white", high = "red")

创建于2022年12月31日,使用reprex v2.0.2

bvpmtnay

bvpmtnay2#

还有另一种更简单的方法来制作有值的热图,你可以使用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)

这会给予你一个像这样的情节

如果要移除聚类并使用您的配色方案,可以执行以下操作

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

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

相关问题