Центрированная этикетка по оси X для нескольких участков с использованием пакета cowplot

У меня есть многосюжетная фигура, состоящая из 4-х графиков в конфигурации 2x2. Я расположил графики с помощью пакета "cowplot" и функции plot_grid, используя приведенный ниже код.

plot_grid(p1, p2, p3, p4, align='vh', vjust=1, scale = 1)

где p1-p4 - мои 4 графика. Результирующий рисунок имеет метку оси X, связанную с каждым столбцом в мультиплоте:

введите описание изображения здесь

Кто-нибудь знает, как я могу закодировать одну метку оси X с центром в нижней части мультиплота, либо с cowplot, либо другим способом?


person Jason    schedule 13.10.2015    source источник
comment
Нет данных для кода. Стратегия, которую следует использовать для взлома или встраивания необычного, эр, я имею в виду «непонятного», подпрограммы построения пакета, состоит в том, чтобы сначала определить парадигму построения (базовая, решетка или ggplot), а затем выполнить поиск методов аннотации или маргинальной маркировки для использования с соответствующая основная функция построения графика.   -  person IRTFM    schedule 14.10.2015


Ответы (2)


Другой вариант - использовать textGrob для добавления аннотаций для общих меток x и y.

В этом примере, если вы хотите удалить отдельные метки осей, просто включите theme(axis.title = element_blank()) в вызовы графика. (или просто для оси Y используйте theme(axis.title.y=element_blank())).

library(ggplot2)
library(cowplot)
library(grid)
library(gridExtra)

ToothGrowth$dose <- as.factor(ToothGrowth$dose)

#make 4 plots

p1<-ggplot(ToothGrowth, aes(x=dose, y=len)) + 
  geom_boxplot()


p2<-ggplot(ToothGrowth, aes(x=dose, y=supp)) + 
  geom_boxplot()

p3<-ggplot(ToothGrowth, aes(x=supp, y=len)) + 
  geom_boxplot()

p4<-ggplot(ToothGrowth, aes(x=supp, y=dose)) + 
  geom_boxplot()

#combine using cowplot

plot<-plot_grid(p1, p2, p3, p4, align='vh', vjust=1, scale = 1)

#create common x and y labels

y.grob <- textGrob("Common Y", 
                   gp=gpar(fontface="bold", col="blue", fontsize=15), rot=90)

x.grob <- textGrob("Common X", 
                   gp=gpar(fontface="bold", col="blue", fontsize=15))

#add to plot

grid.arrange(arrangeGrob(plot, left = y.grob, bottom = x.grob))

введите описание изображения здесь

person J.Con    schedule 22.05.2018
comment
Если объект, производный от plot_grid, будет содержать дополнительную строку, например легенда (plot_grid (plot, get_legend (another_plot), nrow = 2); возможно ли получить xgrob между легендой и сюжетом? - person nouse; 03.07.2018
comment
@nouse попробуй plot2<-grid.arrange(arrangeGrob(plot, left = y.grob, bottom = x.grob)), потом plot_grid(plot2, get_legend(another_plot),nrow=2). - person J.Con; 05.07.2018
comment
Отлично! Я не знаком с функцией «аранжироватьГроб ()». Какие аргументы следует использовать, чтобы разместить xgrob ближе к участку? - person nouse; 05.07.2018
comment
@nouse выбирает plot_grid(plot2, get_legend(legend_plot),nrow=2, rel_heights = c(6,1)), настраивая rel_heights в соответствии со своими потребностями. - person J.Con; 06.07.2018
comment
@ J.Con, что, если мы хотим немного переместить лаборатории вправо или влево? Как мы могли это сделать? В моем случае у меня есть третий столбец с легендой для каждой строки (графики в одной строке имеют одну и ту же легенду). Таким образом, X-lab должен быть посередине между первым и вторым столбцами, не учитывая третий столбец. Как я мог переместить x-lab? - person Dekike; 24.05.2020
comment
Я задал этот вопрос в StackOverflow, связанный с тем, что я вам задал. Буду очень признателен, если вы мне поможете: stackoverflow.com/questions/61990003/ - person Dekike; 24.05.2020

Это немного поздно, но у меня была та же проблема, поэтому, надеюсь, следующий человек, который рассмотрит этот вопрос, найдет это полезным.

library(cowplot)
plot<-plot_grid(p1, p2, p3, p4, align='vh', vjust=1, scale = 1)
ggdraw(add_sub(plot, "Label", vpadding=grid::unit(0,"lines"),y=6, x=0.5, vjust=4.5))
person J.Con    schedule 21.09.2016
comment
Спасибо. Не могли бы вы также прокомментировать, как сделать то же самое для оси Y? - person AK47; 22.05.2018
comment
@ AK47 посмотрите мой новый ответ. :) - person J.Con; 23.05.2018