使用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
相关产品推荐
相关产品推荐

