如何在R中用pheatmap绘制热图并添加边缘框后通过ggsave保存?
在pheatmap热图边缘添加框并通过ggsave保存的解决方案
你之前的代码失败核心原因是:pheatmap基于grid绘图系统,而plot()和rect()属于base绘图系统,两者的绘图环境完全独立,叠加的矩形框并没有和热图处于同一个绘图上下文,因此ggsave()只会保存pheatmap生成的对象,不会包含base系统绘制的框。
以下是两种可行的解决方案:
方案1:修改pheatmap的gtable对象(推荐)
这种方法直接在pheatmap生成的gtable结构中添加矩形框,确保框和热图绑定在一起,后续用ggsave()可以直接保存完整内容:
library(pheatmap) library(grid) library(gtable) # 生成测试数据 mat <- matrix(rnorm(100, 0, 1), 10, 10) # 绘制热图并获取gtable对象 p <- pheatmap(mat, cluster_rows = FALSE, cluster_cols = FALSE, cellwidth = 20, cellheight = 15) # 定位热图在gtable中的核心区域 heatmap_idx <- which(sapply(p$gtable$grobs, function(g) g$name == "matrix")) heatmap_grob <- p$gtable$grobs[[heatmap_idx]] # 获取热图在gtable中的布局位置 heatmap_pos <- list( t = heatmap_grob$vp$layout.pos.row, l = heatmap_grob$vp$layout.pos.col, b = heatmap_grob$vp$layout.pos.row, r = heatmap_grob$vp$layout.pos.col ) # 创建矩形框grob,自定义边框样式 rect_grob <- rectGrob( gp = gpar(lwd = 2, col = "black", fill = NA), # lwd为线宽,col为边框颜色 width = heatmap_grob$width, height = heatmap_grob$height ) # 将矩形框添加到gtable的热图区域上方 p$gtable <- gtable_add_grob( x = p$gtable, grobs = rect_grob, t = heatmap_pos$t, l = heatmap_pos$l, b = heatmap_pos$b, r = heatmap_pos$r ) # 保存带框的热图 ggsave( plot = p, filename = paste0("test_", format(Sys.Date(), "%m_%d"), ".pdf"), width = 6, height = 6, dpi = 1200 )
方案2:在同一绘图设备中叠加绘制
这种方法先打开一个绘图设备,依次绘制热图和矩形框,最后关闭设备完成保存,适合快速调试:
library(pheatmap) library(grid) # 生成测试数据 mat <- matrix(rnorm(100, 0, 1), 10, 10) # 打开pdf设备 pdf( file = paste0("test_", format(Sys.Date(), "%m_%d"), ".pdf"), width = 6, height = 6 ) # 绘制热图 pheatmap(mat, cluster_rows = FALSE, cluster_cols = FALSE, cellwidth = 20, cellheight = 15) # 添加矩形框,坐标基于grid的npc系统(0-1对应绘图区域百分比) grid.rect( x = 0.5, y = 0.5, # 框的中心位置 width = 0.8, height = 0.8, # 框的大小,可根据实际热图调整 gp = gpar(lwd = 2, col = "black", fill = NA) ) # 关闭设备,完成保存 dev.off()
关键说明
- 两种方案都使用grid系统的函数添加矩形框,确保和pheatmap的绘图环境兼容;
- 方案1的优势是框和热图的位置完全绑定,不会因为绘图尺寸变化导致框错位;
- 可通过修改
gpar()中的参数自定义框的样式,比如linetype(线型)、alpha(透明度)等。
内容的提问来源于stack exchange,提问作者Charité Learner
相关产品推荐
相关产品推荐

