交互由pheatmap()、heatmap 2()和heatmap()间接生成的热图

祖光谷(z.gu@dkfz.de

2022-10-02

InteractiveComplexHeatmap,可将以下热图导出为交互式Shiny app:

  1. 热图直接从ComplexHeatmap
  2. 实现的其他函数或包中的热图ComplexHeatmap
  3. 热图最初由统计数据::热图()gplots: heatmap.2 ()而且pheatmap: pheatmap (),但可由“翻译功能”复制:ComplexHeatmap:::的热图()ComplexHeatmap::: heatmap.2 ()而且ComplexHeatmap: pheatmap ()

所有这些类型的热图都可以通过调用变成交互式的htShiny ()热图绘制完成后。例如:

ComplexHeatmap::pheatmap(…)htShiny()

也就是说你不需要碰热图代码。当您在您的R终端中看到热图或在文件中生成后,直接呼叫htShiny ()没有争论就会产生一个交互式热图,就像魔术一样。: P

现在还有第四种情况,即热图由内部使用的第三方功能生成统计数据::热图()gplots: heatmap.2 ()pheatmap: pheatmap ().因为现在我们不能直接与热图()heatmap.2 ()pheatmap (),我们如何把这些热图变成交互式的?解决办法相当简单。我们只需要去如。pheatmap命名空间和替换pheatmapComplexHeatmap: pheatmap

下面的示例来自SC3函数所在的包sc3_plot_expression ()在内部使用pheatmap ()

图书馆(SingleCellExperiment)图书馆(SC3)图书馆(走开)南加州爱迪生公司< -SingleCellExperiment化验=列表数=as.matrix(严),logcounts =log2as.matrix(燕)+1),colData =rowData(预计)feature_symbol < -rownames(预计)南加州爱迪生公司< -南加州爱迪生公司(复制rowData(预计)feature_symbol),)南加州爱迪生公司< -runPCA(预计)南加州爱迪生公司< -sc3(预计,ks =24生物学=真正的sc3_plot_expression(预计,k =3.

代替内部使用pheatmap: pheatmapComplexHeatmap: pheatmap,我们可以使用assignInNamespace ()的值pheatmappheatmap名称空间。之后,回忆sc3_plot_expression ()将直接使用ComplexHeatmap: pheatmap ()现在你可以用htShiny ()将其导出为交互式应用程序。当然,您需要使用相同的代码重新生成热图。

assignInNamespace“pheatmap”, ComplexHeatmap::pheatmap,ns =“pheatmap”图书馆(InteractiveComplexHeatmap)sc3_plot_expression(预计,k =3.htShiny()

如果你检查源代码sc3_plot_expression ()pheatmap ()通过显式添加其名称空间使用(检查函数定义的最后几行):

selectMethod“sc3_plot_expression”签名=“SingleCellExperiment”
方法定义:## ## function (object, k, show_pdata = NULL) ## {## if (is.null(元数据(对象)$sc3$consensus)) {## warning(paste0("请先运行sc3_consensus() !")) ## return(对象)##}# hc <-元数据(对象)$sc3$consensus[[as.character(k)]]$hc ##数据集<- get_processed_数据集(对象)## if (!is.null(元数据(对象)$sc3$svm_train_inds)){##数据集<-数据集[,元数据(对象)$sc3$svm_train_inds] ##} # add_ann_col <- FALSE ## ann <- NULL ## if (!is.null(show_pdata)) {## ann <- make_col_ann_for_heatmaps(对象,show_pdata) ## if (!is.null(ann)) {## add_ann_col <- TRUE ## rownames(ann) <- colnames(数据集)##}## # if (nrow(数据集)> 100){## do。call(pheatmap::pheatmap, c(list(dataset, cluster_cols = hc, ## kmeans_k = 100, cutree_cols = k, show_rownames = FALSE, ## show_colnames = FALSE), list(annotation_col = ann)[add_ann_col])) ##} ##其他{## do。call(pheatmap::pheatmap, c(list(dataset, cluster_cols = hc, ## cutree_cols = k, show_rownames = FALSE, show_colnames = FALSE), ## list(annotation_col = ann)[add_ann_col])) ## ## ## <字节码:0x55b7a53af5a8> ## <环境:namespace:SC3> ## ##签名:## object ## target " singlecel实验" ##已定义" singlecel实验"

在这种情况下,改变pheatmappheatmap命名空间直接影响sc3_plot_expression ()

但是,如果调用热图函数时没有添加命名空间(如。,在前面的例子中,pheatmap::前缀),则需要先卸载热图包,修改热图命名空间中的热图函数,然后再将热图包重新加载。

让我们来看下一个例子GOexpress函数所在的包heatmap_GO ()在内部使用heatmap.2 ()

图书馆(GOexpress)数据(AlvMac)set.seed4543AlvMac_results < -GO_analyseeSet =AlvMac,f =“治疗”GO_genes =AlvMac_GOgenes,all_GO =AlvMac_allGO,all_genes =AlvMac_allgenes)英国石油公司.5<-subset_scores结果=AlvMac_results.pVal,名称空间=“biological_process”总=5p.val =0.05heatmap_GOgo_id =“去:0034142”结果=英国石油公司.5eSet =AlvMac,cexRow =0.4cexCol =1cex.main =1主要。Lsplit =30.

现在请注意heatmap_GO ()函数,heatmap.2 ()在没有gplots命名空间(转到下面列出的函数定义的末尾)。

heatmap_GO
##函数(go_id, result, eSet, f = result$factor,子集= NULL, ## gene_names = TRUE, NA.names = FALSE, margin = c(7,5), scale = "none", ## cexCol = 1.2, cexRow = 0.5, labRow = NULL, cex. name = 0)。Main = 1, ## trace = "none", expr。col = bluered(75), row.col.palette = "Accent", ## row。col = c(), main = paste(go_id, result$GO[result$GO$go_id == ## go_id, "name_1006"]), main。Lsplit = NULL,…)## {## if (!all(c("factor", "GO", "genes") %in% names(result))) {## stop("'result='参数错过所需的槽位。\n它是go_analyze()输出吗?")##}## if (!go_id %in% result$GO$go_id) {## stop("go_id: ", go_id, " was not found in result$mapping$go_id.") ##} ## if (!is.null(子集)){## eSet <- subEset(eSet = eSet,子集=子集)##}# if (length(row.col) != ncol(eSet)){##行。Col <- brewer。pal(n = length(unique(pData(eSet)[, ## f])), name = row.col.palette) ##} ## gene_ids <- list_genes(go_id = go_id, result = result, data. list);只有= TRUE) # # genes_expr < - t (exprs (eSet) [gene_ids,]) # #如果(is.null (labRow)) {# # labRow < - pData (eSet) [f ] ## } ## 其他{# #如果(长度(labRow) = = 1) {# # labRow = pData (eSet) [labRow ] ## } ## else if(长度(labRow) ! = ncol (eSet)){# #停止(“自定义行标签提供的数量(“# #长度(labRow),”)不匹配样本的数量(“# # ncol(分野 ), ".") ## } ## } ## 如果(gene_names) {# # gene_labels < - $基因[gene_ids,结果"external_gene_name"] ## if (any(gene_labels == "") & !NA.names) {## gene_labels[gene_labels == ""] <- gene_ids[gene_labels == ## ""] ##} ## else {## gene_labels <- gene_ids ##} # if (!is.null(main. lsplit)) {## if (is.numeric(main. lsplit)) {## main <- string_Lsplit(string = main, line. lsplit)) {## main <- string_Lsplit(string = main, line. lsplit))length = main. lsplit) ##} # else {## stop("main. lsplit ")Lsplit应该是一个数值或NULL。”)< -上校row.col [as.factor (pData (eSet) [f])) # # op < - par(没有。readonly = TRUE) ## on.exit(par(op)) ## par(cex. exe)Main = cex.main) ##热图。2(genes_expr, labRow = labRow, labCol = gene_labels, ## scale = scale, cexCol = cexCol, cexRow = cexRow, main = main, ## trace = trace, RowSideColors = samples.col, col = expr.col, ## margins = margins, ...) ## } ##  ## 

在本例中,由于我们已经加载了GOexpress名称空间,GOexpress命名空间应该首先被删除分离(),否则heatmap_GO ()仍将使用gplots: heatmap.2 ()

分离“包:GOexpress”卸载=真正的assignInNamespace“heatmap.2”, ComplexHeatmap:::的热图.2ns =“gplots”图书馆(GOexpress)图书馆(InteractiveComplexHeatmap)heatmap_GOgo_id =“去:0034142”结果=英国石油公司.5eSet =AlvMac,cexRow =0.4cexCol =1cex.main =1主要。Lsplit =30.htShiny()

最后,要安全的改变一切统计数据::热图()gplots: heatmap.2 ()而且pheatmap: pheatmap ()ComplexHeatmap:::的热图()ComplexHeatmap::: heatmap.2 ()而且ComplexHeatmap: pheatmap (),你可以添加以下行到你的R会话的开始:

图书馆(pheatmap)图书馆(gplots)assignInNamespace“热图”, ComplexHeatmap:::的热图,ns =“统计数据”assignInNamespace“heatmap.2”, ComplexHeatmap:::的热图.2ns =“gplots”assignInNamespace“pheatmap”, ComplexHeatmap::pheatmap,ns =“pheatmap”

你可以在htShinyExample (8.1)htShinyExample (8.2)而且htShinyExample (8.3)