使用R语言绘制相关性热力图

1 准备工作

  1. 新建一个文件夹,作为工作目录,用来存放脚本文件及所需的其他资源。
  2. 在工作目录中放入如下内容:
    • 包含中文字符的字体文件,.ttf 格式,用来让图像正常显示中文。(本案例中为 myfont.ttf
    • 数据文件,.csv 格式,每一列为一个参数,不要包含其他数据。(本案例中为 mydata.csv
    • R 脚本文件,代码在第 2 节给出。(本案例中为 heatplot.R
  3. 安装如下 R 程序包:
    • ggplot2
    • reshape2
    • dplyr
    • showtext

可进入 R shell,执行如下命令安装上述程序包:

install.packages("ggplot2", "reshape2", "dplyr", "showtext")

2 编写脚本

将如下代码保存为 heatplot.R,放到工作目录中。

#!/usr/bin/Rscript

# 加载必要的包
library(ggplot2)
library(reshape2)
library(dplyr)
library(showtext)

# 加载中文字体
font_add("myfont", "myfont.ttf")  # 请将字体文件与本脚本放在一起
showtext_auto()

# 读取数据
data <- read.csv("mydata.csv")

# 计算相关系数和p值
cor_matrix <- cor(data, use = "complete.obs")
n <- nrow(na.omit(data))

# 计算p值矩阵
p_matrix <- matrix(0, nrow = ncol(data), ncol = ncol(data))
for (i in 1:ncol(data)) {
  for (j in 1:ncol(data)) {
    if (i != j) {
      cor_test <- cor.test(data[, i], data[, j], use = "complete.obs")
      p_matrix[i, j] <- cor_test$p.value
    } else {
      p_matrix[i, j] <- NA
    }
  }
}

# 创建显著性标记矩阵
signif_matrix <- matrix("", nrow = ncol(data), ncol = ncol(data))
for (i in 1:ncol(data)) {
  for (j in 1:ncol(data)) {
    if (!is.na(p_matrix[i, j])) {
      if (p_matrix[i, j] < 0.001) {
        signif_matrix[i, j] <- "***"
      } else if (p_matrix[i, j] < 0.01) {
        signif_matrix[i, j] <- "**"
      } else if (p_matrix[i, j] < 0.05) {
        signif_matrix[i, j] <- "*"
      } else {
        signif_matrix[i, j] <- ""
      }
    }
  }
}

# 将矩阵转换为长格式用于ggplot
cor_melted <- melt(cor_matrix)
p_melted <- melt(p_matrix)
signif_melted <- melt(signif_matrix)

# 合并数据
plot_data <- data.frame(
  Var1 = cor_melted$Var1,
  Var2 = cor_melted$Var2,
  correlation = round(cor_melted$value, 3),
  significance = signif_melted$value
)

# 创建显示文本:相关系数和显著性标记分两行显示
plot_data$label <- ifelse(
  is.na(plot_data$correlation),
  "",
  paste0(plot_data$correlation, "\n", plot_data$significance)
)

# 设置变量的因子水平,保持原始顺序
var_levels <- colnames(data)
plot_data$Var1 <- factor(plot_data$Var1, levels = var_levels)
plot_data$Var2 <- factor(plot_data$Var2, levels = rev(var_levels))  # y轴反转顺序

# 只保留对角线下方的数据(隐藏对角线上方)
plot_data <- plot_data %>%
  mutate(
    row_num = as.numeric(Var1),
    col_num = as.numeric(Var2)
  ) %>%
  filter(row_num + col_num <= length(var_levels) + 1)  # 只保留对角线及以下部分

# 绘制热力图
p <- ggplot(plot_data, aes(x = Var1, y = Var2, fill = correlation)) +
  geom_tile(color = "white") +
  geom_text(aes(label = label), size = 3, color = "black") + # 设置显著性标记、相关系数字体大小
  scale_fill_distiller(
    palette = "RdBu",
    limits = c(-1, 1),
    name = "Correlation"
  ) +
  scale_x_discrete(limits = var_levels) +  # x轴保持原始顺序(从左到右)
  scale_y_discrete(limits = rev(var_levels)) +  # y轴反转顺序(从上到下)
  labs(x = "", y = "", title = "") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 9), # x轴标签字体大小
    axis.text.y = element_text(size = 9), # y轴标签字体大小
    panel.grid = element_blank(),
    plot.title = element_text(hjust = 0.5, size = 0),  # 标题字体大小
    legend.text = element_text(size = 9),  # 图例文字大小
    legend.title = element_text(size = 9)  # 图例标题大小
  ) +
  coord_fixed()

  pdf("correlation_heatmap.pdf", width = 4, height = 4) # 设置输出图像的尺寸,单位为英寸。
  print(p)

上述代码中,如下内容可根据您的实际需要进行修改:

  • 第 10 行 font_add("myfont", "myfont.ttf")myfont.ttf 是我们准备好的中文字体的名称。如果您使用了其他字体请注意修改。
  • 第 14 行 data <- read.csv("mydata.csv")mydata.csv 是数据文件的名称。请注意根据实际情况进行修改。
  • 第 89 行 palette = "RdBu"RdBu 是绘图时使用的颜色主题。如果想使用其他颜色主题,请参照本文选择:http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/
  • 第 95 行 labs(x = "", y = "", title = ""),是设置 x 轴、y 轴及图像标题。若不需要标题请将相关参数留空。
  • 第 107 行 pdf("correlation_heatmap.pdf", width = 4, height = 4) width = 4, height = 4 为设置输出图像的尺寸,单位为英寸。建议大家多次尝试,寻找适当的大小。correlation_heatmap.pdf 是输出的图表文件的名称。大家可根据实际需求调整。

3 执行脚本

准备好上述文件后,运行脚本,即可在工作目录中得到文件 Rplots.pdf,此即得到的绘图文件。

如需其他格式的图片(如矢量图 .svg.emf 或位图 .png),请使用 Inkscape 等工具转换。

4 示例

这里我们给出一组示例数据 mydata.csv

黏土,粉砂,砂,TOC
29.49,69.46,1.05,7.164
32.45,67.14,0.41,7.767
......
27.44,71.3,1.26,6.449
24.38,73.21,2.41,6.376

这组数据包含 4 列,分别代表:

  • 黏土:样品中黏土的含量,单位为 %
  • 粉砂:样品中粉砂的含量,单位为 %
  • 砂:样品中砂的含量,单位为 %
  • TOC:样品中总有机碳的含量,单位为 mg-C/g

注意:数据文件中只能包含参与相关性分析的数据,包含其余信息的列(如样品名称、样品编号等)不要放进来。

执行上述脚本,可得到如下输出:

000.png

图中,

  • 色块上的数字是两个变量之间的皮尔逊相关系数,表示的是两个变量间 线性 相关性的大小[1]
    • 越接近 +1,色块红色越深,代表两个变量之间的正相关性越强。
    • 越接近 -1,色块蓝色越深,代表两个变量之间的负相关性越强。
    • 越接近 0,色块颜色越浅,代表两个变量之间的相关性越小。
  • 色块上的星号数量,表明两个变量之间相关关系的显著性[2]
    • ***:p<0.001,相关关系非常显著
    • **:0.001<p≤0.01,相关关系比较显著
    • *:0.01<p≤0.05,有一定的显著性
    • 没有星号:两个变量之间的相关性不显著

  1. 如果两个变量之间是非线性的关系,比如指数关系、对数关系等,可能无法用这种相关系数很好地反映出来。 ↩︎

  2. 一般而言,看相关性热力图时要先看显著性。如果没有显著性,也没必要继续看相关系数大不大。 ↩︎

1 个赞