灵活的热图谁不喜欢?

2022-03-29 08:14:13 浏览数 (2)

导语

GUIDE ╲

热图是一种流行的可视化高维数据的图形方法,其中一个数字表被编码为彩色单元格的网格。矩阵的行和列按顺序排列以突出显示模式,并且通常伴随有树状图。热图在许多领域中用于可视化观察、相关性、缺失值模式等。

背景介绍

热图可以说是我们在日常可视化中最常用到的图形之一了,绘制热图的R包和工具也是数不胜数,我们也介绍过许多常见的工具,比如pheatmap、complexheatmap等等,今天小编给大家介绍一个可以交互式绘制热图的R包--heatmaply,交互式热图允许通过将鼠标悬停在单元格上来检查特定值,以及通过在相关区域周围拖动矩形来放大热图的区域,使用起来非常灵活方便。

R包安装

代码语言:javascript复制
install.packages('heatmaply')
##或者从github安装
install.packages.2 <- function (pkg) if (!require(pkg)) install.packages(pkg);
install.packages.2('remotes')
remotes::install_github("ropensci/plotly") 
remotes::install_github('talgalili/heatmaply')

可视化介绍

01

基础绘图

首先让我们试试默认的绘图

代码语言:javascript复制
library("heatmaply")
heatmaply(mtcars)

相关性热图

heatmaply 包括 heatmaply_cor 函数,可以进行相关性热图的绘制,我们可以看到默认的色彩都很漂亮,可以直接使用:

代码语言:javascript复制
##k_col和k_row分别代表使用几种颜色来给行和列着色
heatmaply_cor(
  cor(mtcars),
  xlab = "Features",
  ylab = "Features",
  k_col = 2,
  k_row = 2
)

很多情况下,我们在相关性热图中还要体现p值,也可以做一个更高级的相关热图,将p值映射到点大小:

代码语言:javascript复制
r <- cor(mtcars)
cor.test.p <- function(x){
    FUN <- function(x, y) cor.test(x, y)[["p.value"]]
    z <- outer(
      colnames(x), 
      colnames(x), 
      Vectorize(function(i,j) FUN(x[,i], x[,j]))
)
    dimnames(z) <- list(colnames(x), colnames(x))
    z
}
p <- cor.test.p(mtcars)

heatmaply_cor(
  r,
  node_type = "scatter",
  point_size_mat = -log10(p), 
  point_size_name = "-log10(p-value)",
  label_names = c("x", "y", "Correlation")
)

由于交互式的灵活性,我们可以通过鼠标滑动选中一部分图形,实现zoom in/zoom out的效果:

然后双击即可返回原图

02

一些进阶功能

调色板

cetcolor 和 RColorBrewer包为连续和离散的调色板提供了许多出色的选项。

代码语言:javascript复制
#两个颜色设置的例子 
heatmaply(
  percentize(mtcars),
  colors = heat.colors(100)
)
#
heatmaply(
  mtcars,
  scale_fill_gradient_fun = ggplot2::scale_fill_gradient2(
    low = "blue", 
    high = "red", 
    midpoint = 200, 
    limits = c(0, 500)
  )
)

自定义树状图

heatmaply 使用 seriation 包来找到行和列的最佳顺序。默认选项是“OLO”(最优叶排序)。另一种选择是“GW”(Gruvaeus 和 Wainer),它旨在实现相同的目标,但使用可能更快的启发式算法。“mean”给出了我们默认从其他包中的热图函数获得的输出,例如 gplots::heatmap.2。选项“none”为我们提供了树状图,没有任何基于数据矩阵的旋转。

代码语言:javascript复制
# The default of heatmaply:
heatmaply(
  percentize(mtcars)[1:10, ],
  seriate = "OLO"
  #seriate = "GW"
  #seriate = "mean"
  #seriate = "none"
)

使用 dendextend 自定义树状图

用户可以使用 Rowv 和 Colv 参数为热图的行/列提供自己的树状图:

代码语言:javascript复制
x  <- as.matrix(datasets::mtcars)
library("dendextend")
row_dend  <- x %>% 
  dist %>% 
  hclust %>% 
  as.dendrogram %>%
  set("branches_k_color", k = 3) %>% 
  set("branches_lwd", c(1, 3)) %>%
  ladderize

col_dend  <- x %>% 
  t %>% 
  dist %>% 
  hclust %>% 
  as.dendrogram %>%
  set("branches_k_color", k = 2) %>% 
  set("branches_lwd", c(1, 2)) %>%
  ladderize

heatmaply(
  percentize(x),
  Rowv = row_dend,
  Colv = col_dend
)

使用 RowSideColors 根据其他因素添加注释

代码语言:javascript复制
x  <- as.matrix(datasets::mtcars)
rc <- colorspace::rainbow_hcl(nrow(x))
library("gplots")
library("viridis")
heatmap.2(
  x,
  trace = "none",
  col = viridis(100),
  RowSideColors = rc,
  key = FALSE
)
代码语言:javascript复制
heatmaply(
  x[, -c(8, 9)],
  seriate = "mean",
  col_side_colors = c(rep(0, 5), rep(1, 4)),
  row_side_colors = x[, 8:9]
)

文本注释

heatmaply 的 cellnote 参数,可以显示覆盖在热图上的字符值。

代码语言:javascript复制
heatmaply(
  mtcars,
  cellnote = mtcars
)

将热图保存到文件中

由于我们的图片是交互式的,我们可以用以下代码将热图的交互式版本保存到 HTML 文件中:

代码语言:javascript复制
dir.create("folder")
heatmaply(mtcars, file = "folder/heatmaply_plot.html")
browseURL("folder/heatmaply_plot.html")

小编总结

作为诸多热图绘制R包中的一员,heatmaply可以绘制交互式的热图,其许多参数设置也和ggheatmap、pheatmap等常用的R包有联动,在色彩的美观度上也是非常优越,通过zoom in/zoom out也可以让我们方便的查看热图的细节,总的来说使用还是非常简单的,推荐给大家尝试!

END

0 人点赞