在这篇文章中我测试了四个绘制热图的函数的运行时间。这些函数是 gplots::heatmap.2()heatmap()ComplexHeatmap::Heatmap()pheatmap::pheatmap()

我使用一个1000x1000的随机矩阵进行测试。

library(ComplexHeatmap)library(pheatmap)library(gplots)library(microbenchmark)

set.seed(123)n = 1000mat = matrix(rnorm(n*n), nrow = n)

首先我测试绘制热图同时也进行聚类。

t1 = microbenchmark( "heatmap()" = {  pdf(NULL)   heatmap(mat)   dev.off() }, "heatmap.2()" = {  pdf(NULL)   heatmap.2(mat, trace = "none")   dev.off() }, "Heatmap()" = {  pdf(NULL)  draw(Heatmap(mat))   dev.off() }, "pheatmap()" = {  pdf(NULL)   pheatmap(mat)  dev.off() }, times = 5)print(t1, unit = "s")
## Unit: seconds##         expr   min    lq  mean median    uq   max neval##    heatmap() 15.93 16.03 17.05  16.13 17.25 19.90     5##  heatmap.2() 16.15 17.06 17.09  17.19 17.38 17.69     5##    Heatmap() 20.75 21.55 22.27  21.90 21.96 25.17     5##   pheatmap() 15.66 15.89 19.77  16.21 16.64 34.44     5

我们可以看到所有的四个热图函数的运行时间看起来都差不多,这可能是因为聚类占据了大部分时间。在上面的测试中,Heatmap()运行的较慢,可能是因为在Heatmap()中也进行了其他热图函数没有进行的处理,例如对dendrogram的reorder。但是运行时间和其他函数相比不是很显著。

既然有可能在第一个测试中,聚类占据了大部分时间,那么在第二个测试中,我们不进行聚类,只画热图本身。

t2 = microbenchmark( "heatmap()" = {  pdf(NULL)  heatmap(mat, Rowv = NA, Colv = NA)  dev.off() }, "heatmap.2()" = {  pdf(NULL)  heatmap.2(mat, dendrogram = "none", trace = "none")  dev.off() }, "Heatmap()" = {  pdf(NULL)  draw(Heatmap(mat, cluster_rows = FALSE, cluster_columns = FALSE))  dev.off() }, "pheatmap()" = {  pdf(NULL)  pheatmap(mat, cluster_rows = FALSE, cluster_cols = FALSE)  dev.off() }, times = 5)print(t2, unit = "s")
## Unit: seconds##         expr     min     lq    mean  median      uq     max neval##    heatmap()  0.2546  0.266  0.3192  0.2683  0.3141  0.4931     5##  heatmap.2() 15.0519 15.315 15.3524 15.4163 15.4787 15.5001     5##    Heatmap()  2.7637  2.841  2.9421  2.9303  2.9693  3.2059     5##   pheatmap()  1.1940  1.225  4.3730  1.2677  1.3535 16.8250     5

哈,现在heatmap.2()变得最慢了,而且和其他三个函数相比是慢的多的多。

第三个测试中,我们在绘制热图之前先对矩阵进行聚类,生成两个聚类变量,然后传入各个热图函数中。在这里我们测试的是画热图同时也画dendrogram的速度。

row_hc = hclust(dist(mat))col_hc = hclust(dist(t(mat)))

t3 = microbenchmark( "heatmap()" = {  pdf(NULL)  heatmap(mat, Rowv = as.dendrogram(row_hc), Colv = as.dendrogram(col_hc))  dev.off() }, "heatmap.2()" = {  pdf(NULL)  heatmap.2(mat, Rowv = row_hc, Colv = col_hc, trace = "none")  dev.off() }, "Heatmap()" = {  pdf(NULL)  draw(Heatmap(mat, cluster_rows = row_hc, cluster_columns = col_hc))  dev.off() }, "pheatmap()" = {  pdf(NULL)  pheatmap(mat, cluster_rows = row_hc, cluster_cols = col_hc)  dev.off() }, times = 5)print(t3, unit = "s")

同样还是heatmap.2()最慢。

## Unit: seconds##         expr    min     lq   mean median     uq    max neval##    heatmap()  1.462  1.473  1.503  1.475  1.506  1.599     5##  heatmap.2() 15.864 15.888 16.165 16.163 16.327 16.585     5##    Heatmap()  5.777  5.803  5.956  6.003  6.066  6.130     5##   pheatmap()  1.308  1.321  4.413  1.488  1.544 16.406     5

我们把三个测试的数值放入一个表格中,以方便比较。其中表现最差的时间我们加粗表示。每一行表示是否聚类和是否画dendrogram。

heatmap() heatmap.2() Heatmap() pheatmap()
聚类,画dendrogram 17.05s 17.09s 22.27s 19.77s
不聚类,没有dendrogram 0.32s 15.35s 2.94s 4.37s
只画dendrogram 1.50s 16.17s 5.96s 4.41s

下面我也相应的测试了较小的矩阵,分别为50x50,100x100,500x500,结果见下图。基本结论是,对于小的矩阵,Heatmap()速度最慢,但是差别只是在~0.1秒的水平,我觉得可以忽略不计。对于大的矩阵,Heatmap()的优势显示出来。同时别忘了,Heatmap()是这四个热图函数中毋庸置疑最强大的一个。


用来比较的R包的版本:

  • ComplexHeatmap:2.7.1.1003
  • gplots:3.1.0
  • pheatmap:1.0.12

中的draw函数_哪一个热图函数更快?相关推荐

  1. python append函数_让你python代码更快的3个小技巧!速度提高了一倍还多

    大家好!今天呢,我们来聊一聊如何加速你的 python 代码. Python 语言的优点可以列举出许多,语法简单易懂.模块丰富.应用广泛等等.但是世界上没有有完美的东西,python 一个明显缺点就是 ...

  2. 差异表达基因热图怎么看_画图专题 | 热图函数pheatmap()

    画图专题 | 热图函数pheatamp() 百迈客医学 2018-10-31 先看一眼这个函数的参数,这么多,而且最后还有省略号.那么我们应该怎么合理使用这些参数让你的热图看起来更加高大上呢? phe ...

  3. 怎么让热图显示基因名_热图怎么做? | 热图函数pheatmap()

    是不是会经常绘制热图?那热图怎么做?先看一眼这个函数的参数,这么多,而且最后还有省略号.那么我们应该怎么合理使用这些参数让你的热图看起来更加高大上呢? pheatmap(mat, color = co ...

  4. 怎么让热图显示基因名_在热图中标注出特定基因名称

    原标题:在热图中标注出特定基因名称 对于基因的差异表达谱,常用热图作为展示.但有时差异基因可能非常的多,热图中不可能将所有基因的名称标注出来.那么此时不妨选择一些比较重要的基因(比方说p值最显著的那些 ...

  5. 复平面上gamma函数_神奇的Gamma函数 (中)

    Gamma 函数欣赏 Each generation has found something of interest to say about the gamma function. Perhaps ...

  6. 编写分段函数子函数_编写自己的函数

    编写分段函数子函数 PYTHON编程 (PYTHON PROGRAMMING) In Python, you can define your own functions. 在Python中,您可以定义 ...

  7. fillna函数_听说这些pandas函数,是数据科学家和软件工程师的最爱

    全文共2758字,预计学习时长13分钟 图源:unsplash 软件工程师该像是索引,而不是教科书.你无法记住所有内容,但得知道如何快速查找它们. 能够快速查找和使用函数让我们在编写代码时可以达到一定 ...

  8. 什么是python函数_什么是python函数

    python函数是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段.python函数包含系统中自带的一些函数.第三方函数.以及用户自定义的函数. 函数是可以实现一些特定功能的小方法或是小程序 ...

  9. 画分段函数_秃头节:“函数”段子已出炉高中数学题型分析

    高中数学函数题型整理解析版 函数图像 有关函数图象识别问题的常见题型及解题思路(1)由函数的定义域,判断图象左右的位置,由函数的值域,判断图象的上下位置:②由函数的单调性,判断图象的变化趋势:③由函数 ...

  10. subtotal函数_星期五的Excel函数:将总计为SUBTOTAL的筛选列表

    subtotal函数 The Excel SUM function does a great job of adding numbers on a worksheet, and it's probab ...

最新文章

  1. golang 函数指针相等比较
  2. 炼丹面试官的面试笔记
  3. Industry AI Live | BERT在美团搜索业务中的应用
  4. 基于图卷积(GCN)和规则卷积(CNN)的情绪识别
  5. pyppeteer:比selenium更高效的爬虫利器
  6. 属性类:Properties
  7. 有钱了不起?!苹果猎头挖到马斯克没脾气,特斯拉股东公开求收购
  8. mysql的网址是什么意思_Mysql数据库地址是什么怎么填写
  9. android中的Handler和Callback机制
  10. POJ 1637 混合图欧拉回路
  11. 微信自动截取PPT或者黑/白版图片
  12. text——Android下的默认字体详解
  13. Oracle P6培训系列:15定义资源库
  14. 数学建模笔记(一):数学建模一般步骤
  15. Halcon 入门教程(01)
  16. vsto c# openxml操作excel
  17. JPEG图像的可逆信息隐藏算法研究
  18. 用了很多群控与云控,微信还是慢慢死掉了
  19. Mac 显示隐藏文件夹
  20. 如何解决“Component ‘MSCOMCTLOCX‘ or one of its dependencies .....“

热门文章

  1. silverlight:手写板/涂鸦/墨迹/InkPresenter示例程序
  2. java poi设置单元格格式为数值_java中导出excel设置单元格的样式为数字格式怎样设置?...
  3. python语言标识符命名规则_Python标识符
  4. PHP根据文件夹删除异常文件,删除重复文件
  5. malformed utf-8 characters, possibly incorrectly encoded
  6. git clone 失败_鲜为人知的Git功能——Git Worktree工作树
  7. 矩阵的java程序怎么编写_如何编写Java程序以添加两个矩阵
  8. MAC:一个数据缓冲区,作为参数传递到另外一个函数就崩溃
  9. 某文件在桌面上,命令窗口中找不到,因为桌面是两个目录合成的
  10. 粮食增产的重要性顺序,土水肥种