Одинаковая высота панелей на разных графиках facet_grid, ggplot2 R

Я хочу иметь два графика facet_grid рядом, один с 3 строками, а другой с 2, используя ggplot2 в R. По умолчанию grid.arrange пытается поддерживать равную высоту двух facet_grids, однако я хочу иметь одинаковую высоту панели для обоих графиков. В частности Я хочу настроить высоту панели графика с наименьшим количеством строк, чтобы она была равна высоте панели графика с максимальным количеством строк. Я не думаю, что это должно быть очень сложно. Я упускаю какую-то общую идею здесь? Поскольку я новичок в R, буду признателен за любую помощь. Спасибо!

Воспроизводимый пример здесь:

library(tidyverse)
library(gridExtra)
mtcars
p1 <- ggplot(mtcars,aes(x =mpg,y = disp,fill=cyl))+
geom_point()+
facet_grid(rows=vars(gear),cols=vars(cyl),scales = "free")

p2 <- ggplot(mtcars,aes(x =mpg,y = disp,fill=cyl))+
  geom_point()+
  facet_grid(rows=vars(am),cols=vars(cyl),scales = "free")

grid.arrange(p1,p2,ncol=2)

который производит

фацетный график 3x3 того же размера, что и фасетный график 2x3

Я хочу, чтобы p2 имел высоту панели от p1 и использовал нижнее пустое пространство от p2 (справа) для легенды, оставшееся пространство было пустым. И да, я должен поддерживать масштаб, чтобы быть свободным.


person Suwas Ghimire    schedule 13.07.2020    source источник


Ответы (1)


не очень элегантно, но вы, возможно, можете нарисовать пустой прямоугольник, объединить его по вертикали с вашим p2, а затем объединить с p1:

library(grid)
empty_panel <- grid.rect(gp=gpar(col="white"))

p2t <- grid.arrange(p2,empty_panel,ncol=1, heights=c(0.7,0.3))
grid.arrange(p1,p2t,ncol=2)

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

Если вы хотите, чтобы дополнительное пространство использовалось для размещения, например, вашей легенды, вы можете поиграть с legend.position и plot.margin:

p2 <- ggplot(mtcars,aes(x =mpg,y = disp,fill=cyl))+
   geom_point()+
   facet_grid(rows=vars(am),cols=vars(cyl),scales = "free")+
   
   theme(plot.margin= unit(c(0, 0, 4, 0), "cm")     ,legend.position = c(0.5, -0.3))
 
 grid.arrange(p1,p2,ncol=2) 

требуется некоторая ручная настройка.

сюжет будет выглядеть так: введите здесь описание изображения

person efz    schedule 13.07.2020
comment
@efz Большое спасибо за ответ. Однако это был не совсем тот, кого я искал. На самом деле я хочу сохранить информацию, как легенду, в этом пустом месте, чтобы весь сюжет выглядел лучше. С этой идеей мне нужно провести испытания, чтобы определить размер пустой панели. У вас есть лучшая идея для этого? - person Suwas Ghimire; 13.07.2020
comment
@SuwasGhimire Вы должны отредактировать вопрос с этой информацией, это важно. Хотите/можете ли вы относиться к пустому пространству как к третьему сюжету? Единственное, что я вижу, что может улучшить этот ответ, - это опустить правую легенду сюжета, чтобы выровнять ее с левой. - person Rui Barradas; 13.07.2020
comment
@ Руи Баррадас, ты меня правильно понял. Это то, чего я точно хочу. Я хочу, чтобы легенда со 2-го сюжета (правого) здесь, в данном случае, была на пустом месте. (вопрос отредактирован соответственно) - person Suwas Ghimire; 13.07.2020
comment
@SuwasGhimire, посмотрите, станет ли мой отредактированный ответ ближе к тому, что вам нужно - person efz; 13.07.2020
comment
@ Большое спасибо, efz. Это ближе к тому, что я ищу. Я отметил это как ответ. - person Suwas Ghimire; 13.07.2020