pheatmap带你轻松绘制聚类相关性热图

2023-08-18 13:37:18 浏览数 (2)

欢迎关注R语言数据分析指南

❝最近有朋友询问如何使用「pheatmap」绘制相关性热图,小编之前已经写过各种ggplot2风格的热图,但是对于pheatmap却是很少涉及,这一节就来介绍一下「pheatmap绘制相关性热图」,希望各位观众老爷能够喜欢。 ❞

加载R包

代码语言:javascript复制
library(tidyverse)
library(psych)
library(pheatmap)
library(magrittr)
# devtools::install_github("thomasp85/scico")
library(scico)

导入数据

代码语言:javascript复制
# 读取环境数据文件并存储到env变量中,使用tab作为分隔符,第一列作为行名,不检查列名的合法性
env <- read.delim("env.xls", header = TRUE, sep = "t", row.names = 1, check.names = FALSE)

# 读取物种数据文件并存储到genus变量中,使用tab作为分隔符,第一列作为行名,不检查列名的合法性
genus <- read.delim("genus.xls", header = TRUE, sep = "t", row.names = 1, check.names = FALSE) %>%
  t() %>% as.data.frame()

相关性分析

代码语言:javascript复制
# 使用pearson方法计算环境数据和物种数据之间的相关系数和p-value,并进行多重比较法的FDR校正
pp <- corr.test(env, genus, method = "pearson", adjust = "fdr")
cor <- pp$r # 获取相关系数矩阵
pvalue <- pp$p # 获取p-value矩阵

数据整合

代码语言:javascript复制
# 将相关系数矩阵转换为长格式,并添加p-value和显著性符号列
df <- melt(cor) %>% 
  mutate(pvalue = melt(pvalue)[, 3],
         p_signif = symnum(pvalue, corr = FALSE, na = FALSE,  
                           cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), 
                           symbols = c("***", "**", "*", "", " "))) %>% 
  set_colnames(c("env", "genus", "r", "p", "p_signif"))

格式转换

❝由于后面我们需要使用pheatmap绘图,因此在此需要将长数据转换为宽表 ❞

代码语言:javascript复制
#将相关系数矩阵转换为宽格式,行名为环境变量,列名为物种,值为相关系数
rvalue <- df %>% 
  select(1, 2, 3) %>% 
  pivot_wider(names_from = "genus", values_from = r) %>% 
  column_to_rownames(var = "env")

# 将显著性符号矩阵转换为宽格式,行名为环境变量,列名为物种,值为显著性符号
pvalue <- df %>% 
  select(1, 2, 5) %>% 
  pivot_wider(names_from = "genus", values_from = p_signif) %>% 
  column_to_rownames(var = "env")

定义颜色

在此使用昨天介绍的「scico」包制作一个调色板

代码语言:javascript复制
mycol <- scico(100, palette = "vik")

pheatmap绘制热图

代码语言:javascript复制
# 绘制热图,显示相关系数,行列聚类,无边框,显示p-value作为数字,设置数字字体大小和颜色
# 设置主标题为空格,设置单元格宽度和高度,使用自定义颜色映射
pheatmap(rvalue, scale = "none", cluster_row = TRUE, cluster_col = TRUE, border = NA,
         display_numbers = pvalue, fontsize_number = 12, number_color = "white",
         main = " ",
         cellwidth = 21, cellheight = 20, color = mycol)

0 人点赞