Как выровнять легенды, включенные в графики последнего столбца аранжировки графиков, используя `plot_grid` из пакета` cowplot`?

Я аранжировал 16 участков (4х4), используя plot_grid из пакета cowplot. Я хочу выровнять последний столбец моей аранжировки, чтобы все легенды были симметричными по вертикали. Я прочитал это, но я не получаю то, что хочу. Не знаю, почему это не работает.

arrange <- plot_grid(P.ADelay.5m,P.ADelay.15m,P.ADelay.25m,P.ADelay.35m + theme(legend.justification = c(0,1)),
                     P.SW.5m,P.SW.15m,P.SW.25m,P.SW.35m + theme(legend.justification = c(0,1)),
                     P.Method.5m,P.Method.15m,P.Method.25m,P.Method.35m + theme(legend.justification = c(0,1)),
                     P.Period.5m,P.Period.15m,P.Period.25m,P.Period.35m + theme(legend.justification = c(0,1)),
                     P.Statistic.5m,P.Statistic.15m,P.Statistic.25m,P.Statistic.35m + theme(legend.justification = c(0,1)),
                     ncol=4, nrow = 5, align = "v" )

arrange

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

Я поделюсь этим фальшивым примером, в котором я проделал ту же процедуру:

library(ggplot2)
library(cowplot)
library(ggpubr)
theme_set(theme_cowplot())

df1 <- data.frame(x = 1:12, y = (1:12)^2)
df1$grp = c('A', 'B', 'C')

df2 <- data.frame(x = 1:12, y = (1:12)^2)
df2$Statistic = c('none', 'Mean')

df3 <- data.frame(x = 1:12, y = (1:12)^2)
df3$Methodology = c('FFFFFF', 'GGGGGGGGG', 'HH','IIIII')

df4 <- data.frame(x = 1:12, y = (1:12)^2)
df4$Depth = c('15m', '1000m')

p1.a <- ggplot(df1, aes(x, y, color=grp)) + geom_point()  + theme(legend.position = "none")
p1.b  <- ggplot(df1, aes(x, y, color=grp)) + geom_point()

p2.a <- ggplot(df2, aes(x, y, color=Statistic)) + geom_point()  + theme(legend.position = "none")
p2.b  <- ggplot(df2, aes(x, y, color=Statistic)) + geom_point()

p3.a <- ggplot(df3, aes(x, y, color=Methodology)) + geom_point()  + theme(legend.position = "none")
p3.b  <- ggplot(df3, aes(x, y, color=Methodology)) + geom_point()

p4.a <- ggplot(df4, aes(x, y, color=Depth)) + geom_point()  + theme(legend.position = "none")
p4.b  <- ggplot(df4, aes(x, y, color=Depth)) + geom_point()

plot_grid(
  p1.a, p1.a, p1.a, p1.b + theme(legend.justification = c(0,1)),
  p2.a, p2.a, p2.a, p2.b + theme(legend.justification = c(0,1)),
  p3.a, p3.a, p3.a, p3.b + theme(legend.justification = c(0,1)),
  p4.a, p4.a, p4.a, p4.b + theme(legend.justification = c(0,1)),
  ncol = 4,align = "hv"
)

of Я получаю сообщение "Предупреждение: графики не могут быть выровнены по вертикали, если не задан параметр оси. Размещение графиков невыровненным".

Как сделать, чтобы легенды выровнять?


person Dekike    schedule 25.05.2020    source источник
comment
Возможно, вам понадобится axis = 'lr' или axis = 'tblr' в вашем plot_grid() звонке   -  person Tung    schedule 25.05.2020
comment
Вы правы, используя либо axis = 'lr', либо axis = 'tblr', я выравниваю легенды. Однако пространство между столбцами резко увеличилось !!! Если не одно, то другое !! Если я уберу v в align="hv", то легенды потеряют свое соответствие. Если я удалю axis = 'lr' или axis = 'tblr', я также потеряю выравнивание. Однако, как я уже сказал вам, выравнивание, которое я получаю, редко, если я сохраняю _7 _ / _ 8_ и align="hv". Ты знаешь почему? Просто чтобы это знать. Сейчас я попробую другое твое предложение.   -  person Dekike    schedule 25.05.2020


Ответы (2)


Вероятно, есть несколько способов справиться с этим, но один из вариантов - разместить легенды в их собственном столбце сетки:

p1.a <- ggplot(df1, aes(x, y, color=grp)) + geom_point() + theme(legend.justification = c(0,0.8))
p1.leg  <- as_ggplot(get_legend(p1.a))
p1.a <- p1.a + theme(legend.position = "none")

p2.a <- ggplot(df2, aes(x, y, color=Statistic)) + geom_point() + theme(legend.justification = c(0,0.8))
p2.leg  <- as_ggplot(get_legend(p2.a))
p2.a <- p2.a + theme(legend.position = "none")

p3.a <- ggplot(df3, aes(x, y, color=Methodology)) + geom_point() + theme(legend.justification = c(0,0.8))
p3.leg  <- as_ggplot(get_legend(p3.a))
p3.a <- p3.a + theme(legend.position = "none")

p4.a <- ggplot(df4, aes(x, y, color=Depth)) + geom_point() + theme(legend.justification = c(0,0.8))
p4.leg  <- as_ggplot(get_legend(p4.a))
p4.a <- p4.a + theme(legend.position = "none")

plot_grid(
  p1.a, p1.a, p1.a, p1.a, p1.leg,
  p2.a, p2.a, p2.a, p2.a, p2.leg,
  p3.a, p3.a, p3.a, p3.a, p3.leg,
  p4.a, p4.a, p4.a, p4.a, p4.leg,
  ncol = 5, align = "hv"
)

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

person dww    schedule 26.05.2020
comment
Спасибо @dww за то, что посмотрели на это. Я очень ценю это. Знаете ли вы, есть ли способ оставить только одну метку X в оси X и одну метку Y в оси Y и обе по центру, а также добавить имя в каждый столбец? В этом примере, как и в моих реальных данных, все графики используют одни и те же единицы для оси x и оси y. Изменения заключаются в том, что в каждой строке используются разные легенды, а в каждом столбце - разные переменные. - person Dekike; 26.05.2020
comment
В этом сообщении (stackoverflow.com/questions/61997737/). Я спросил, как возьми. В конце концов, я сам нашел решение, но оно кажется непростым. Прошу на всякий случай, если есть способ попроще. - person Dekike; 26.05.2020

Вы можете использовать пакет patchwork. Я нахожу это намного быстрее, чем cowplot.

library(ggplot2)
library(cowplot)
#> 
#> ********************************************************
#> Note: As of version 1.0.0, cowplot does not change the
#>   default ggplot2 theme anymore. To recover the previous
#>   behavior, execute:
#>   theme_set(theme_cowplot())
#> ********************************************************
theme_set(theme_cowplot())

df1 <- data.frame(x = 1:12, y = (1:12)^2)
df1$grp = c('A', 'B', 'C')

df2 <- data.frame(x = 1:12, y = (1:12)^2)
df2$Statistic = c('none', 'Mean')

df3 <- data.frame(x = 1:12, y = (1:12)^2)
df3$Methodology = c('FFFFFF', 'GGGGGGGGG', 'HH','IIIII')

df4 <- data.frame(x = 1:12, y = (1:12)^2)
df4$Depth = c('15m', '1000m')

p1.a <- ggplot(df1, aes(x, y, color=grp)) + geom_point()  + theme(legend.position = "none")
p1.b  <- ggplot(df1, aes(x, y, color=grp)) + geom_point() + theme(legend.justification = c(0,1)) 

p2.a <- ggplot(df2, aes(x, y, color=Statistic)) + geom_point()  + theme(legend.position = "none")
p2.b  <- ggplot(df2, aes(x, y, color=Statistic)) + geom_point() + theme(legend.justification = c(0,1))

p3.a <- ggplot(df3, aes(x, y, color=Methodology)) + geom_point()  + theme(legend.position = "none")
p3.b  <- ggplot(df3, aes(x, y, color=Methodology)) + geom_point() + theme(legend.justification = c(0,1))

p4.a <- ggplot(df4, aes(x, y, color=Depth)) + geom_point()  + theme(legend.position = "none")
p4.b  <- ggplot(df4, aes(x, y, color=Depth)) + geom_point() + theme(legend.justification = c(0,1))


library(patchwork)
#> 
#> Attaching package: 'patchwork'
#> The following object is masked from 'package:cowplot':
#> 
#>     align_plots

# define plot layout 4 x 4
layout <- "
ABCD
EFGH
IJKL
MNOP
"

p1.a + p1.a + p1.a + p1.b +
p2.a + p2.a + p2.a + p2.b +
p3.a + p3.a + p3.a + p3.b +
p4.a + p4.a + p4.a + p4.b +
  plot_layout(design = layout)

Создано 25 мая 2020 г. пакетом REPEX (v0.3.0)

person Tung    schedule 25.05.2020
comment
Спасибо @Tung, можешь рассказать, как работает patchwork? Я имею в виду, я вижу, вы написали «layout‹ - ABCD EFGH IJKL MNOP ». Это для указания порядка расположения графиков? Заранее спасибо! - person Dekike; 25.05.2020
comment
Да, он сообщает, где разместить каждый отдельный график в этой матрице. Вы можете заменить ABCD на AABB или AAAA, чтобы увидеть, как изменится сюжет - person Tung; 25.05.2020
comment
Это выглядит лучше, чем другие альтернативы, которые я использовал. Однако выравнивание не идеальное. Я обновил сообщение и добавил картинку с моим фактическим расположением сюжетов, используя ваше предложение (patchwork package). Вы знаете, почему выравнивание не идеальное? - person Dekike; 25.05.2020
comment
Вы должны поэкспериментировать с тем, как вы настраиваете легенды сюжета. Я не думаю, что patchwork может сделать что-нибудь лучше - person Tung; 25.05.2020