Макет панели по умолчанию для ggplot2 :: facet_wrap ()? - PullRequest
3 голосов
/ 07 февраля 2020

Я пытаюсь понять поведение по умолчанию ggplot2::facet_wrap() с точки зрения того, как макет панели определяется при увеличении числа граней.

Я прочитал файл справки ?facet_wrap, а также погуглил эту топи c с ограниченным успехом. В одном посте SO было сказано, что facet_wrap() "возвращает симметричную матрицу графиков", но я не нашел ничего, что объяснило бы, каким именно будет поведение по умолчанию.

Итак, в следующий раз я сделал серию графиков с увеличивающимся числом граней (код показан ниже).

Set of plots with increasing number of facets

Шаблон на изображении создается впечатление, что facet_wrap() пытается "сделать квадрат" ...

Вопросы

  1. Это правильно? facet_wrap Пытается ли визуализировать панели фасетов так, чтобы они в совокупности были больше похожи на квадрат, с точки зрения количества элементов в строках и столбцах?
  2. Если нет, то что он на самом деле делает? Графические параметры учитывают в?

Код, который сделал сюжет

# load libraries
library(ggplot2)
library(ggpubr)

# plotting function
facetPlots <- function(facets, groups = 8){
   # sample data  
   df <- data.frame(Group = sample(LETTERS[1:groups], 1000, replace = T),
                    Value = sample(1:10000, 1000, replace = T),
                    Facet = factor(sample(1:facets, 1000, replace = T)))
   # get means
   df <- aggregate(list(Value = df$Value), 
                   list(Group = df$Group, Facet = df$Facet), mean)

   # plot
   p1 <- ggplot(df, aes(x= Group, y= Value, fill = Group))+
           geom_bar(stat="identity", show.legend = FALSE)+
           facet_wrap(. ~ Facet) +
           theme_bw()+
     theme(strip.text.x = element_text(size = 6, 
        margin = margin(.1, 0, .1, 0, "cm")),
       axis.text.x=element_blank(),
       axis.ticks=element_blank(),
       axis.title.x=element_blank(),
       axis.text.y=element_blank(),
       axis.title.y=element_blank(),
       plot.margin = unit(c(3,3,3,3), "pt"))
  p1

}

# apply function to list
plot_list <- lapply(c(1:25), facetPlots)
# unify into single plot
plot <- ggpubr::ggarrange(plotlist = plot_list)  

1 Ответ

2 голосов
/ 07 февраля 2020

Вот как рассчитывается число строк и столбцов по умолчанию:

ncol <- ceiling(sqrt(n))
nrow <- ceiling(n/ncol)

По-видимому, facet_wrap имеет тенденцию предпочитать более широкие сетки, поскольку " большинство дисплеев примерно прямоугольные angular "(согласно документации). Следовательно, количество столбцов будет больше или равно количеству строк.

Для вашего примера:

n <- c(1:25)

ncol <- ceiling(sqrt(n))
nrow <- ceiling(n/ncol)

data.frame(n, ncol, nrow)

Вот вычисленные числа строк / столбцов:

#   n   ncol   nrow
#   1      1      1
#   2      2      1
#   3      2      2
#   4      2      2
#   5      3      2
#   6      3      2
#   7      3      3
#   8      3      3
#   9      3      3
#  10      4      3
#  11      4      3
#  12      4      3
#  13      4      4
#  14      4      4
#  15      4      4
#  16      4      4
#  17      5      4
#  18      5      4
#  19      5      4
#  20      5      4
#  21      5      5
#  22      5      5
#  23      5      5
#  24      5      5
#  25      5      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...