Insertion d'un tableau sous la légende dans un histogramme ggplot2
est là de toute façon pour obtenir la grille.organiser() pour agir à titre de split.écran ()? J'aimerais disposer une table directement sous la légende.
#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)
produit:
mais je voudrais qu'il ressemble à peu près comme ceci:
j'ai essayé split.screen () mais il ne semble pas fonctionner avec les graphiques de type ggplot. Toutes les suggestions? Grâce.
27
demandé sur
Elizabeth
2012-08-09 16:50:17
2 réponses
Dickoa la réponse est très soignée. Le mien te donne plus de contrôle sur les éléments.
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)
25
répondu
Luciano Selzer
2012-09-05 08:22:38
tout d'abord , vous devriez jeter un oeil à ce Wiki , il y a de nombreux exemples (regardez l'arrangeGrob one). Donc, en utilisant ces exemples, j'ai réussi à avoir cette solution
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)
12
répondu
dickoa
2016-09-30 18:05:14