我正在探索 R 来分析我的基因表达数据。
我可以使用该pheatmap包创建一个漂亮的热图。但是,在不同颜色的框之间转换时,它会自动引入边框颜色,我在放大后可以看到该边框颜色。尽管添加了属性 ,但还是如此border_color = "NA"。是否可以获得连续变化的热图?谢谢。
我的代码:
pheatmapM <-pheatmap(datExprM, border_color = "NA", breaks = NULL, color = colorRampPalette(c("navy", "black", "yellow"))(50), cluster_rows = TRUE, cluster_cols = TRUE, scale = "row")
Run Code Online (Sandbox Code Playgroud)
正如您在下面看到的(缩放后),相邻的框由较浅的颜色分隔。
您可以单独编辑每个单元格的边框颜色,这可以用来解决这个问题。确切的解决方案将取决于pheatmap对象的确切组成。
首先,获取存储在热图中的 grobs(图形对象)的名称。您需要抓住与热图的各个矩形(单元格)相对应的矩形。对我来说,这是第一堂课gTree,但请尝试看看哪一个适合您。这就是我提取 grob 名称的方法:
grob_classes <- purrr::map(pheatmapM$gtable$grobs, class)
idx_grob <- which(purrr::map_lgl(grob_classes, function(cl) 'gTree' %in% cl))[1]
Run Code Online (Sandbox Code Playgroud)
接下来,我们需要找到一个矩形 grob,它是gTree我们刚刚找到的 grob 的子级,如下所示:
grob_names <- names(pheatmapM$gtable$grobs[[idx_grob]]$children)
idx_rect <- grob_names[grep('rect', grob_names)][1]
Run Code Online (Sandbox Code Playgroud)
现在,您可以从这个嵌套的 grob 中提取图形参数:(fill确定每个单元格的实际填充颜色)和col(确定边框颜色)。默认情况下,col是单个值,而fill是十六进制代码矩阵。当我替换col为存储在中的内容时fill,就像这样......
pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$col <- pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$fill
Run Code Online (Sandbox Code Playgroud)
...这相当于消除边框,因为它现在与填充颜色相同。为了进一步确保单元格之间不留间隙,还应增加边界厚度。
pheatmapM$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$lwd <- 3
Run Code Online (Sandbox Code Playgroud)
据我估计,识别正确的idx_grob或idx_rect特定的 .可能会出现潜在的问题pheatmap。因此,我提供了一个可重现的示例(在macOS 上R 4.0.3运行pheatmap 1.0.12),它可以实现所需的结果(没有边框,单元格之间也没有间隙),您可以使用它来开始:
set.seed(1)
## Generate sample data
x <- table(round(rnorm(500, 100, 2)), round(rnorm(500, 100, 2)))
ph <- pheatmap::pheatmap(x, cluster_cols = FALSE, cluster_rows = FALSE)
## Extract the right grob
grob_classes <- purrr::map(ph$gtable$grobs, class)
idx_grob <- which(purrr::map_lgl(grob_classes, function(cl) 'gTree' %in% cl))[1]
grob_names <- names(ph$gtable$grobs[[idx_grob]]$children)
idx_rect <- grob_names[grep('rect', grob_names)][1]
## Remove borders around cells
ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$col <- ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$fill
ph$gtable$grobs[[idx_grob]]$children[[idx_rect]]$gp$lwd <- 3
## Plot result
graphics::plot.new()
print(ph)
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的: