【问题标题】:Build (or delete) panels of ggplot facet one at a time一次构建(或删除)ggplot facet 的面板
【发布时间】:2021-03-21 22:11:33
【问题描述】:

我正在做一个演示文稿,其中有助于“构建”多面 ggplot 对象的元素。例如,对于双面板分面图,我希望能够在幻灯片中显示第一个左侧面板,仍然格式化为分面,然后前进到具有左侧和右侧的第二张幻灯片面板,格式完全相同。另一种思考方式是我想创建一个两面图,然后“删除”右侧图,但保持所有其他元素(如布局)完全相同。我可以在图形包中手动执行此操作,但更喜欢在代码中执行此操作。

# example of 1x2 facetted plot_model output
library(sjPlot)

mtcars %>% 
    mutate(vs_fct = as.factor(vs)) %>% 
    lm(mpg ~ wt * cyl * vs_fct, data = .) %>% 
    plot_model(type = "pred", terms = c("wt", "cyl", "vs_fct"))

第一张幻灯片上的左面板图像(在图形软件中手动删除右面板):

第二张幻灯片上的图片与两个面板:

【问题讨论】:

  • 我建议你看看 {flipbookr} 包github.com/EvaMaeRey/flipbookr
  • 谢谢@EmilHvitfeldt!我是 Gina Reynolds / EvaMaeRey 与 Flipbookr 合作的忠实粉丝,但我认为它不会解决这个问题,因为在两面板布局中显示一个方面不是 ggplot 中的标准格式(我知道) .我认为需要发生的是创建两个面板分面,然后手动删除右侧面板,同时保留所有其他元素。我尝试View(plot_object),但我无法破译。另外感谢您在调色板中所做的所有工作!

标签: r ggplot2 facet sjplot gtable


【解决方案1】:

也许你可以使用gtable 包(Ref)?

# example of 1x2 facetted plot_model output
library(tidyverse)
library(sjPlot)

plt <- mtcars %>% 
  mutate(vs_fct = as.factor(vs)) %>% 
  lm(mpg ~ wt * cyl * vs_fct, data = .) %>% 
  plot_model(type = "pred", terms = c("wt", "cyl", "vs_fct"))
library(grid)
library(gtable)
library(lemon)

# create gtable object
gt = ggplot_gtable(ggplot_build(plt))
print(gt)
#> TableGrob (13 x 15) "layout": 22 grobs
#>     z         cells        name                                          grob
#> 1   0 ( 1-13, 1-15)  background               rect[plot.background..rect.349]
#> 2   1 ( 8- 8, 5- 5)   panel-1-1                      gTree[panel-1.gTree.226]
#> 3   1 ( 8- 8, 9- 9)   panel-2-1                      gTree[panel-2.gTree.241]
#> 4   3 ( 6- 6, 5- 5)  axis-t-1-1                                zeroGrob[NULL]
#> 5   3 ( 6- 6, 9- 9)  axis-t-2-1                                zeroGrob[NULL]
#> 6   3 ( 9- 9, 5- 5)  axis-b-1-1           absoluteGrob[GRID.absoluteGrob.245]
#> 7   3 ( 9- 9, 9- 9)  axis-b-2-1           absoluteGrob[GRID.absoluteGrob.249]
#> 8   3 ( 8- 8, 8- 8)  axis-l-1-2                                zeroGrob[NULL]
#> 9   3 ( 8- 8, 4- 4)  axis-l-1-1           absoluteGrob[GRID.absoluteGrob.253]
#> 10  3 ( 8- 8,10-10)  axis-r-1-2                                zeroGrob[NULL]
#> 11  3 ( 8- 8, 6- 6)  axis-r-1-1                                zeroGrob[NULL]
#> 12  2 ( 7- 7, 5- 5) strip-t-1-1                                 gtable[strip]
#> 13  2 ( 7- 7, 9- 9) strip-t-2-1                                 gtable[strip]
#> 14  4 ( 5- 5, 5- 9)      xlab-t                                zeroGrob[NULL]
#> 15  5 (10-10, 5- 9)      xlab-b titleGrob[axis.title.x.bottom..titleGrob.308]
#> 16  6 ( 8- 8, 3- 3)      ylab-l   titleGrob[axis.title.y.left..titleGrob.311]
#> 17  7 ( 8- 8,11-11)      ylab-r                                zeroGrob[NULL]
#> 18  8 ( 8- 8,13-13)   guide-box                             gtable[guide-box]
#> 19  9 ( 4- 4, 5- 9)    subtitle         zeroGrob[plot.subtitle..zeroGrob.345]
#> 20 10 ( 3- 3, 5- 9)       title          titleGrob[plot.title..titleGrob.344]
#> 21 11 (11-11, 5- 9)     caption          zeroGrob[plot.caption..zeroGrob.347]
#> 22 12 ( 2- 2, 2- 2)         tag              zeroGrob[plot.tag..zeroGrob.346]

显示绘图布局

gtable_show_names(gt)

删除与panel-2-相关的所有内容

rm_grobs <- gt$layout$name %in% c("panel-2-1", "strip-t-2-1", 
                                  "axis-t-2-1", "axis-b-2-1",
                                  "axis-l-1-2", "axis-r-1-2", "ylab-r")
# remove grobs
gt$grobs[rm_grobs] <- NULL
gt$layout <- gt$layout[!rm_grobs, ]

# check result
gtable_show_names(gt)

检查修改后的情节

grid.newpage()
grid.draw(gt)

reprex package (v1.0.0) 于 2021 年 3 月 21 日创建

【讨论】:

  • 就像魔术一样!这是一个优雅的解决方案。这些步骤非常清楚,尤其是 gtable_show_names 的使用,我可以看到如何将其应用于其他地块/grobs 的其他修改。非常感谢。
  • 很高兴它有帮助。您可能对使用 gtable 的这些答案也感兴趣 stackoverflow.com/questions/52208430/… & stackoverflow.com/questions/25640114/…
  • @Tung 你的反应太棒了。我一直在寻找同样的东西。我想补充一下,是否可以再次将输出转换为 ggplot ?我想使用 ggsave 保存它,虽然它应该保存最后一个图,但它保存了所有面板而不是“编辑”图。
  • @eggrandio:谢谢!您可能必须遵循此方法stackoverflow.com/a/49118535/786542
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多