R-marrangeGrob уникальная легенда - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть список из 45 объектов ggplot, которые я размещаю на нескольких страницах благодаря функции marrangeGrob () из gridExtra. Я хотел бы показать одинаковую и уникальную легенду на каждой странице.

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

Я использовал g_legend (), чтобы извлечь мою легенду

g_legend<-function(a.gplot){
 g <- ggplotGrob(a.gplot + theme(legend.position = "right"))$grobs
 legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
 return(legend)}

Чтобы упростить, воспроизводимыйнабор данных из алмазов, и скажем, я хочу произвести на одной странице p1 и p2 и на другой странице p2 и p1.

df <- count(diamonds, cut)

p1 = ggplot(df, aes(x=cut, y=n, label=format(n, big.mark=","), fill=cut)) +
geom_bar(stat="identity") +
geom_text(aes(y=0.5*n), colour="white") +
coord_flip() +
theme(legend.position="bottom")

p2 = ggplot(diamonds %>% sample_n(1000), aes(x=carat, y=price, colour=cut)) +
geom_point()

leg = g_legend(p1)

Сначала я пытаюсь построить 4 графика на одной странице

combined<-arrangeGrob(do.call("arrangeGrob",c(
lapply(list(p1,p2,p2,p1), function(x){ x + theme(legend.position="none")}),ncol=2)),
 leg,
 ncol = 2)
grid.newpage()
grid.draw(combined)

, который отлично работает, но когда я пытаюсь сделать это с несколькими страницами

marrangeGrob(do.call("marrangeGrob",c(lapply(list(p1,p2,p2,p1), function(x){ x + theme(legend.position="none")}),
 ncol=2,nrow=2)),
 leg,
 ncol = 2,nrow=1)

Я получил: Ошибка в $<-.data.frame (*tmp*, "wrapvp", value = list (x= 0.5, y = 0.5,: замена имеет 17 строк, данные имеют 5

Кто-нибудь знает способ использования marrangeGrob и получения уникальной легенды на каждой многостраничной странице?

...