2016-05-02 125 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