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]]
问题数据。
我想对齐 几个图的区域,每个图都是由 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]]
问题数据。