zoukankan      html  css  js  c++  java
  • 简单将ggplot多个图排列在一起

      这里我们使用grid对ggplot的画图对象进行布局

    # Multiple plot function
    #
    # ggplot objects can be passed in ..., or to plotlist (as a list of ggplot
    # objects)
    # - cols:   Number of columns in layout
    # - layout: A matrix specifying the layout. If present, 'cols' is ignored.
    #
    # If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
    # then plot 1 will go in the upper left, 2 will go in the upper right, and
    # 3 will go all the way across the bottom.
    # e=0.15, # extra height needed for last plot (vertical layout),
    # or extra width for first plot (horizontal layout)
    multiplot <- function(..., plotlist=NULL, file, cols=1,
                          layout=NULL, horizontal=FALSE, e=0.15) {
      require(grid)
      
      # Make a list from the ... arguments and plotlist
      plots = c(list(...), plotlist)
      
      numPlots = length(plots)
      #message(paste0('>>>>>>>INFO: num plots 2 = ', numPlots), '
    ')
      
      # If layout is NULL, then use 'cols' to determine layout
      if (is.null(layout)) {
        # Make the panel
        # ncol: Number of columns of plots
        # nrow: Number of rows needed, calculated from # of cols
        layout = matrix(seq(1, cols * ceiling(numPlots/cols)),
                        ncol = cols, nrow = ceiling(numPlots/cols))
      }
      
      if (numPlots==1) {
        print(plots[[1]])
        
      } else {
        
        ## set up heights/widths of plots
        
        # extra height needed for last plot (vertical layout),
        # or extra width for first plot (horizontal layout)
        hei = rep(1, numPlots)
        # bottom plot is taller
        hei[numPlots] = hei[numPlots]*(1+e)
        wid = rep(1, numPlots)
        # first left plot is wider
        wid[1] = wid[1]*(1+e)
        # Set up the page
        grid.newpage()
        if(horizontal){
          pushViewport(viewport(layout = grid.layout(nrow(layout),
                                                     ncol(layout), widths=wid)))
        }else{
          pushViewport(viewport(layout = grid.layout(nrow(layout),
                                                     ncol(layout), heights=hei)))
          
        }
        
        # Make each plot, in the correct location
        for (i in 1:numPlots) {
          # Get i,j matrix positions of the regions containing this subplot
          matchidx = as.data.frame(which(layout == i, arr.ind = TRUE))
          print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
                                          layout.pos.col = matchidx$col))
        }
      }
    }
    
    
    library(ggplot2)
    p1 <- ggplot(iris, aes(x = Sepal.Length)) + geom_histogram() + theme_bw()
    p2 <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Width)) + geom_point() + theme_bw()
    
    # 直接使用ggplot对象画图
    multiplot(p1,p2)
    
    # 将ggplot对象放入列表中,再用列表画图, 并设置两列的排列方式
    plot_lst <- list()
    plot_lst[[1]] <- p1
    plot_lst[[2]] <- p2
    multiplot(plotlist = plot_lst, cols = 2)
    

    参考资料

    ClonEvol: clonal ordering and visualization in cancer
    sequencing文献里面CloneEvol包里面boxplot.r函数

  • 相关阅读:
    Kmp 加深理解 之 poj 3461
    Kmp 模板 之 hdu 1711 Number Sequence
    最大连续子序列和(经典DP) 之 hdu 1231 最大连续子序列
    数学 之 hdu 4710 Balls Rearrangement
    01背包变形 之 hdu 2126 Buy the souvenirs
    逆序数 之 hdu 1394 Minimum Inversion Number
    根据进程文件id查看所有进程信息
    N皇后问题
    17. 电话号码的字母组合
    697. 数组的度
  • 原文地址:https://www.cnblogs.com/ywliao/p/12419025.html
Copyright © 2011-2022 走看看