2012-08-09 9 views
27

Gibt es sowieso, grid.arrange() zu erhalten, um als split.screen() zu fungieren? Ich möchte einen Tisch direkt unter der Legende platzieren.Einfügen einer Tabelle unter der Legende in einem Histogramm ggplot2

#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) 

produziert:

enter image description here

aber ich würde es in etwa so aussehen mag:

enter image description here

ich split.screen versucht(), aber es scheint nicht, mit Grafiken vom Typ ggplot arbeiten. Irgendwelche Vorschläge? Vielen Dank.

+0

prüfen diese [link] (http://learnr.wordpress.com/2009/04/29/ggplot2-labelling-data-series-and-adding-a-data-table /) aus. Ich musste das Gleiche vor einer Weile tun, obwohl ich nicht sicher bin, ob der Code hier veraltet ist oder nicht. –

+0

Dies ist eine alte Frage, Sie müssen 'opts' in den Antworten unten ändern, wenn Sie sie arbeiten lassen wollen. – durum

Antwort

25

Dickoa Antwort ist sehr gepflegt haben. Meine gibt dir mehr Kontrolle über die Elemente.

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) 

enter image description here

+0

sehr klar ... und gute Kontrolle über den Ausgang – dickoa

+0

@Iselzer Vielen Dank für Ihren Hinweis! Sehr geschätzt – Elizabeth

12

Zuerst sollten Sie sich diese Wiki ansehen, es gibt viele Beispiele (schauen Sie sich die arrangeGrob an). So thoses Beispielen, konnte ich diese Lösung

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) 

enter image description here

+0

Vielen Dank das war sehr hilfreich! – Elizabeth

+0

wiki link ist tot – ZN13

+0

@ PajeetRamahari-Mawari-Kulmini Vielen Dank, es ist wirklich hilfreich. Ich habe die Links aktualisiert. – dickoa

Verwandte Themen