2016-05-02 83 views
4

我想手動(或自動)修改R中ggplot2圖形的分面圖形的面板佈局。我已經看到Facets的註解和重新排序的解決方案,但沒有看到這個具體問題。這裏是一個重複的例子:ggplot2 move facet layout

library(ggplot2) 
plot <- ggplot(diamonds, aes(carat, price)) + facet_wrap(~cut) + geom_point() 

如果我現在在情節看,你看到的是空白刻面的情節格的右下角分配。

enter image description here 我想要做的就是讓空白圖位置位於左上角,但仍然繪製所有其他圖(只移動空白圖位置)。

我試着尋找ggplot_build()這樣:

plot_build <- ggplot_build(plot) 
plot_build$panel$layout 

,但我無法弄清楚如何真正移動空白地塊位置,以正確的行和列。有沒有人有任何想法?

+0

不應右上方面板移動到左下角,其他兩個沿底部移動一個面板?在下面的答案中的面板無論你讀的是什麼方式 – rawr

+0

@rawr我也想知道最後一列中x軸發生了什麼。這是最近的ggplot2功能嗎? – baptiste

+1

@baptiste它不會顯示在<2.0或者沒有free_x比例的情況下,並且如果您使用了答案,則軸不會隨着情節向下移動。但我不記得它曾經沒有出現過。然而,我使用了類似於[this](http://stackoverflow.com/questions/13297155/add-floating-axis-labels-in-facet-wrap-plot)的軸 – rawr

回答

6

你可以在gtable移動面板,

library(grid) 
library(ggplot2) 

p <- ggplot(diamonds, aes(carat, price)) + 
     facet_wrap(~cut) + geom_point() 

g <- ggplotGrob(p) 

gl <- g$layout 
idcol <- gl$r == (ncol(g)-2) 
g$layout[idcol & gl$b < 5, c("t", "b")] <- gl[idcol & gl$b < 5, c("t", "b")] + 4 
grid.newpage() 
grid.draw(g) 

enter image description here

+0

太棒了,這正是我一直在尋找的,謝謝!你介意解釋什麼佈局列代表(或有一個網站,你可以指向我)? – sjfox

+1

不幸的是,沒有文檔,它是一個試驗和錯誤的遊戲,並且每次更新包時都會隨機更改。我曾經在[gridextra維基]上創建了一個介紹文檔(https://github.com/baptiste/gridextra/wiki/gtable) – baptiste

+0

這很不幸,但不用擔心我會玩弄它。非常感謝@baptiste! – sjfox