百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

今天跟着我把热图学个遍,囊括所有需求

bigegpt 2024-08-26 11:03 2 浏览



用于绘制交互式和静态热图的R包和功能很多,包括:

  • heatmap()[R基本函数,统计数据包]:绘制一个简单的热图
  • heatmap.2()[ gplots R包]:与R base函数相比,绘制了增强的热图。
  • pheatmap()[ pheatmap R包]:绘制漂亮的热图,并提供更多控件来更改热图的外观。
  • d3heatmap()[ d3heatmap R包]:绘制交互式/可单击的热图
  • ComplexHeatmap R / Bioconductor的包]:绘制,注释和排列复杂热图(用于基因组数据分析是非常有用的)

在这里,我们从描述绘制热图的5 R函数开始。接下来,我们将重点介绍ComplexHeatmap程序包,该程序包提供了一种灵活的解决方案来安排和注释多个热图。它也可以可视化来自不同来源的不同数据之间的关联

我们使用mtcars数据作为演示数据集。我们首先将数据标准化以使变量具有可比性:

df <- scale(mtcars)
# Default plot
heatmap(df, scale = "none")

如何指定调色板

col<- colorRampPalette(c("red", "white", "blue"))(256)
heatmap(df, scale = "none", col =  col)
library("RColorBrewer")
col <- colorRampPalette(brewer.pal(10, "RdYlBu"))(256)
heatmap(df, scale = "none", col =  col)

此外,可以使用参数RowSideColors和ColSideColors分别注释行和列。

例如,在下面的R代码中,将自定义热图,如下所示:

  • RColorBrewer调色板名称用于更改外观
  • 参数RowSideColors和ColSideColors分别用于注释行和列。按照行列顺序指指定颜色

heatmap是按照聚类来重排行列的,会打乱颜色。

# Use RColorBrewer color palette names
library("RColorBrewer")
col <- colorRampPalette(brewer.pal(10, "RdYlBu"))(256)
heatmap(df, scale = "none", col =  col,
        RowSideColors = rep(c("blue", "pink"), each = 16),
        ColSideColors = c(rep("purple", 5), rep("orange", 6)))
# install.packages("gplots")
library("gplots")
heatmap.2(df, scale = "none", col = bluered(100),
          trace = "none", density.info = "none")

pheatmap

这个功能十分强大,出图我们也经常选用,cutree_rows参数用于按照聚类结果进行切割。

library("pheatmap")
pheatmap(df, cutree_rows = 4)
# install.packages("d3heatmap")
library("d3heatmap")
d3heatmap(scale(mtcars), colors = "RdYlBu",
          k_row = 4, # Number of groups in rows
          k_col = 2 # Number of groups in columns
          )


pheatmap不能使用。

ComplexHeatmap 功能十分强大

  • row_names_gp:设置标签自字体大小
  • olumn_title:设置行,列名称标签。
library(ComplexHeatmap)
Heatmap(df,
        name = "mtcars", #title of legend
        column_title = "Variables", row_title = "Samples",
        row_names_gp = gpar(fontsize = 7) # Text size for row names
        )

要指定自定义颜色,必须使用colorRamp2()函数[ circlize package],如下所示:

library(circlize)
mycols <- colorRamp2(breaks = c(-2, 0, 2),
                    colors = c("green", "white", "red"))
Heatmap(df, name = "mtcars", col = mycols)

更换调色板,使用RColorBrewer 中的颜色。

library("circlize")
library("RColorBrewer")
Heatmap(df, name = "mtcars",
        col = colorRamp2(c(-2, 0, 2), brewer.pal(n=3, name="RdBu")))

dendextend 同样给复杂热图聚类上色。

library(dendextend)
row_dend = hclust(dist(df)) # row clustering
col_dend = hclust(dist(t(df))) # column clustering
Heatmap(df, name = "mtcars",
        row_names_gp = gpar(fontsize = 6.5),
        cluster_rows = color_branches(row_dend, k = 4),
        cluster_columns = color_branches(col_dend, k = 2))

复杂热图按照聚类切割分块

km/row_km:对列进行聚类拆分

# Divide into 2 groups
set.seed(2)
Heatmap(df, name = "mtcars", km = 4)

按照行进行分割聚类:column_km

# Divide into 2 groups
set.seed(2)
Heatmap(df, name = "mtcars", column_km = 4)

指定行列分隔

split :参数用于指定行的分组,用于分割热图。row_split一样

如果要对行进行聚类,使用column_split,用法一样。

# Split
# data.frame(cyl = rep(1:4,dim(mtcars)[2]))
Heatmap(df, name ="mtcars",
        split = data.frame(cyl = mtcars$cyl),
        column_split = data.frame(cyl = rep(1:2,dim(mtcars)[2])[1:11]),
        row_names_gp = gpar(fontsize = 7))

多重分隔

Heatmap(df, name ="mtcars", col = col,
        km = 4, split =  mtcars$cyl)
library("cluster")
set.seed(2)
pa = pam(df, k = 3)
Heatmap(df, name = "mtcars", col = col,
        split = paste0("pam", pa$clustering))

复杂热图为什么复杂

复杂热图最强大的莫过于对于热图的注释

df <- t(df)
# Define some graphics to display the distribution of columns
.hist = anno_histogram(df, gp = gpar(fill = "lightblue"))
.density = anno_density(df, type = "line", gp = gpar(col = "blue"))
ha_mix_top = HeatmapAnnotation(hist = .hist, density = .density)
# Define some graphics to display the distribution of rows
.violin = anno_density(df, type = "violin",
                       gp = gpar(fill = "lightblue"), which = "row")
.boxplot = anno_boxplot(df, which = "row")
ha_mix_right = HeatmapAnnotation(violin = .violin, bxplt = .boxplot,
                              which = "row", width = unit(4, "cm"))
# Combine annotation with heatmap
Heatmap(df, name = "mtcars",
        column_names_gp = gpar(fontsize = 8),
        top_annotation = ha_mix_top) + ha_mix_right

复杂热图的组合

# Heatmap 1
ht1 = Heatmap(df, name = "ht1", km = 2,
              column_names_gp = gpar(fontsize = 9))
# Heatmap 2
ht2 = Heatmap(df, name = "ht2",
        col = circlize::colorRamp2(c(-2, 0, 2), c("green", "white", "red")),
        column_names_gp = gpar(fontsize = 9))
# Combine the two heatmaps
ht1 + ht2

细布控制组合

draw(ht1 + ht2,
    row_title = "Two heatmaps, row title",
    row_title_gp = gpar(col = "red"),
    column_title = "Two heatmaps, column title",
    column_title_side = "bottom",
    # Gap between heatmaps
    gap = unit(0.5, "cm"))
expr <- readRDS(paste0(system.file(package = "ComplexHeatmap"),
                      "/extdata/gene_expression.rds"))
mat <- as.matrix(expr[, grep("cell", colnames(expr))])
type <- gsub("s\\d+_", "", colnames(mat))
ha = HeatmapAnnotation(df = data.frame(type = type))
ha
## A HeatmapAnnotation object with 1 annotation
##   name: heatmap_annotation_2
##   position: column
##   items: 24
##   width: 1npc
##   height: 5mm
##   this object is subsetable
##   9.001mm extension on the right
##
##  name annotation_type color_mapping height
##  type discrete vector        random    5mm
Heatmap(mat, name = "expression", km = 5, top_annotation = ha,
    # top_annotation_height = unit(4, "mm"),
    show_row_names = FALSE, show_column_names = FALSE) +
Heatmap(expr$length, name = "length", width = unit(5, "mm"),
    col = circlize::colorRamp2(c(0, 100000), c("white", "orange"))) +
Heatmap(expr$type, name = "type", width = unit(5, "mm")) +
Heatmap(expr$chr, name = "chr", width = unit(5, "mm"),
    col = circlize::rand_color(length(unique(expr$chr))))
ha = HeatmapAnnotation(df = data.frame(type = type))
ha
## A HeatmapAnnotation object with 1 annotation
##   name: heatmap_annotation_3
##   position: column
##   items: 24
##   width: 1npc
##   height: 5mm
##   this object is subsetable
##   9.001mm extension on the right
##
##  name annotation_type color_mapping height
##  type discrete vector        random    5mm
Heatmap(mat, name = "expression", km = 5, top_annotation = ha,
    # top_annotation_height = unit(4, "mm"),
    show_row_names = FALSE, show_column_names = FALSE) +
  Heatmap(expr$type, name = "type", width = unit(5, "mm")) +
  Heatmap(expr$type, name = "type", width = unit(5, "mm"))

如何添加多个行,或者列

# Annotation data frame
annot_df <- data.frame(cyl = mtcars$cyl, am = mtcars$am,
                       mpg = mtcars$mpg)
# row.names(annot_df) = row.names(mtcars)
# Define colors for each levels of qualitative variables
# Define gradient color for continuous variable (mpg)
col = list(cyl = c("4" = "green", "6" = "gray", "8" = "darkred"),
            am = c("0" = "yellow", "1" = "orange"),
            mpg = circlize::colorRamp2(c(17, 25),
                                       c("lightblue", "purple")) )
# Create the heatmap annotation
ha <- HeatmapAnnotation(df = data.frame(cyl = mtcars$cyl, am = mtcars$am,
                       mpg = mtcars$mpg), col = col)
# Combine the heatmap and the annotation
# df = t(df)
Heatmap(df, name = "mtcars",
        top_annotation = ha)
# Annotation data frame
annot_df <- data.frame(cyl = mtcars$cyl, am = mtcars$am,
                       mpg = mtcars$mpg)
# row.names(annot_df) = row.names(mtcars)
# Define colors for each levels of qualitative variables
# Define gradient color for continuous variable (mpg)
col = list(cyl = c("4" = "green", "6" = "gray", "8" = "darkred"),
            am = c("0" = "yellow", "1" = "orange"),
            mpg = circlize::colorRamp2(c(17, 25),
                                       c("lightblue", "purple")) )
# Create the heatmap annotation
ha <- HeatmapAnnotation(df = data.frame(cyl = mtcars$cyl, am = mtcars$am,
                       mpg = mtcars$mpg), col = col)
# Combine the heatmap and the annotation
df = t(df)
Heatmap(df, name = "mtcars") +
   Heatmap(mtcars$mpg, name = "type", width = unit(5, "mm")) +
  Heatmap(mtcars$mpg, name = "type", width = unit(5, "mm"))
Heatmap(df, name = "mtcars") +
   Heatmap(annot_df , name = "type", width = unit(5, "mm"))
densityHeatmap(scale(mtcars))

reference

https://www.datanovia.com/en/lessons/heatmap-in-r-static-and-interactive-visualization/

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...