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(knitr chunk)文档中生成的多个(R)绘图图形
在Rmarkdown文档中调整嵌入式Shiny App的大小
使用facet_multiple后rmarkdown中打印标题的字体大小