guides = "collect" выполняет свою работу, но размещает легенду таким образом, что она перекрывает сюжет. Я бы хотел, чтобы он располагался прямо посередине пустого нижнего правого угла, но это кажется сложным, так как theme(legend.position = c(X,Y)) не работает с patchwork
Иллюстрация выпуска:

Это код, который у меня есть для сборки 4 графиков, которые я использую patchwork. Почти уверен, что есть более элегантный способ использования theme(), но я новичок в patchwork, и до сих пор он работал для меня, за исключением позиционирования легенды.
Похожая проблема решалась тут но в моем случае не помогает.
#first panel
s_wpanels_final <- (dots & theme_bw() & theme(axis.title.x =
element_blank(), panel.grid.minor.y = element_blank())) +
#second panel
(g_box_tmax & theme_bw() & theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank(), panel.grid.minor.y = element_blank(),
axis.text.y=element_blank(), axis.ticks.y=element_blank(),
axis.title.x = element_blank(), legend.position = "none")) +
#third panel
(g_box_t0 & theme_bw() & theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank(), panel.grid.minor.y = element_blank(),
axis.text.y=element_blank(), axis.ticks.y=element_blank(),
axis.title.x = element_blank(), legend.position = "none")) +
#fourth panel
(tmax_box & theme_bw() & theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank(), axis.text.y=element_blank(),
axis.ticks.y=element_blank(), axis.title.y = element_blank(),
legend.position = "none")) +
guide_area()+
plot_layout(ncol=3, guides = "collect", widths=c(6,1,1), heights=c(6,1)) &
theme(legend.direction = "vertical", legend.box = "horizontal")





То, что заставляет поле легенды (которое слишком велико для размера сюжета) располагаться там, вероятно, является довольно умным лоскутным кодом и связано с guide_area (поэтому мой заголовок вопроса редактируется).
Ниже приведен немного неудовлетворительный, но эффективный способ изменения позиции. Это немного проб и ошибок. Просто задайте отрицательное поле для поля легенды справа, и оно будет соответствующим образом «перетаскивать» поле.
Я удалил все legend.position = "none" с ваших графиков, так как это не нужно с guides = "collect"
library(ggplot2)
library(patchwork)
p1 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width, color = Species, size = Petal.Length))
p2 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width, color = Species, size = Petal.Length))
p3 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width, color = Species, size = Petal.Length))
p4 <- ggplot(iris) + geom_point(aes(Sepal.Length, Sepal.Width, color = Species, size = Petal.Length))
p1 + p2 + p3 + p4 +
guide_area()+
plot_layout(ncol=3, guides = "collect", widths=c(6,1,1), heights=c(6,1)) &
theme(legend.direction = "vertical", legend.box = "horizontal",
legend.box.margin = margin(r = -1, unit = "in"))
Есть две проблемы с вашим кодом. Сначала используйте +, чтобы склеить графики, а установка ncol=3 поместит guide_area во второй столбец второй строки. Чтобы центрировать легенду, я бы предложил использовать аргумент design, чтобы указать макет графика. Во-вторых, в то время как панели графика будут подстраиваться под пространство, заданное с помощью аргументов height и ширины, а также размера вашего графического устройства, легенда не будет, т. е. если легенда не будет вписываться в заданное пространство, она будет перекрываться с окружающими панелями. Чтобы исправить это, я бы предложил увеличить ширину второго и третьего столбцов и высоту второй строки. Но, как я уже сказал, это также зависит от размера устройства для рисования.
Используя какой-то поддельный пример графика, основанный на mtcars (см. Ниже), давайте сначала воспроизведем вашу проблему:
library(ggplot2)
library(patchwork)
list(
dots,
g_box_tmax,
g_box_t0,
tmax_box,
guide_area()
) |>
wrap_plots() +
plot_layout(guides = "collect", widths = c(6, 1, 1), heights = c(6, 1), ncol = 3) &
theme(legend.direction = "vertical", legend.box = "horizontal")
Однако указание макета с помощью аргумента design и увеличение высоты второй строки, а также ширины второго и третьего столбцов работает нормально и центрирует легенду в области направляющей:
design <-
"
ABC
DEE
"
list(
dots,
g_box_tmax,
g_box_t0,
tmax_box,
guide_area()
) |>
wrap_plots() +
plot_layout(guides = "collect", widths = c(6, 1.5, 1.5), heights = c(6, 1.5), design = design) &
theme(legend.direction = "vertical", legend.box = "horizontal")
УЧАСТКИ
dots <- ggplot(mtcars, aes(mpg, hp, color = factor(cyl), size = qsec)) +
geom_point() +
theme_bw() +
theme(
axis.title.x = element_blank(),
panel.grid.minor.y = element_blank()
)
g_box_tmax <- g_box_t0 <- ggplot(mtcars, aes(factor(cyl), hp, fill = factor(cyl))) +
geom_boxplot() +
theme_bw() +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(), panel.grid.minor.y = element_blank(),
axis.text.y = element_blank(), axis.ticks.y = element_blank(),
axis.title.x = element_blank(), legend.position = "none"
)
tmax_box <- ggplot(mtcars, aes(mpg, factor(cyl), fill = factor(cyl))) +
geom_boxplot() +
theme_bw() +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(), axis.text.y = element_blank(),
axis.ticks.y = element_blank(), axis.title.y = element_blank(),
legend.position = "none"
)
Используется
mtcarsдля создания примеров графиков, но согласитесь, что даже при центрировании легенда слишком велика, и нам нужно больше места, чтобы избежать перекрытия.