1 准备工作
- 新建一个文件夹,作为工作目录,用来存放脚本文件及所需的其他资源。
- 在工作目录中放入如下内容:
- 包含中文字符的字体文件,
.ttf格式,用来让图像正常显示中文。(本案例中为myfont.ttf) - 数据文件,
.csv格式,每一列为一个参数,不要包含其他数据。(本案例中为mydata.csv) - R 脚本文件,代码在第 2 节给出。(本案例中为
heatplot.R)
- 包含中文字符的字体文件,
- 安装如下 R 程序包:
ggplot2reshape2dplyrshowtext
可进入 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
注意:数据文件中只能包含参与相关性分析的数据,包含其余信息的列(如样品名称、样品编号等)不要放进来。
执行上述脚本,可得到如下输出:

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