RMarkdown 文档中的多个相同大小的图

Posted

技术标签:

【中文标题】RMarkdown 文档中的多个相同大小的图【英文标题】:Multiple equally sized plots in an RMarkdown document 【发布时间】:2022-01-20 11:58:58 【问题描述】:

我想对齐 区域 几个地块,每个地块都是由 RMarkdown 文档(最好是 .html)中的单独块“很好地”创建的。我的问题:因为 y 轴文本的长度不同。绘制的 区域 没有完美重叠(很遗憾,因为我的实际 x 轴是几个月)。

在此处设置 fig.width=out.width= 无济于事,因为它们会考虑轴文本长度。

虚拟数据块:

require(ggplot2)

df = expand.grid(y = LETTERS,
                 x = paste0('A', 1:10),
                 stringsAsFactors = FALSE)
set.seed(42)
df$fill = rnorm(nrow(df))
df2 = df
df2$y = unlist(lapply(lapply(df2$y, function(x) rep(x, 10)), paste0, collapse = ''))

Plot-Chunk1:

gg1 = ggplot(df, aes(y = y, x = x, fill = fill)) +
  geom_tile()
gg1

Plot-Chunk2:

gg2 = ggplot(df2, aes(y = y, x = x, fill = fill)) +
  geom_tile()
gg2

RMarkdown 文档中的绘图应如下所示(红线突出显示所需的对齐方式):

我通过 patchwork 包实现了这一点。但是,像这样我只能使用一个块而不是多个。

拼凑-情节-块:

require(patchwork)

gg1 / gg2 +
  plot_annotation(tag_levels = 'A')

【问题讨论】:

编织成 html 或 pdf? .html 我会更新问题。 先生。安迪比我快:) 我自己的脚本中的一点copypasta,哈哈。而且我仍然希望有人提出更“正确”的做法! 【参考方案1】:

编辑(更整洁?)解决方案:cowplot::align_plots

尝试一下cowplot::align_plots,可以设置标准面板宽度以在所有图表中使用。但是,当您在构建每个图形时对即将出现的图形“视而不见”时,要跨块执行此操作,您可以创建一个带有尽可能宽标签的“模板”图(下面的gg_set)。然后,每个后续图表都将采用这个未使用的绘图的大小:

require(ggplot2)

df  <-  expand.grid(y = LETTERS,
                    x = paste0('A', 1:10),
                    stringsAsFactors = FALSE)
set.seed(42)
df$fill = rnorm(nrow(df))

df2  <-  df
df2$y  <-
  unlist(lapply(lapply(df2$y, function(x)
    rep(x, 5)), paste0, collapse = ''))


# df for setting max size needed - might need experimented with
dfset  <-  df
dfset$y  <-
  unlist(lapply(lapply(df$y, function(x)
    rep(x, 10)), paste0, collapse = ''))


# 'template' plot
gg_set <-  ggplot(dfset, aes(y = y, x = x, fill = fill)) +
  geom_tile()


require(cowplot)

# Chunk 1
gg1  <-  ggplot(df, aes(y = y, x = x, fill = fill)) +
  geom_tile()

ggs <- align_plots(gg_set, gg1, align = "v")

# Only extracting relevant graph.
ggdraw(ggs[[2]])


# Chunk 2
gg2  <-  ggplot(df2, aes(y = y, x = x, fill = fill)) +
  geom_tile()

ggs <- align_plots(gg_set, gg2, align = "v")

ggdraw(ggs[[2]])

由reprex package (v2.0.1) 于 2021 年 12 月 17 日创建

凌乱的原解

我以前使用过一个公认的混乱解决方案,它实际上只是涉及将所有标签的上下空白行填充到大于最大长度:

require(ggplot2)
#> Loading required package: ggplot2

df  <-  expand.grid(y = LETTERS,
                    x = paste0('A', 1:10),
                    stringsAsFactors = FALSE)
set.seed(42)
df$fill = rnorm(nrow(df))
df2  <-  df
df2$y  <-
  unlist(lapply(lapply(df2$y, function(x)
    rep(x, 10)), paste0, collapse = ''))


df$y <-
  paste0(paste0(rep(" ", 40), collapse = ""), "\n", df$y, "\n", paste0(rep(" ", 40)))
df2$y <-
  paste0(paste0(rep(" ", 40), collapse = ""), "\n", df2$y, "\n", paste0(rep(" ", 40)))

gg1  <-  ggplot(df, aes(y = y, x = x, fill = fill)) +
  geom_tile()
gg1

gg2 <-  ggplot(df2, aes(y = y, x = x, fill = fill)) +
  geom_tile()
gg2

我希望他们是一个更正式的解决方案,允许静态面板大小,我期待听到其他答案。但已将其用作快速修复!

由reprex package (v2.0.1) 于 2021-12-17 创建

【讨论】:

感谢您的回答!我问是因为我想避免这种方法,但是,嘿,如果这就是我们所得到的,那么好吧。 我有另一个想法!!!即将进行编辑... 太好了!谢谢你指点我cowplot::align_plots(..., align = "v")【参考方案2】:

patchwork 包还包括函数align_patches(),其工作方式类似于cowplot::align_plots()

gg_l = patchwork::align_patches(gg1,
                                gg2)

Plot-Chunk1:

gg_l[[1]]

Plot-Chunk2:

gg_l[[2]]

来自问题的数据。

【讨论】:

以上是关于RMarkdown 文档中的多个相同大小的图的主要内容,如果未能解决你的问题,请参考以下文章

如何在rmarkdown中调整注视表的字体大小?

Rmarkdown(knitr chunk)文档中生成的多个(R)绘图图形

在Rmarkdown文档中调整嵌入式Shiny App的大小

使用facet_multiple后rmarkdown中打印标题的字体大小

RMarkdown:使用 Rcpp 中的 rmarkdown:render-function 生成 pdf 文档

在 RMarkdown 中调整图像大小