table 内的 ggplot 图

ggplot plots within a table

问题

我想制作一个好看的 table,它在一列的单元格中有 ggplots。一个关键因素是我想最终创建此 table 的 pdf 输出。

到目前为止我尝试了什么

希望下面的例子是可以理解的。基本上我发现我可以使用 gt 包实现我想要的。问题是这会创建一个 html 小部件,然后您必须使用 phantomJS 和 webshot 将其导出为 pdf。

library(dplyr)
library(purrr)
library(gt)
library(ggplot2)


dat = tibble(
  RowLabel = letters[1:5],
  Numeric = seq(100,500,100)
) %>% 
  mutate(
    plotData = RowLabel %>% map(function(pos){
      tibble(y=runif(10)*100) %>% 
        arrange(desc(y)) %>% 
        mutate(x=row_number())
    }),
    plot_obj = plotData %>% map(function(df){
      df %>%
        ggplot(aes(x=x,y=y))+
        geom_col()
    }),
    plot_grob = plot_obj %>% map(cowplot::as_grob)
  )


tab = dat %>% 
  select(RowLabel, Numeric) %>% 
  mutate(
    ggplot = NA
  ) %>% 
  gt() %>% 
  text_transform(
    locations = cells_body(vars(ggplot)),
    fn = function(x) {
      dat$plot_obj %>%
        map(ggplot_image, height = px(50))
    }
  )
tab

我想要什么

我想要一个类似于上例的输出。但是,我想要一个不需要我使用 html 小部件并且可以直接保存为 pdf 而无需使用其他程序的解决方案。使用 ggplot 可以做到这一点吗?我已经开始了解更多关于 grids/grobs/gtables 等的知识,但没有取得任何有意义的进展。

提前致谢!

也许您可以调整 gtsave() 功能以适应?例如

library(dplyr)
library(purrr)
library(gt)
library(ggplot2)


dat = tibble(
  RowLabel = letters[1:5],
  Numeric = seq(100,500,100)
) %>% 
  mutate(
    plotData = RowLabel %>% map(function(pos){
      tibble(y=runif(10)*100) %>% 
        arrange(desc(y)) %>% 
        mutate(x=row_number())
    }),
    plot_obj = plotData %>% map(function(df){
      df %>%
        ggplot(aes(x=x,y=y))+
        geom_col()
    }),
    plot_grob = plot_obj %>% map(cowplot::as_grob)
  )
tab = dat %>% 
  select(RowLabel, Numeric) %>% 
  mutate(
    ggplot = NA
  ) %>% 
  gt() %>% 
  text_transform(
    locations = cells_body(vars(ggplot)),
    fn = function(x) {
      dat$plot_obj %>%
        map(ggplot_image, height = px(50))
    }
  )
tab %>% 
  gt::gtsave(filename = "test.pdf", vwidth = 180, vheight = 250)

(R v4.0.3 / gt v0.2.2)