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

Multiple equally sized plots in an RMarkdown document

我想对齐 几个图的区域,每个图都是由 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 = ''))

情节块 1:

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

情节块 2:

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

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

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

Patchwork-Plot-Chunk:

require(patchwork)

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

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

尝试一下 cowplot::align_plots,可以设置一个标准面板宽度以用于所有图形。但是,当您为即将到来的图表构建每个图表 'blind' 时,要跨块执行此操作,您可以创建一个 'template' 绘图,其标签的宽度根据需要(下面的 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 创建

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

gg_l = patchwork::align_patches(gg1,
                                gg2)

情节块 1:

gg_l[[1]]

情节块 2:

gg_l[[2]]

问题数据。