【绘图】两两比较热图

Last updated on April 22, 2026 am

配置环境

1
conda install -n raincloud conda-forge::r-ggpubr conda-forge::r-pheatmap -y

使用示例

  • 加载依赖
1
2
3
4
5
6
7
8
require(ggplot2)
require(gghalves)
require(ggbeeswarm)
require(tidyverse)
require(RColorBrewer)
require(pheatmap)
options(repr.plot.width=6, repr.plot.height=12)
RColorBrewer::display.brewer.all(type = "all")
  • 读取数据
1
2
3
4
5
6
7
# 读入原始表格
data_original <- readr::read_tsv(na = '', locale = locale(encoding = 'GBK'), show_col_types = FALSE,
file = './data/5T_T1.tsv')
# 避免表头出现特殊字符
colnames(data_original) <- str_replace_all(colnames(data_original), pattern = '\\(| |-', replacement = '_')
colnames(data_original) <- str_replace_all(colnames(data_original), pattern = '\\)', replacement = '')
colnames(data_original) <- str_to_upper(colnames(data_original))
  • 选择数据
1
2
3
df  <- data_original
vars_row <- colnames(df)
vars_col <- colnames(df)
  • 相关性热图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
cor_mat <- cor(df[vars_row], df[vars_col], use = "pairwise.complete.obs", method = "pearson")
# 明确关心线性关系,且连续变量、异常值不明显:选 Pearson
# 只关心是否“越大越大/越大越小”(单调),或有异常值/偏态:选 Spearman
# 等级数据 + ties 多 / 样本偏小,或想更稳健的秩相关推断:选 Kendall

p_mat <- outer(vars_row, vars_col, Vectorize(function(r, c){
x <- df[[r]]; y <- df[[c]]
res <- cor.test(x, y, method = "pearson")
res$p.value
}))
diag(p_mat) <- NA # 屏蔽掉不必要的检验对p_adj的影响
p_adj <- matrix(p.adjust(as.vector(p_mat), method = "BH"),
nrow = nrow(p_mat), dimnames = dimnames(p_mat))

alpha <- 0.05
diag(cor_mat) <- NA
mark_x <- ifelse(!is.na(p_adj) & p_adj < alpha, formatC(cor_mat, digits = 2, format = "g"), "×")
diag(mark_x) <- ""

options(repr.plot.width=6, repr.plot.height=6)
max_abs <- max(abs(cor_mat), na.rm = TRUE)
pheatmap(
cor_mat,
cluster_rows = FALSE,
cluster_cols = FALSE,
main = "Correlation",
color = brewer.pal(9, "Reds"),
breaks = seq(0, max_abs, length.out = 9),
display_numbers = mark_x,
number_color = "black",
na_col = "transparent",
border_color = NA,
angle_col = 315
)

  • 两两比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 1) 均值差矩阵:mean(v_row - v_col)
diff_mat <- outer(vars_row, vars_col, Vectorize(function(r, c){
x <- df[[r]]; y <- df[[c]]
mean(x - y, na.rm = TRUE)
}))

rownames(diff_mat) <- vars_row
colnames(diff_mat) <- vars_col

# 2) 显著性:配对 t 检验 p 值矩阵
p_mat <- outer(vars_row, vars_col, Vectorize(function(r, c){
x <- df[[r]]; y <- df[[c]]
ok <- complete.cases(x, y)
if(sum(ok) < 2) return(NA_real_)
t.test(x[ok], y[ok], paired = TRUE)$p.value
}))

diag(p_mat) <- NA # 屏蔽掉不必要的检验对p_adj的影响
p_adj <- matrix(p.adjust(as.vector(p_mat), method = "BH"),
nrow = nrow(p_mat), dimnames = dimnames(p_mat))

alpha <- 0.05
diag(diff_mat) <- NA
mark_x <- ifelse(!is.na(p_adj) & p_adj < alpha, formatC(diff_mat, digits = 0, format = "f"), "×")
diag(mark_x) <- ""

options(repr.plot.width=6, repr.plot.height=6)
max_abs <- max(abs(diff_mat), na.rm = TRUE)
pheatmap(
diff_mat,
cluster_rows = FALSE,
cluster_cols = FALSE,
main = "Mean difference (row - col)",
color = colorRampPalette(rev(brewer.pal(11, "Spectral")))(101),
breaks = seq(-max_abs, max_abs, length.out = 101),
display_numbers = mark_x,
number_color = "black",
na_col = "transparent",
border_color = NA,
angle_col = 315
)


【绘图】两两比较热图
https://hexo.limour.top/pairwise-comparison-heatmap
Author
Limour
Posted on
April 22, 2026
Updated on
April 22, 2026
Licensed under