【问题标题】:Manual facet position in ggplot2ggplot2中的手动刻面位置
【发布时间】:2017-10-23 15:54:09
【问题描述】:

我正在使用 ggplot2 绘制以下数据集:

DF <- structure(list(site = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", 
"D", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E"
), month = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L), SWC = c(0.140086734851409, 0.137745990685859, 
0.146660019201229, 0.275950971628449, 0.298260250896057, 0.26870029739777, 
0.227566661823465, 0.197824137311287, 0.195409734063355, 0.229745648248465, 
0.226546607074933, 0.158508782420749, 0.0809095246636771, 0.0804010923965351, 
0.0845644708882278, 0.136702248824284, 0.121883242349049, 0.108167424836601, 
0.0970784232538687, 0.0860934461299105, 0.0910916878172589, 0.10747642248062, 
0.102700195758564, 0.0811833903700756, 0.115733715437788, 0.0631616319005478, 
0.0631265153446416, 0.171535848109378, 0.18694684173028, 0.142807562821677, 
0.145926108701425, 0.154393702185792, 0.171436382382201, 0.188897212829005, 
0.186402403754978, 0.165098945598251, 0.0713685071127924, 0.0436531172429078, 
0.0624862109235555, 0.127141665482761, 0.134542260869565, 0.124414092512545, 
0.100807230998223, 0.0765214392215714, 0.0798724029741452, 0.103098854664915, 
0.116568256944444, 0.1105108739241, 0.108650005144474, 0.0976296689160692, 
0.105006219572287, 0.122777662914972, 0.102765292125318, 0.0851933017211099, 
0.0566760862577016, 0.056282148272957, 0.0718264626865672, 0.0909327257326783, 
0.10461694624978, 0.103895834299474), LE = c(0.946565193060996, 
1.56650528637219, 4.45382423672104, 11.1985050677478, 29.1379975402081, 
74.6488855786053, 95.5801950803702, 77.4708126488623, 39.6136552461462, 
8.01576749720725, 2.6466216369622, 1.1745554117357, 2.13167679680568, 
2.98141098231535, 5.69653566874706, 13.8293309632019, 26.1687157009092, 
42.2656041113131, 53.2110193016699, 43.9856386693244, 28.6722592758158, 
10.8442703054334, 3.66463523523524, 1.97253929316558, 3.12430388517694, 
5.48701577036533, 6.95032997537497, 13.7237856698465, 32.2938743570904, 
48.7715488919351, 55.6860655989469, 46.0893482005537, 31.0498645245332, 
14.7640819905213, 8.98244641061733, 3.43372937817259, 3.69254598741488, 
5.03158318364554, 7.73098511689167, 22.4154276282377, 47.1483358705029, 
66.5623394397102, 77.0140731034483, 67.5194151592607, 44.6530820096047, 
20.4357590631479, 6.56212672069986, 2.8940355016033, 1.69359970210389, 
2.61391569682152, 6.3433679665485, 14.9249216033009, 41.1275149717784, 
82.0861782662955, 100.382874115357, 81.3020338687151, 54.7966365463682, 
21.3347745116999, 5.36748695652174, 1.70811548886738)), .Names = c("site", 
"month", "SWC", "LE"), row.names = c(NA, -60L), class = "data.frame")

当我绘制它时,这是默认图:

library(ggplot2)
ggplot(data = DF, aes(x = SWC, y = LE)) +
  geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
  geom_point() + facet_wrap(~site)

但是,我想手动控制刻面的位置。例如,我想在 facet B 后面加上空格,所以 facet CDE 位于底行。

有什么办法吗?最好的方法是什么?

编辑:我投票重新提出这个问题,因为建议的答案似乎不再有效。例如,names(g$grobs) 返回 NULL。

【问题讨论】:

    标签: r ggplot2 position facet-wrap


    【解决方案1】:

    函数 multiplot 在这里非常有用。

    multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
      library(grid)
    
      # Make a list from the ... arguments and plotlist
      plots <- c(list(...), plotlist)
    
      numPlots = length(plots)
    
      # 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 the page
        grid.newpage()
        pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
    
        # Make each plot, in the correct location
        for (i in 1:numPlots) {
          # Get the i,j matrix positions of the regions that contain 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))
        }
      }
    }
    

    试试这个

    A<-ggplot(data = subset(DF,site=="A"), aes(x = SWC, y = LE)) +
       geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
       geom_point() 
    B<-ggplot(data = subset(DF,site=="B"), aes(x = SWC, y = LE)) +
      geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
      geom_point() 
    C<-ggplot(data = subset(DF,site=="C"), aes(x = SWC, y = LE)) +
      geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
      geom_point() 
    D<-ggplot(data = subset(DF,site=="D"), aes(x = SWC, y = LE)) +
      geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
      geom_point() 
    E<-ggplot(data = subset(DF,site=="E"), aes(x = SWC, y = LE)) +
      geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
      geom_point()
    Blank<-ggplot()
    multiplot(Blank, A, B, C, D, E, cols=3)
    

    【讨论】:

      【解决方案2】:

      试试这个(对于这个特定的场景),

      library(ggplot2)
      ggplot(data = DF, aes(x = SWC, y = LE)) +
        geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
        geom_point() + facet_wrap(~factor(site,levels=c("C","D","E","A","B")), as.table=FALSE)
      

      【讨论】:

        【解决方案3】:

        我最终使用patchwork 包找到了该问题的更通用答案。

        这是一个可重现的例子:

        library(dplyr)
        library(ggplot2)
        library(patchwork)
        
        df <- data.frame(group=c(1,1,2,2,3),
                         name=c('a','b','c','d','e'),
                         x=c(1,2,3,4,5),
                         y=c(2,3,4,5,6))
        
        p1 <-
          df %>% 
          filter(name %in% c("a", "b", "c")) %>% 
          ggplot(aes(x, y)) + 
          geom_point() + 
          xlab(NULL) +
          facet_wrap(~ name, nrow = 1)
        
        p2 <-
          df %>% 
          filter(name %in% c("d", "e")) %>% 
          ggplot(aes(x, y)) + 
          geom_point() + 
          facet_wrap(~ name, nrow = 1)
        
        p1 + p2 & 
          plot_layout(design = "AAAAAAA
                                #######
                                #BBBBB#", 
                      heights = c(3, 0.3, 3))
        

        更多详情请访问:https://github.com/thomasp85/patchwork/issues/205#issuecomment-867999897

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-30
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多