ggplot отдельная легенда и сюжет
Я использую сетку lpackage для размещения графиков, которые я сделал с помощью ggplot2:
library(ggplot2)
library(grid)
Layout <- grid.layout(nrow = 4, ncol = 4,
widths = unit(1, "null"),
heights = unit(c(0.4, 0.8, 1.2, 1.2), c("null", "null", "null")))
grid.show.layout(Layout)
plot1 = ggplot(diamonds, aes(clarity, fill = color)) +
geom_bar() +
facet_wrap(~cut, nrow = 1)
print(plot1 + theme(legend.position = "none"),
vp = viewport(layout.pos.row = 3, layout.pos.col = 1:4))
Проблема в том, что я хочу поместить график в третий ряд (3,1) - (3,4) и поместить легенду в положение (4,4). К сожалению, я не могу найти способ создать просто переменную легенды. Я искал в Интернете, и самый близкий, который я получил, использовал более старый + opts(keep = "legend_box")
но это устарело.
2 ответа
Вы можете получить легенду от grob
объект ggplot. Тогда вы могли бы использовать grid.arrange
Функция для позиционирования всего.
library(gridExtra)
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
legend
}
legend <- g_legend(plot1)
grid.arrange(legend, plot1+ theme(legend.position = 'none'),
ncol=2, nrow=1, widths=c(1/6,5/6))
В Интернете есть много примеров использования g_legend
функция.
НТН
Существует функция grid_arrange_shared_legend, предложенная самими разработчиками ggplot2: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs, которая работает довольно хорошо.