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

ComplexHeatmap使用anno_mark时行标注溢出热图的问题咨询

ComplexHeatmap anno_mark标注溢出热图范围的解决办法

我用ComplexHeatmap绘制聚类标记基因热图,因为基因数量太多,只想展示特定基因,所以用rowAnnotation里的anno_mark()来实现。但要展示的基因还是不少,导致行标注直接溢出热图范围了。

我已经试了下面这些操作,但都没解决问题:

  • 调小行标注的字体大小,只是文本变小了,标注还是溢出
  • 添加extend = unit(0, "mm")参数,没效果
  • 给anno_mark加link_height = unit(0, "mm"),输出完全没变化

我的代码如下:

nlmegadegmat <- nlmeganoNA.small@assays$RNA@scale.data[nlmega.markers_res0.8$gene, ]

nlmeglevel <- unique(nlmeganoNA$RNA_snn_res.0.8) %>% sort()

cluster_anno <- factor(nlmeganoNA.small$RNA_snn_res.0.8, levels = nlmeglevel)

myCol <- colorRampPalette(c('dodgerblue', 'black', 'yellow'))(50)
myBreaks <- seq(-2, 2, length.out = 50)

nlmegShowGenes <- nlmega.markers_res0.8$gene[c(1,2,3,11,12,14,16,22,25,28,32,36,37,40,
41,44,47,51,52,53,61,63,65,69,71,72,74,81,82,86,90,91,95,96,99,101,102,104,111,113,114,
118,121,124,131,132,134,137,141,143,144,150,151,156,158,161,163,166,167,168,171,173,181,
183,186,191,192,195,202,203,209,211,213,218,219,225,227,240,241,244,248,251,254,259,265,
267,271,273,275)]

nlmegHAright = rowAnnotation(foo = anno_mark(at = which(rownames(nlmegadegmat) %in% nlmegShowGenes),
                                     labels = rownames(nlmegadegmat[rownames(nlmegadegmat)%in%nlmegShowGenes],
                                     labels_gp = gpar(fontsize=2),
                                     extend = unit(0, "mm"),
                                     link_height = link_width))

Heatmap(nlmegadegmat, name = "Expression",  
        column_split = cluster_anno,
        cluster_columns = FALSE,
        show_column_dend = FALSE,
        cluster_column_slices = TRUE,
        column_title_gp = gpar(fontsize = 8),
        column_gap = unit(0.5, "mm"),
        cluster_rows = FALSE,
        show_row_dend = FALSE,
        col = colorRamp2(myBreaks, myCol),
        row_names_gp = gpar(fontsize = 6),
        column_title_rot = 90,
        top_annotation = HeatmapAnnotation(foo = anno_block(gp = gpar(fill = scales::hue_pal()(28)))),
        right_annotation = nlmegHAright,
        show_column_names = FALSE,
        use_raster = TRUE)

当前输出效果:

当前热图输出


解决方法

1. 先修正代码里的语法错误

你代码里anno_mark的labels参数有括号不闭合的问题,而且link_height用了未定义的link_width,先把这个改了:

nlmegHAright = rowAnnotation(foo = anno_mark(
  at = which(rownames(nlmegadegmat) %in% nlmegShowGenes),
  # 修正索引方式,闭合括号
  labels = rownames(nlmegadegmat)[rownames(nlmegadegmat) %in% nlmegShowGenes],
  labels_gp = gpar(fontsize=2),
  extend = unit(0, "mm"),
  # 替换成具体的单位值
  link_height = unit(0.5, "mm"),
  # 手动指定标注区域的宽度,给基因名留出空间
  width = unit(8, "cm")
))

2. 调整标注布局与空间

  • 增加标注区域宽度:用上面的width参数,根据你要展示的基因数量调整,比如基因多就设成unit(10, "cm")
  • 换标注位置:如果右侧空间不够,把标注移到左侧,用side = "left"参数:
    anno_mark(at = ..., labels = ..., side = "left", width = unit(8, "cm"))
    
  • 垂直排列标注:把基因名竖起来,节省水平空间,加labels_rot = 90:
    anno_mark(at = ..., labels = ..., labels_rot = 90, labels_gp = gpar(fontsize=3))
    

3. 调整整体热图尺寸

绘制热图时,手动指定热图的宽高,确保整体布局有足够空间容纳标注:

Heatmap(nlmegadegmat, name = "Expression",  
        # 其他参数不变...
        heatmap_width = unit(15, "cm"),
        heatmap_height = unit(20, "cm"),
        right_annotation = nlmegHAright)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:45:29