考虑一个分面的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)
如何从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。有什么建议吗?
答案 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()
}