从分面ggplot中提取行数

时间:2017-05-22 07:32:11

标签: r ggplot2

考虑一个分面的ggplot

plotdf <- data.frame(x = 1:21, 
                     y = 3*(1:21)+4, 
                     z = c(rep(1,3), rep(2,3), rep(3,3), rep(4,3), rep(5,3), rep(6,3), rep(7,3)))

p <- ggplot2::ggplot(plotdf) + 
     ggplot2::geom_point(ggplot2::aes(x=x,y=y)) + 
     ggplot2::facet_wrap(~ z)

enter image description here

如何从p?

中提取行数(或cols)

p $ facet似乎包含相关信息:

p$facet
    <ggproto object: Class FacetWrap, Facet>
        compute_layout: function
        draw_back: function
        draw_front: function
        draw_labels: function
        draw_panels: function
        finish_data: function
        init_scales: function
        map: function
        map_data: function
        params: list
        render_back: function
        render_front: function
        render_panels: function
        setup_data: function
        setup_params: function
        shrink: TRUE
        train: function
        train_positions: function
        train_scales: function
        super:  <ggproto object: Class FacetWrap, Facet>

但我无法从中提取nrow或ncol。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

如果您未手动定义行数或列数,则会使用wrap_dims为您计算。

所以,在你的例子中:

n_panels <- length(unique(ggplot_build(p)$data[[1]]$PANEL))

wrap_dims(n_panels)
[1] 3 3

为了考虑任何手动定义,我们也可以查找这些参数,例如ggplot_build(p)$layout$facet$params$nrow给出了行数。

然后获取行数和列数的函数:

get_row_col <- function(p) {
  n <- length(unique(ggplot_build(p)$data[[1]]$PANEL))
  par <- ggplot_build(p)$layout$facet$params
  wrap_dims(n, par$nrow, par$ncol)
}
> get_row_col(p)
[1] 3 3

答案 1 :(得分:1)

gg_facet_nrow <- function(p){
   assertive.types::assert_is_any_of(p, 'ggplot')
   p %>% ggplot2::ggplot_build()            %>%
         magrittr::extract2('layout')       %>%
         magrittr::extract2('panel_layout') %>%
         magrittr::extract2('ROW')          %>%
         unique()                           %>%
         length()
}

gg_facet_nrow(p)

答案 2 :(得分:1)

在@Aditya的回答之后,这是(自ggplot 3.1.1起):

gg_facet_nrow_ng <- function(p){
 assertive.types::assert_is_any_of(p, 'ggplot')
 p %>%
   ggplot2::ggplot_build() %>%
   magrittr::extract2('layout') %>% 
   magrittr::extract2('layout') %>%
   magrittr::extract2('ROW') %>%
   unique() %>%
   length()
}