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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:47:51