导语
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