ChIPseeker的upsetplot是怎么写的-阿里云开发者社区

开发者社区> 徐洲更> 正文

ChIPseeker的upsetplot是怎么写的

简介: 都靠时间的积累
+关注继续查看

在距今2年前的一个日子里,我写了一篇关于upsetR的简单教程。两年过去了,这篇教程是百度搜索的第一位。

在这篇教程中,我定了一个计划

下一期写一篇Y叔的upsetplot是如何写的。

然而两年过去了,我说的那个教程都没有出现,今天有人提问upsetR的时候,我又看到了这个计划,羞愧难当,遂有了这篇教程。

通常而言,看一个函数的源代码的方式就是直接在R中输入这个函数名

> upsetplot
standardGeneric for "upsetplot" defined from package "enrichplot"

function (x, ...) 
standardGeneric("upsetplot")
<bytecode: 0x0000000047c188c8>
<environment: 0x0000000047c10318>
Methods may be defined for arguments: x
Use  showMethods("upsetplot")  for currently available ones.

但是对于upsetplot这个函数而言,并不奏效,因为它是一个泛型函数。所谓的泛型函数,指的是对于同一个函数而言,它会根据不同数据对象调取实际的函数。例如print函数,既可以用来输出字符串,还可以输出图片。

那么如何查看它的实际函数呢?我们可以根据提示,showMethods("upsetplot")去找它到底有哪些可用函数

> showMethods("upsetplot")
Function: upsetplot (package enrichplot)
x="csAnno"
x="enrichResult"

不难发现,它提供了两种数据类型的展示方法,一种是csAnno,另一种是enrichResult.对于csAnno,我们可以用包名:::不可见函数的形式查看到实际代码

ChIPseeker:::upsetplot.csAnno
function (x, sets = NULL, order.by = "freq", sets.bar.color = NULL, 
    vennpie = FALSE, vp = viewport(x = 0.6, y = 0.7, width = 0.6, 
        height = 0.6), ...) 
{
    y <- x@detailGenomicAnnotation
    y <- as.matrix(y)
    y[y] <- 1
    y <- as.data.frame(y)
    if (is.null(sets)) {
        sets <- c("distal_intergenic", "downstream", 
            "threeUTR", "fiveUTR", "Intron", 
            "Exon", "Promoter")
        if (vennpie && is.null(sets.bar.color)) {
            sets.bar.color <- c("#d95f0e", "#fee0d2", 
                "#98D277", "#6F9E4C", "#fc9272", 
                "#9ecae1", "#ffeda0")
        }
    }
    if (is.null(sets.bar.color)) {
        sets.bar.color <- "black"
    }
    if (vennpie) {
        plot.new()
        upset(y, sets = sets, sets.bar.color = sets.bar.color, 
            order.by = order.by, ...)
        pushViewport(vp)
        par(plt = gridPLT(), new = TRUE)
        vennpie(x)
        popViewport()
    }
    else {
        upset(y, sets = sets, sets.bar.color = sets.bar.color, 
            order.by = order.by, ...)
    }
}

为了能够解释代码,我们需要先运行测试数据,获取能够进行演示的数据

require(TxDb.Hsapiens.UCSC.hg19.knownGene)
txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
peakfile <- system.file("extdata", "sample_peaks.txt", package="ChIPseeker")
peakAnno <- annotatePeak(peakfile, tssRegion=c(-3000, 3000), TxDb=txdb)
x <- peakAnno # x是csAnno类

y <- x@detailGenomicAnnotation用来提取详细的注释信息

注释信息

y <- as.matrix(y)转换成矩阵,方便后面的y[y]<-1将所有为TRUE的结果转成1,在y<- as.data.frame(y)的时候让FALSE转成了0。

调整数据结构

如果是我的话,我应该会用apply

y <- x@detailGenomicAnnotation
y2 <- apply(y, 2, as.integer)
y2 <- as.data.frame(y2)

这里的y的数据结构刚好是的upset需要的输入,所以假如Y叔没有提供upsetplot函数的话,那么代码你可以直接用upset(y)作图

upset(y)

直接作图吧

下面代码定义需要提供给upset函数进行集合运算的属性,默认就是ChIPseeker注释的8个属性

设置集合

之后的代码是根据是否绘制饼图走向两条分支。

绘图

在绘制饼图的循环里,Y叔先用graphics的plot.new新建了一个绘图框架,方便在这个绘图框架中作图。

plot.new()

空空如也

再用upset把图画好

# 绘图的准备工作
sets <- c("distal_intergenic", "downstream", 
              "threeUTR", "fiveUTR", "Intron", 
              "Exon", "Promoter")
sets.bar.color <- c("#d95f0e", "#fee0d2", 
                          "#98D277", "#6F9E4C", "#fc9272", 
                          "#9ecae1", "#ffeda0")
sets.bar.color <- "black"
order.by <- "freq"
library(UpSetR)
upset(y, sets = sets, sets.bar.color = sets.bar.color, 
       order.by = order.by)

最初的结果

之后的pushViewport(vp)会调出一个视图对象,也就是vp = viewport(x = 0.6, y = 0.7, width = 0.6, height = 0.6), 指定了后续要画图的位置和大小.

par(plt = gridPLT(), new = TRUE)设置了绘图的基本参数。gridPLT函数来自于gridBase,他的作用就是返回用于设置plt的值。

最终用vennpie(x)绘制饼图,然后用popViewport()回到原来视图,结束画图。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6400 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3972 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7623 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
4997 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9325 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2032 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16307 0
+关注
徐洲更
生信媛公众号编辑、生信必修课之软件安装课程作者
210
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载