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

使用ComplexHeatmap为热图列注释柱状图添加abline失败求解决

ComplexHeatmap列注释柱状图添加水平线解决方案

直接调用abline()无法生效,因为ComplexHeatmap基于grid绘图系统,而非base绘图系统,需要通过anno_barplot()的post_fun参数来实现水平线添加。

修改后的完整代码

library(ComplexHeatmap)

# 定义校正p值向量
vector_pvalues_adj <- c(0.3778364, 0.0001000, 0.2122000, 0.4174714, 0.3778364, 0.4799250, 0.1613250, 0.4861000, 0.4174714, 0.1008000, 0.0141000, 0.4174714, 0.0001000, 0.0018000, 0.4861000, 0.4799250, 0.0001000, 0.0001000)

# 计算阈值对应的-log值
threshold <- -log(0.05)

# 定义绘图后添加水平线的函数
add_hline <- function(grob, data) {
  # 获取柱状图的绘图区域范围
  vp <- current.viewport()
  # 添加水平线
  grid.lines(x = c(0, 1), y = threshold, gp = gpar(col = "red", lty = 2))
}

# 创建带水平线的列注释
column_ha3 <- HeatmapAnnotation(
  "-log adj p-value" = anno_barplot(
    -log(vector_pvalues_adj),
    gp = gpar(fill = "red"),
    height = unit(20, "mm"),
    post_fun = add_hline  # 指定绘图后执行的函数
  )
)

# 测试绘制(可替换为你的热图代码)
Heatmap(matrix(rnorm(18*10), ncol=18), top_annotation = column_ha3)

关键说明

  • post_fun是anno_barplot()的内置参数,允许在柱状图绘制完成后执行自定义绘图操作
  • 使用grid系统的grid.lines()替代base系统的abline(),适配ComplexHeatmap的绘图环境
  • 通过current.viewport()获取当前注释的绘图区域,确保水平线位置准确

内容的提问来源于stack exchange,提问作者jonny jeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:20:32