如何绘制带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
相关产品推荐
相关产品推荐

