根据数据框中的观察数量自动在 lapply 中设置 ggsave 宽度参数

Automatically set ggsave width argument in lapply based on number of observations in dataframe

假设我有一个数据框列表,我想使用 lapplygeom_tile 将它们一个一个地绘制出来,并且 ggsave 它在我的本地计算机上:

library(ggplot2)

df1 <- data.frame(grp = rep("A", 30), 
                  point = 1:30, 
                  y = rep(1, 30), 
                  var = sample(c(T, F), 30, replace = T))

df2 <- data.frame(grp = rep("B", 100), 
                  point = 1:100, 
                  y = rep(1, 100), 
                  var = sample(c(T, F), 100, replace = T))

df_list <- list(df1, df2)

# this should save "A.png" and "B.png" to the current directory
lapply(df_list, function(x) {
  p <- ggplot(x, aes(point, y, fill = var)) + geom_tile(color = "black") + theme_minimal()
  ggsave(filename = paste0(unique(x[["grp"]]), ".png"), plot = p, width = 8, height = 3)
  })

通常情况下,设置 ggsave(width = 8) 对大多数数据帧来说都是完美的,但对于其中一些数据帧来说,它们的观测值异常多,width = 8 会太拥挤。

例如,df1 (A.png) 可以与 width = 8:

但是,df2 (B.png) 可能太拥挤了:

比如df2,我想用ggsave(width = 25)保存。

有没有办法根据我们正在绘制的数据框中的观察数量自动更改ggsave(width)参数以获得最佳缩放 图(例如,如果数据框有超过 100 个数据点,width 应该大于 25,我希望它自动缩放)?

我知道很难定义最佳缩放,但这里的重点是找到一种方法在每个 lapply 迭代中有不同的 ggsave(width) .

提前致谢!

我们可以使用ifelsecase_when语句根据nrow()设置宽度。

lapply(df_list, function(x) {
    p <- ggplot(x, aes(point, y, fill = var)) + 
      geom_tile(color = "black") + 
      theme_minimal()
    ggsave(filename = paste0(unique(x[["grp"]]), ".png"), 
           plot = p, 
           width = ifelse(nrow(x) > 80, 25, 4), 
           height = 3)
    })