【问题标题】:Order the panels from right to left in ggplot在ggplot中从右到左排列面板
【发布时间】:2018-06-13 21:51:37
【问题描述】:

我有一个包含 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' 参数允许垂直或水平位置,这不是我想要的。

提前致谢

【问题讨论】:

  • 你想要左下角的空白绘图面板,还是只是空白?
  • 我只需要一个空白。与现在完全一样,但从右到左。
  • 有一些关于 SO 的答案和方法。例如,here's one
  • 似乎那里提出的解决方案不适用于新版本的ggplot。由于有一个 'dir' 参数采用 v 或 h 值,因此 tt 应该是左右或左右的简单参数...

标签: r ggplot2 facet


【解决方案1】:

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

widths 参数的手动调整对于使空白图占据适当的空间量是必要的,以便其他两个图与上面的图垂直对齐。

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)

【讨论】:

  • 添加 df$group = factor(df$group, levels=rev(df$group)),如前所述(已删除的评论)。因此该组将反向出现。另外,是否可以对齐两条线的y轴?
  • 你的意思是你想从绘图的底行中取出 y 轴刻度和标签并将其向左移动,使其位于 y 轴刻度和标签的正下方最上面一行的地块?
  • 完全正确。这将完美地回答我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2012-08-31
  • 1970-01-01
  • 2020-10-22
  • 2021-08-08
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多