2012-12-04 57 views
6

我正在安排由ggplot2生成的圖。我必須使用print來打印出圖表和grid.draw來顯示圖例。如何更改grid.draw的位置

示例代碼:

p0 <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Width, x = Petal.Length, color = Species)) + geom_point() + 
     theme(axis.title.x = element_blank(), 
      axis.title.y = element_blank(), 
      legend.position = "none") 

p1 <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Length, x = Petal.Width, color = Species)) + geom_point() + 
     theme(axis.title.x = element_blank(), 
      axis.title.y = element_blank(), 
      legend.position = "none") 

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

p <- ggplot(data = iris, geom = 'blank', 
     aes(y = Petal.Width, x = Petal.Length, color = Species)) + geom_point() 


grid.newpage() 
pushViewport(viewport(layout = grid.layout(2, 4))) 
print(p0,vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) 
print(p0,vp = viewport(layout.pos.row = 1, layout.pos.col = 2:3)) 
print(p1,vp = viewport(layout.pos.row = 2, layout.pos.col = 2:3)) 
grid.text("This is x label",gp=gpar(fontsize = 14), vjust = 11, 
      vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
grid.text("This is y label",gp=gpar(fontsize = 14), vjust = -11, rot = 90, 
      ![enter image description here][1]vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 

grid.draw(g_legend(p)) 

我想提出的傳說在第四列。我該怎麼做?謝謝。

+3

我已經回滾你的問題,因爲你的上次編輯提出了一個新問題。 – Andrie

回答

9

enter image description here使用gridExtra

  library(gridExtra) 
     grid.arrange(p0 , p1, g_legend(p), ncol=3, 
     heights=c(10, 1),widths =c(1,2,1) ,as.table =TRUE) 
+0

謝謝。有沒有堅持pushviewpoint?我正在安排多個地塊,我需要爲每個地塊設置長度和位置,還需要使用grid.text將文本添加到地塊。 – Autumn

+0

你對此回答不確定嗎?如果是這種情況之前驗證它,然後最好問你一個新的問題,你詳細的請求(許多情節,gtext,..) – agstudy

+0

我編輯了示例代碼和情節。你能幫我嗎? – Autumn

2

可以手動更改在TableGrob對象的x和y座標。例如,你可以做到以下幾點,以在情節的中心圖例位置:

leg <- g_legend(p) 
leg$vp$x <- unit(.5, 'npc') 
leg$vp$y <- unit(.5, 'npc') 

當你調用grid.draw(腿),它將被定位在中心。使用不同的值將其放在任何你喜歡的地方。

+1

我想你的意思是: 腿$ VP $ X < - 單元(0.5, '人大') 腿$ VP $ Y < - 單元(0.5, '人大') ,然後如你所說, grid.draw(腿) – maia

2

在網格,想法是推動地方要繪製的視口,

pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 4)) 
grid.draw(g_legend(p)) 

,或者視分配到傳說GROB,

leg = g_legend(p) 
leg$vp = viewport(layout.pos.row = 2, layout.pos.col = 4) 
grid.draw(leg)