2012-08-09 15 views
27

Czy jest jeszcze jakiś sposób, aby grid.arrange() działał jako split.screen()? Chciałbym ustawić stół, który będzie umiejscowiony bezpośrednio pod legendą.Wstawianie tabeli pod legendą na histogramie 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) 

produkuje:

enter image description here

ale chciałbym to wyglądać mniej więcej tak:

enter image description here

Próbowałem split.screen(), ale nie wydaje się do pracy z grafiką typu ggplot. Jakieś sugestie? Dzięki.

+0

Sprawdź to [link] (http://learnr.wordpress.com/2009/04/29/ggplot2-labelling-data-series-and-adding-a-data-table /) out. Potrzebowałem zrobić dokładnie to samo jakiś czas temu, chociaż nie jestem pewien, czy ten kod jest już nieaktualny, czy nie. –

+0

To jest stare pytanie, musisz zmienić 'opts' w poniższych odpowiedziach, jeśli chcesz, aby działały. – durum

Odpowiedz

25

odpowiedź Dickoa jest bardzo schludny. Mój daje ci większą kontrolę nad żywiołami.

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

bardzo wyraźne ... i świetna kontrola nad wydajnością – dickoa

+0

@Iselzer Dziękuję za poradę! Bardzo doceniane – Elizabeth

12

Najpierw powinieneś spojrzeć na to Wiki, jest wiele przykładów (spójrz na aranżację GUrob). Więc za pomocą thoses przykłady, udało mi się mieć to rozwiązanie

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

Dziękuję, to było bardzo pomocne! – Elizabeth

+0

Link do wiki jest martwy – ZN13

+0

@ PajeetRamahari-Mawari-Kulmini Wielkie dzięki, jest naprawdę pomocny. Zaktualizowałem linki. – dickoa

Powiązane problemy