【问题标题】:Ordering/placement of empty facet when using facet_wrap使用 facet_wrap 时订购/放置空刻面
【发布时间】:2019-06-04 15:53:05
【问题描述】:

考虑下面的分面图,它以 2x2 的排列方式绘制了 3 个分面。空白面在右下角。

library(ggplot2)
ggplot(mtcars) + 
  aes(x = wt, y = mpg) + 
  geom_point() + 
  facet_wrap(~factor(cyl), ncol = 2)

我想生成一个在顶行具有空白面的图,例如如下:

有什么办法可以做到这一点,而不用弄乱 grobs 或 gtable?

【问题讨论】:

  • 您可以通过为cyl 添加一个“空白”因子水平来做到这一点。来自?facet_wrap# To change the order in which the panels appear, change the levels # of the underlying factor. mpg$class2 <- reorder(mpg$class, mpg$displ) ggplot(mpg, aes(displ, hwy)) + geom_point() + facet_wrap(~class2)

标签: r ggplot2


【解决方案1】:

facet_wrap 有一个选项as.table。来自文档:

如果默认值为 TRUE,则分面的布局类似于右下角的最高值的表格。如果为 FALSE,则分面的布局类似于右上角的最高值。

如果你设置as.table = F,你会在右上角得到一个空白,但是现在面板的顺序很尴尬;他们会像

8 (blank)
4    6

要获得您想要的订单,请进行一些预处理。

如果你反转因子水平,你会得到一个布局

4 (blank)
8    6

顺序归结为左下、右下、左上、右上。

根据您希望它们的排列方式,您可能必须手动对构面级别进行排序,除非在您的完整项目中还有一些其他逻辑可以组合在一起。我在这里用forcats::relevel手动完成了。

library(dplyr)
library(ggplot2)

mtcars %>%
  mutate(cyl = as.factor(cyl) %>%
           forcats::fct_relevel("6", "8", "4")) %>%
  ggplot(aes(x = wt, y = mpg)) +
  geom_point() +
  facet_wrap(vars(cyl), ncol = 2, as.table = F)

reprex package (v0.3.0) 于 2019 年 6 月 4 日创建

【讨论】:

  • 我实际上尝试过使用as.table,但误读了文档并认为默认是FALSE!所以我尝试了facet_wrap(~factor(cyl), ncol = 2, as.table = TRUE),当然没有看到任何变化。
猜你喜欢
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多