在 ggplot 中从右到左排列面板

Order the panels from right to left in ggplot

我有一个包含 5 个组的数据框。 我想使用 ggplot 按组对我的数据进行分面。我需要面板从右到左排序,而不是从左到右(默认)。

df <- data.frame(group=letters[1:5],
       x=1:5,
       y=1:5)
ggplot(df, aes(x,y)) + 
geom_point(size=3) + 
facet_wrap(~group)

默认情况下,面板是从左到右排列的,因此 'a' 组出现在图表的左上角。右下角的面板是空的(因为只有 5 个组)。我希望面板从右到左出现。也就是说,'a' 应该出现在右上角,而左下角的面板应该是空的。有什么想法吗?

注意:问题与面板的标签无关。它也与使用 factor() 重新排序组无关。 我查看了 facet_wrap() 帮助,但唯一的选择是处理标签的 'switch' 和 'strip.position' 参数。 'dir' 参数允许垂直或水平位置,这不是我要找的。

提前致谢

这里有一个有点hacky的解决方案,因为它需要手动定位。我们创建一个绘图函数,然后分别绘制第一行图(df 的第 1 到 3 行和第二行图(df 的第 4 行和第 5 行)。我们使用 grid.arrange,但我们在第二行的左端添加了一个只有 y 轴的空白图,以创建空白 space。

必须手动调整 widths 参数才能使空白图占据恰到好处的 space 数量,以便其他两个图与上面的图垂直对齐。

library(gridExtra)
library(grid)

pf = function(data, xrng=range(df$x), yrng=range(df$y)) {
  ggplot(data, aes(x,y)) + 
    geom_point(size=3) + 
    facet_wrap(~ factor(group, rev(group))) +
    scale_y_continuous(limits=yrng) +
    scale_x_continuous(limits=xrng)
}

grid.arrange(pf(df[1:3,]), 
             arrangeGrob(pf(data.frame(x=-10,y=-10, group="x")) + 
                           theme(panel.border=element_blank(),
                                 panel.background=element_blank(),
                                 strip.background=element_rect(colour=NA, fill=NA),
                                 strip.text=element_text(colour=NA),
                                 axis.text.x=element_text(colour=NA),
                                 axis.title.x=element_text(colour=NA),
                                 axis.ticks.x=element_blank(),
                                 axis.title.y=element_text(angle=90, vjust=0.5),
                                 axis.text.y=element_text(angle=0),
                                 axis.ticks.y=element_line()), 
                         pf(df[4:5,]) + theme(axis.text.y=element_blank(),
                                              axis.title.y=element_blank(),
                                              axis.ticks.y=element_blank()) , 
                         widths=c(1.12,2)), 
             ncol=1)