美文网首页ggplot2绘图
【R>>aplot】装扮你的ggplot2

【R>>aplot】装扮你的ggplot2

作者: 高大石头 | 来源:发表于2021-07-06 17:06 被阅读0次

    科研搬砖日常,往往需要将各种图进行拼接,常用的组合包有patchworkcowplotgridExtra等。但是这几款都是类似将图片进行拼接,图与图之间的关系是平等的,尽管可通过调整参数突出主图,但参数相对较多,不好记忆;而aplot正好能解决对主图注释这一痛点。下面就来学习下吧。

    核心函数:

    • insert_left() insert_right() insert_top() insert_bottom()

    • is.ggtree()

    • plot_list()

    • xlim2() ylim2()

    • xrange() yrange()

    1.核心函数

    1.1 insert_**()

    rm(list = ls())
    library(ggplot2)
    library(aplot)
    p <- ggplot(mtcars,aes(mpg,disp))+
      geom_point()
    
    p2 <- ggplot(mtcars,aes(mpg))+
      geom_density(fill="steelblue",alpha=0.5)+
      ggtree::theme_dendrogram()
    p3 <- ggplot(mtcars,aes(x=1,y=disp))+
      geom_boxplot(fill="firebrick",alpha=0.5)+
      theme_void()
    p+p2+p3
    
    ap <- p %>% 
      insert_top(p2,height = 0.3) %>% 
      insert_right(p3,width = 0.1)
    ap
    

    1.2 xlim2

    p1 <- ggplot(mtcars,aes(cyl))+
      geom_bar()
    p2 <- ggplot(subset(mtcars,cyl!=4),aes(cyl))+
      geom_bar()
    p1+p2
    
    p2+xlim2(p1)
    

    2.实战一:heatmap

    rm(list = ls())
    pacman::p_load(tidyverse,ggtree,aplot,reshape,ggExtra)
    
    d <- matrix(rnorm(25),ncol = 5) %>% 
      data.frame()
    rownames(d) <- paste0("g",1:5)
    colnames(d) <- paste0("t",1:5)
    
    hc <- hclust(dist(d))
    hcc <- hclust(dist(t(d)))
    phr <- ggtree(hc) #行聚类树
    phc <- ggtree(hcc)+layout_dendrogram() #列聚类树
    
    d$gene <- rownames(d)
    dd <- melt(d)
    
    p <- ggplot(dd,aes(variable,gene,fill=value))+
      geom_tile()+
      scale_fill_viridis_c()+
      scale_y_discrete(position = "right")+
      theme_minimal()+
      labs(x="",y="")
    
    g <- ggplot(dplyr::filter(dd,gene!="g2"),
                aes(gene,value,fill=gene))+
      geom_boxplot()+
      coord_flip()+
      scale_fill_brewer(palette = "Set1")+
      theme_minimal()+
      theme(axis.text.y = element_blank(),
            axis.ticks.y = element_blank(),
            panel.grid.minor = element_blank(),
            panel.grid.major.y = element_blank())+
      labs(x="",y="")
    
    ca <- data.frame(variable=paste0("t",1:5),
                     A1=rep(LETTERS[1:2],times=c(3,2)),
                     A2=rep(letters[3:5],times=c(1,3,1)))
    cad <- gather(ca,A1,A2,key = "anno",value = "type")
    
    pc <- ggplot(cad,aes(variable,anno,fill=type))+
      geom_tile()+
      scale_y_discrete(position = "right")+
      theme_minimal()+
      theme(axis.text.x = element_blank(),
            axis.ticks.x=element_blank())+
      labs(x="",y="")
    
    dp <- data.frame(gene=factor(rep(paste0("g",1:5),2)),
                     pathway=sample(paste0("pathway",1:5),10,replace = T))
    
    pp <- ggplot(dp,aes(pathway,gene))+
      geom_point(size=5,color="steelblue")+
      theme_minimal()+
      theme(axis.text.x=element_text(angle=90,hjust=0),
            axis.text.y = element_blank(),
            axis.ticks.y=element_blank())+
      labs(x="",y="")
    
    p %>% insert_left(phr,width = .3) %>% 
      insert_right(pp,width = .3) %>% 
      insert_right(g,width = .4) %>% 
      insert_top(pc,height =.1) %>% 
      insert_top(phc,height = .2)
    

    看图确实让人感觉眼花缭乱的,但逻辑比较清晰,就是先用ggplot2绘制所有图,然后通过aplot将这些图放在主图的周围。

    3.实战二:散点图+边际密度图

    rm(list = ls())
    library(ggsci)
    pp <- ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
      geom_point()+
      theme_bw()+
      scale_color_lancet()
    
    x <- ggplot(iris,aes(Sepal.Length,fill=Species))+
      geom_density(alpha=0.5)+
      scale_fill_lancet()+
      expand_limits(x=0,y=0)+
      scale_y_continuous(expand = c(0,0))+
      theme_classic()+
      theme(axis.title.x = element_blank(),
            axis.text.x = element_blank(),
            axis.ticks.x=element_blank())+
      guides(fill=FALSE)
    
    y <- ggplot(iris,aes(Sepal.Width,fill=Species))+
      geom_density(alpha=0.5)+
      scale_fill_lancet()+
      expand_limits(x=0,y=0)+
      scale_y_continuous(expand = c(0,0))+
      theme_classic()+
      theme(axis.title.y  = element_blank(),
            axis.text.y = element_blank(),
            axis.ticks.y =element_blank())+
      guides(fill=FALSE)+
      coord_flip()
    
    pp %>% 
      insert_right(y,width = .2) %>% 
      insert_top(x,height = .3)
    

    还可以用ggExtra包直接展示

    library(ggExtra)
    p <- ggplot(iris,aes(Sepal.Length,Sepal.Width,color=Species))+
      geom_point()+
      guides(color=FALSE)+
      theme_bw()
    
    ggMarginal(p,type = "density",groupFill = T)
    

    参考链接:

    1.R中的图片注释神包aplot

    2.aplot: Decorate a ‘ggplot’ with Associated Information

    相关文章

      网友评论

        本文标题:【R>>aplot】装扮你的ggplot2

        本文链接:https://www.haomeiwen.com/subject/aobgultx.html