Как я могу вручную определить размер кадров отдельных графиков при построении нескольких блочных диаграмм с помощью ggplot2?
Если вы, например. имеют график 2x2, и каждый из кадров должен быть квадратным с высотой и шириной 400x400 пикселей, вы не можете установить размер всего графика 800x800, так как все еще есть тексты осей (и они могут быть разные по длине из-за «масштабов Команда ="free_y" в facet_wrap(~variable,scales="free_y"). Это приводит к "сжатым" вместо квадратичных размерам кадра.
p<-ggplot(data=data.frame,aes(x=x,y=value))+
geom_boxplot(size=0.1, fill = "grey90")+
geom_point(aes(x=x, y=value, fill = "black"),inherit.aes=FALSE, colour = "red", size=2, position=position_jitterdodge(jitter.width = 0.25), show.legend=FALSE)+
facet_wrap(~variable,scales = "free_y")+
theme_bw()
Ожидаемый результат: рамки графика всегда должны быть квадратными с высотой и шириной, определяемыми пользователем.





Вы можете сделать это с помощью 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)
Что выглядит следующим образом:
Приведенный вами пример выглядит как результат facet_grid() вместо facet_wrap(). Кроме того, я не совсем уверен, что именно вы имеете в виду, когда говорите «кадр»; на мой взгляд, то, что вы указали красными стрелками, - это панель, так что не могли бы вы уточнить, что вы подразумеваете под рамкой? Вы имеете в виду в том числе полосы? Вы имеете в виду исключение поля по умолчанию 10% вокруг объектов?
Поскольку мне не хватает подходящего слова (извините, я не слишком знаком с терминами r), позвольте мне упростить и сказать, что я имею в виду рамку, граничащую с двумя блочными диаграммами, представленными на изображении (обычно это прямоугольник с черными краями). Изображение, вероятно, facet_grid, но оно было просто для иллюстрации.
Хорошо, я обновлю свой ответ некоторыми вариантами и иллюстрациями!
Большое спасибо - это именно то, что я искал! Очень признателен!
Большое спасибо за быстрый ответ! Определенно интересный подход, но он, похоже, задает размеры панели, а не отдельного кадра. При использовании вашего кода отдельные рамки блочной диаграммы по-прежнему различаются по высоте и ширине. Я добавил быстрый графический пример для пояснения, какие размеры мне нужно установить для определенного значения -> связь. Длина красных стрелок на картинке должна быть установлена на определенные значения, чтобы они всегда были квадратичными.