You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制带p值的FST距离矩阵三角热图(p值0显示白色)

三角热图绘制:FST矩阵下三角+上三角p值可视化需求

我需要为FST距离矩阵绘制三角热图:下三角为FST值,上三角为对应p值,矩阵数据如下:

NWAtl   CIV SEN MRT MOR PRT ESP PAL LG  JN  TUN MLT MR  AEG
NWAtl   0   0   0   0   0   0,00098 0,00586 0,01953 0,01465 0,01855 0,00391 0,05078 0,00684 0
CIV 0,58701 0   0,24805 0,0625  0,00391 0   0   0   0   0   0   0   0,00195 0
SEN 0,46143 0,00365 0   0,68555 0,11523 0   0   0   0   0   0,00195 0   0,01953 0,01562
MRT 0,40702 0,02014 0,0000  0   0,34766 0   0   0   0   0,00391 0,00293 0   0,09082 0,05078
MOR 0,34654 0,05744 0,01748 0,00000 0   0,00098 0   0   0,00293 0,02734 0,03223 0,00098 0,17285 0,08496
PRT 0,14366 0,25279 0,16592 0,13095 0,07964 0   0,76855 0,0791  0,14648 0,20605 0,33594 0,13574 0,05664 0,00098
ESP 0,13075 0,26191 0,18752 0,15328 0,10177 0,00000 0   0,08398 0,10156 0,13281 0,13672 0,20117 0,02246 0
PAL 0,10058 0,36823 0,26087 0,21078 0,14975 0,02033 0,01352 0   0,32031 0,10938 0,06738 0,37109 0,02441 0
LG  0,13747 0,29423 0,19685 0,14836 0,09261 0,01159 0,01123 0,00027 0   0,55372 0,3291  0,10156 0,13184 0
JN  0,15804 0,25805 0,15377 0,10518 0,05754 0,0118  0,01614 0,01900 0,00000 0   0,42383 0,05371 0,31348 0,03906
TUN 0,18355 0,21649 0,12779 0,08634 0,03648 0,00129 0,01209 0,02700 0,00059 0   0   0,0459  0,18848 0,01465
MLT 0,0823  0,46264 0,33675 0,28355 0,2103  0,01988 0,00747 0,00000 0,02690 0,05412 0,05474 0   0,01562 0
MR  0,24169 0,16147 0,08179 0,04301 0,01424 0,05481 0,06864 0,08095 0,02960 0,00000 0,01714 0,14447 0   0,35547
AEG 0,35912 0,0965  0,0552  0,03027 0,01964 0,11375 0,13098 0,16291 0,10019 0,05367 0,06768 0,24109 0,00000 0

我尝试了以下R代码,但没达到预期效果:

library(readxl)
library(ggplot2)
library(reshape2)
library(stats)
library(Hmisc)
library(RColorBrewer)
###############################################################################
heatmap<-subset(heatmap, select = -1)
rownames(heatmap)<-c("NWAtl","CIV","SEN","MRT","MOR","PRT","ESP","PAL","LG",
                       "JN","TUN","MLT","MR","AEG")
heatmap(as.matrix(heatmap))

具体需求

  • 绘制三角热图:下三角展示FST值,上三角展示p值
  • p值采用浅绿色系配色
  • p值为0时显示白色,而非空白

解决方案

步骤1:数据预处理

先统一数值格式,拆分出下三角FST和上三角p值:

# 读取并格式化数据
data_text <- "    NWAtl   CIV SEN MRT MOR PRT ESP PAL LG  JN  TUN MLT MR  AEG
NWAtl   0   0   0   0   0   0,00098 0,00586 0,01953 0,01465 0,01855 0,00391 0,05078 0,00684 0
CIV 0,58701 0   0,24805 0,0625  0,00391 0   0   0   0   0   0   0   0,00195 0
SEN 0,46143 0,00365 0   0,68555 0,11523 0   0   0   0   0   0,00195 0   0,01953 0,01562
MRT 0,40702 0,02014 0,0000  0   0,34766 0   0   0   0   0,00391 0,00293 0   0,09082 0,05078
MOR 0,34654 0,05744 0,01748 0,00000 0   0,00098 0   0   0,00293 0,02734 0,03223 0,00098 0,17285 0,08496
PRT 0,14366 0,25279 0,16592 0,13095 0,07964 0   0,76855 0,0791  0,14648 0,20605 0,33594 0,13574 0,05664 0,00098
ESP 0,13075 0,26191 0,18752 0,15328 0,10177 0,00000 0   0,08398 0,10156 0,13281 0,13672 0,20117 0,02246 0
PAL 0,10058 0,36823 0,26087 0,21078 0,14975 0,02033 0,01352 0   0,32031 0,10938 0,06738 0,37109 0,02441 0
LG  0,13747 0,29423 0,19685 0,14836 0,09261 0,01159 0,01123 0,00027 0   0,55372 0,3291  0,10156 0,13184 0
JN  0,15804 0,25805 0,15377 0,10518 0,05754 0,0118  0,01614 0,01900 0,00000 0   0,42383 0,05371 0,31348 0,03906
TUN 0,18355 0,21649 0,12779 0,08634 0,03648 0,00129 0,01209 0,02700 0,00059 0   0   0,0459  0,18848 0,01465
MLT 0,0823  0,46264 0,33675 0,28355 0,2103  0,01988 0,00747 0,00000 0,02690 0,05412 0,05474 0   0,01562 0
MR  0,24169 0,16147 0,08179 0,04301 0,01424 0,05481 0,06864 0,08095 0,02960 0,00000 0,01714 0,14447 0   0,35547
AEG 0,35912 0,0965  0,0552  0,03027 0,01964 0,11375 0,13098 0,16291 0,10019 0,05367 0,06768 0,24109 0,00000 0"

# 替换逗号为小数点,转为矩阵
data_mat <- as.matrix(read.table(text = gsub(",", ".", data_text), header = TRUE, row.names = 1))

# 拆分FST和p值矩阵
fst_mat <- data_mat
p_mat <- data_mat

# 保留下三角FST,其余设为NA
fst_mat[upper.tri(fst_mat)] <- NA
diag(fst_mat) <- NA

# 保留上三角p值,其余设为NA
p_mat[lower.tri(p_mat)] <- NA
diag(p_mat) <- NA

# 转为长格式用于ggplot
library(reshape2)
fst_melted <- melt(fst_mat, na.rm = TRUE, value.name = "FST")
p_melted <- melt(p_mat, na.rm = TRUE, value.name = "p_value")

步骤2:绘制三角热图

用ggplot2分别渲染两个三角区域,自定义配色满足需求:

library(ggplot2)
library(scales)
library(RColorBrewer)

# 定义配色:FST用红棕色系,p值加入白色对应0值的浅绿色系
fst_cols <- brewer.pal(9, "Reds")
p_cols <- c("white", brewer.pal(9, "Greens"))

ggplot() +
  # 绘制下三角FST
  geom_tile(data = fst_melted, aes(x = Var1, y = Var2, fill = FST)) +
  # 绘制上三角p值
  geom_tile(data = p_melted, aes(x = Var1, y = Var2, fill = p_value)) +
  # 整合配色刻度,NA值设为透明
  scale_fill_gradientn(
    colors = c(fst_cols, p_cols),
    values = rescale(c(range(fst_melted$FST), 0, range(p_melted$p_value))),
    na.value = "transparent",
    name = "Value"
  ) +
  # 调整坐标轴顺序,让三角布局对齐
  scale_x_discrete(limits = rownames(data_mat)) +
  scale_y_discrete(limits = rev(rownames(data_mat))) +
  # 优化主题样式
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid = element_blank(),
    legend.position = "right"
  ) +
  labs(x = "", y = "")

关键说明

  • 拆分矩阵确保下三角和上三角各自只显示对应数据
  • p值配色中加入白色对应0值,通过scale_fill_gradientn统一两个系列的颜色映射
  • 反转y轴让三角热图布局符合常规展示逻辑

内容的提问来源于stack exchange,提问作者David Bartrès

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:24:56