Вы можете сделать это с gtables следующим образом.Сначала мы построим график.
library(ggplot2)
library(grid)
# I don't have your data so I'll just use the diamonds dataset
p <- ggplot(diamonds, aes(x = cut, y = price)) +
geom_boxplot() +
facet_wrap(~ clarity, scales = "free_y")
Затем мы преобразуем график в gtable, получим расположение панелей и отрегулируем ширину и высоту по нашему вкусу.
gt <- ggplotGrob(p)
# Usually panels don't span multiple cells in the table, so we can take the
# left ("l") and top ("t") positions of the panels.
panel_x <- panel_cols(gt)[,"l"]
panel_y <- panel_rows(gt)[,"t"]
gt$widths[panel_x] <- unit(400/72, "inches")
gt$heights[panel_y] <- unit(400/72, "inches")
grid.newpage(); grid.draw(gt)
К сожалению, функция unit()
не позволяет указывать размеры в пикселях, поэтому я предположил, что разрешение вашего вывода будет 72 пикселя на дюйм.Посмотрите на ?unit
, чтобы увидеть варианты.
РЕДАКТИРОВАТЬ:
Вот как выглядит выше (для краткости unit(100/72, "inches")
):

Теперь, если вы также хотите, чтобы полосы (текст, выглядящий как заголовки панелей в более темном поле) были включены в поле 400x400, возможно, вы захотите найти положения полос вдольстроки и вычтите их из единиц, которые вы поставляете.
gt <- ggplotGrob(p)
panel_x <- panel_cols(gt)[,"l"]
panel_y <- panel_rows(gt)[,"t"]
strip_y <- unique(gt$layout$t[grepl("strip", gt$layout$name)])
gt$widths[panel_x] <- unit(100/72, "inches")
gt$heights[panel_y] <- unit(100/72, "inches") - gt$heights[strip_y]
grid.newpage(); grid.draw(gt)
Что выглядит следующим образом:
