leyenda - superponer graficas en r ggplot
Insertar una tabla debajo de la leyenda en un histograma ggplot2 (2)
¿Hay alguna forma de hacer que grid.arrange () actúe como split.screen ()? Me gustaría organizar una mesa que se ubicará directamente debajo de la leyenda.
#create histogram
my_hist<-ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
#create inset table
my_table<- tableGrob(head(diamonds)[,1:3],gpar.coretext =gpar(fontsize=8),gpar.coltext=gpar(fontsize=8), gpar.rowtext=gpar(fontsize=8))
grid.arrange(my_hist,my_table, ncol=2)
produce:
pero me gustaría que se vea más o menos así:
Intenté split.screen () pero no parece funcionar con los gráficos del tipo ggplot. ¿Alguna sugerencia? Gracias.
La respuesta de Dickoa es muy clara. El mío te da más control sobre los elementos.
my_hist <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
#create inset table
my_table <- tableGrob(head(diamonds)[,1:3], gpar.coretext = gpar(fontsize=8), gpar.coltext=gpar(fontsize=8), gpar.rowtext=gpar(fontsize=8))
#Extract Legend
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]]
return(legend)}
legend <- g_legend(my_hist)
#Create the viewports, push them, draw and go up
grid.newpage()
vp1 <- viewport(width = 0.75, height = 1, x = 0.375, y = .5)
vpleg <- viewport(width = 0.25, height = 0.5, x = 0.85, y = 0.75)
subvp <- viewport(width = 0.3, height = 0.3, x = 0.85, y = 0.25)
print(my_hist + opts(legend.position = "none"), vp = vp1)
upViewport(0)
pushViewport(vpleg)
grid.draw(legend)
#Make the new viewport active and draw
upViewport(0)
pushViewport(subvp)
grid.draw(my_table)
Primero deberías echarle un vistazo a esta Wiki , hay muchos ejemplos (mira el archivo OrganGrob). Entonces, usando estos ejemplos, logré tener esta solución
require(gridExtra)
require(ggplot2)
## original graph
my_hist <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
## get the legend
tmp <- ggplot_gtable(ggplot_build(my_hist))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
## create inset table
my_table <- tableGrob(head(diamonds)[,1:3],gpar.coretext =gpar(fontsize=8),gpar.coltext=gpar(fontsize=8), gpar.rowtext=gpar(fontsize=8))
### final result
grid.arrange(my_hist + opts(legend.position = "none"), arrangeGrob(legend, my_table), ncol = 2)