2012-08-09 24 views
27

grid.arrange()をsplit.screen()として機能させるにはどうしますか?私は伝説の真下にテーブルを配置したいと思っています。ggplot2ヒストグラムの凡例の下にテーブルを挿入する

enter image description here

を私はそれがおおよそ次のようになりたい::

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

が生成

enter image description here

私は(split.screenを試してみました)が、それはいないようですggplotタイプのグラフィックを扱う。助言がありますか?ありがとう。

+0

この[リンク](http://learnr.wordpress.com/2009/04/29/ggplot2-labelling-data-series-and-adding-a-data-tableをチェック/) でる。しばらく前とまったく同じことをする必要がありましたが、ここのコードが古いかどうかわかりません。 –

+0

これは古い質問です。あなたがそれらを機能させるには、以下の回答で 'opts'を変更しなければなりません。 – durum

答えて

25

に持つことができました。私の場合は、要素をより詳細に制御できます。

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

非常にクリア...と出力を大幅に制御 – dickoa

+0

@Iselzerあなたの助言をありがとう!とても有難い – Elizabeth

12

まず、このWikiをご覧ください。多くの例があります(arrangeGrobを見てください)。 のでthoses例を使用して、私はこのソリューションDickoaの答えは非常に巧妙である

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

ありがとうございましたこれは非常に役に立ちました! – Elizabeth

+0

wikiリンクが死んでいます – ZN13

+0

@ PajeetRamahari-Mawari-Kulminiありがとう、本当に役に立ちます。私はリンクを更新しました。 – dickoa

関連する問題