与InteractiveComplexHeatmap,可将以下热图导出为交互式Shiny app:
统计数据::热图()
,gplots: heatmap.2 ()
而且pheatmap: pheatmap ()
,但可由“翻译功能”复制:ComplexHeatmap:::的热图()
,ComplexHeatmap::: heatmap.2 ()
而且ComplexHeatmap: pheatmap ()
.所有这些类型的热图都可以通过调用变成交互式的htShiny ()
热图绘制完成后。例如:
也就是说你不需要碰热图代码。当您在您的R终端中看到热图或在文件中生成后,直接呼叫htShiny ()
没有争论就会产生一个交互式热图,就像魔术一样。: P
现在还有第四种情况,即热图由内部使用的第三方功能生成统计数据::热图()
,gplots: heatmap.2 ()
或pheatmap: pheatmap ()
.因为现在我们不能直接与热图()
,heatmap.2 ()
或pheatmap ()
,我们如何把这些热图变成交互式的?解决办法相当简单。我们只需要去如。pheatmap命名空间和替换pheatmap
与ComplexHeatmap: pheatmap
.
下面的示例来自SC3函数所在的包sc3_plot_expression ()
在内部使用pheatmap ()
.
图书馆(SingleCellExperiment)图书馆(SC3)图书馆(走开)南加州爱迪生公司< -SingleCellExperiment(化验=列表(数=as.matrix(严),logcounts =log2(as.matrix(燕)+1)),colData =安)rowData(预计)$feature_symbol < -rownames(预计)南加州爱迪生公司< -南加州爱迪生公司(!复制(rowData(预计)$feature_symbol),)南加州爱迪生公司< -runPCA(预计)南加州爱迪生公司< -sc3(预计,ks =2:4,生物学=真正的)sc3_plot_expression(预计,k =3.)
代替内部使用pheatmap: pheatmap
与ComplexHeatmap: pheatmap
,我们可以使用assignInNamespace ()
的值pheatmap
在pheatmap名称空间。之后,回忆sc3_plot_expression ()
将直接使用ComplexHeatmap: pheatmap ()
现在你可以用htShiny ()
将其导出为交互式应用程序。当然,您需要使用相同的代码重新生成热图。
assignInNamespace(“pheatmap”, ComplexHeatmap::pheatmap,ns =“pheatmap”)图书馆(InteractiveComplexHeatmap)sc3_plot_expression(预计,k =3.)htShiny()
如果你检查源代码sc3_plot_expression ()
,pheatmap ()
通过显式添加其名称空间使用(检查函数定义的最后几行):
方法定义:## ## 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实验"
在这种情况下,改变pheatmap
在pheatmap命名空间直接影响sc3_plot_expression ()
.
但是,如果调用热图函数时没有添加命名空间(如。,在前面的例子中,pheatmap::
前缀),则需要先卸载热图包,修改热图命名空间中的热图函数,然后再将热图包重新加载。
让我们来看下一个例子GOexpress函数所在的包heatmap_GO ()
在内部使用heatmap.2 ()
.
图书馆(GOexpress)数据(AlvMac)set.seed(4543)AlvMac_results < -GO_analyse(eSet =AlvMac,f =“治疗”,GO_genes =AlvMac_GOgenes,all_GO =AlvMac_allGO,all_genes =AlvMac_allgenes)英国石油公司.5<-subset_scores(结果=AlvMac_results.pVal,名称空间=“biological_process”,总=5,p.val =0.05)heatmap_GO(go_id =“去:0034142”,结果=英国石油公司.5,eSet =AlvMac,cexRow =0.4,cexCol =1,cex.main =1,主要。Lsplit =30.)
现在请注意heatmap_GO ()
函数,heatmap.2 ()
在没有gplots命名空间(转到下面列出的函数定义的末尾)。
##函数(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:::的热图.2,ns =“gplots”)图书馆(GOexpress)图书馆(InteractiveComplexHeatmap)heatmap_GO(go_id =“去:0034142”,结果=英国石油公司.5,eSet =AlvMac,cexRow =0.4,cexCol =1,cex.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:::的热图.2,ns =“gplots”)assignInNamespace(“pheatmap”, ComplexHeatmap::pheatmap,ns =“pheatmap”)
你可以在htShinyExample (8.1)
,htShinyExample (8.2)
而且htShinyExample (8.3)
.