如何强制多个 r 图具有相同长度的 x 刻度?
How to force multiple r plots to have the same length of x-ticks?
R 中的几个包能够将多个图排列成一个网格,例如 gridExtra
和 cowplot
。默认情况下,同一 row/column 中的图在其边界上对齐。下面是一个例子。三个直方图垂直排列在同一个图上。您会注意到 x 刻度没有对齐,因此网格图看起来有点难看。
library(ggplot2);library(grid);library(cowplot)
p1 <- ggplot(data = NULL, aes(x = rt(10,19))) +
geom_histogram(bins = 5, fill = "darkgreen", color = "darkgrey", alpha = 0.6) +
labs(y = "", x = "")
# similar plots for p2, p3
plot_grid(p1, textGrob("N=10"),
p2, textGrob("N=100"),
p3, textGrob("N=10000"),
nrow=3, rel_widths = c(4/5, 1/5))
问题是 base
和 ggplot2
中的绘图工具不会固定 x 刻度的长度,而 cowplot::plot_grid
只会自动将绘图拉伸到最大宽度。一些图有更宽的 y 标签,所以它们最终有更短的 x 刻度。
现在我想强制三个直方图具有相同长度的 x 刻度。请问有没有method/package这样的问题?请注意,通常数据整形与 ggplot2::facet_wrap
等函数相结合应该可以解决此问题,但我仍然想知道是否有更直接的解决方案。
我个人认为 patchwork 可以优雅地处理图的对齐方式,您可以通过在通用比例上设置限制来让图共享一个 x 轴。
library(ggplot2)
library(patchwork)
set.seed(123)
plots <- lapply(c(10, 100, 1000), function(n) {
ggplot(mapping = aes(x = rt(n, 19))) +
geom_histogram(bins = round(sqrt(n)) * 2,
fill = "darkgreen", colour = "darkgrey",
alpha = 0.6) +
labs(y = "", x = "")
})
plots[[1]] / plots[[2]] / plots[[3]] &
scale_x_continuous(limits = c(-5, 5),
oob = scales::oob_squish)
由 reprex package (v0.3.0)
于 2020-11-26 创建
plot_grid()
函数可以对齐图,见这里:https://wilkelab.org/cowplot/articles/aligning_plots.html
library(ggplot2)
library(grid)
library(cowplot)
set.seed(123)
plots <- lapply(c(10, 100, 1000), function(n) {
ggplot(mapping = aes(x = rt(n, 19))) +
geom_histogram(bins = round(sqrt(n)) * 2,
fill = "darkgreen", colour = "darkgrey",
alpha = 0.6) +
labs(y = "", x = "") +
scale_x_continuous(
limits = c(-5, 5),
oob = scales::oob_squish
)
})
plot_grid(
plots[[1]], textGrob("N=10"),
plots[[2]], textGrob("N=100"),
plots[[3]], textGrob("N=10000"),
nrow=3, rel_widths = c(4/5, 1/5), align = "v", axis = "l"
)
由 reprex package (v0.3.0)
于 2020-11-26 创建
R 中的几个包能够将多个图排列成一个网格,例如 gridExtra
和 cowplot
。默认情况下,同一 row/column 中的图在其边界上对齐。下面是一个例子。三个直方图垂直排列在同一个图上。您会注意到 x 刻度没有对齐,因此网格图看起来有点难看。
library(ggplot2);library(grid);library(cowplot)
p1 <- ggplot(data = NULL, aes(x = rt(10,19))) +
geom_histogram(bins = 5, fill = "darkgreen", color = "darkgrey", alpha = 0.6) +
labs(y = "", x = "")
# similar plots for p2, p3
plot_grid(p1, textGrob("N=10"),
p2, textGrob("N=100"),
p3, textGrob("N=10000"),
nrow=3, rel_widths = c(4/5, 1/5))
问题是 base
和 ggplot2
中的绘图工具不会固定 x 刻度的长度,而 cowplot::plot_grid
只会自动将绘图拉伸到最大宽度。一些图有更宽的 y 标签,所以它们最终有更短的 x 刻度。
现在我想强制三个直方图具有相同长度的 x 刻度。请问有没有method/package这样的问题?请注意,通常数据整形与 ggplot2::facet_wrap
等函数相结合应该可以解决此问题,但我仍然想知道是否有更直接的解决方案。
我个人认为 patchwork 可以优雅地处理图的对齐方式,您可以通过在通用比例上设置限制来让图共享一个 x 轴。
library(ggplot2)
library(patchwork)
set.seed(123)
plots <- lapply(c(10, 100, 1000), function(n) {
ggplot(mapping = aes(x = rt(n, 19))) +
geom_histogram(bins = round(sqrt(n)) * 2,
fill = "darkgreen", colour = "darkgrey",
alpha = 0.6) +
labs(y = "", x = "")
})
plots[[1]] / plots[[2]] / plots[[3]] &
scale_x_continuous(limits = c(-5, 5),
oob = scales::oob_squish)
由 reprex package (v0.3.0)
于 2020-11-26 创建plot_grid()
函数可以对齐图,见这里:https://wilkelab.org/cowplot/articles/aligning_plots.html
library(ggplot2)
library(grid)
library(cowplot)
set.seed(123)
plots <- lapply(c(10, 100, 1000), function(n) {
ggplot(mapping = aes(x = rt(n, 19))) +
geom_histogram(bins = round(sqrt(n)) * 2,
fill = "darkgreen", colour = "darkgrey",
alpha = 0.6) +
labs(y = "", x = "") +
scale_x_continuous(
limits = c(-5, 5),
oob = scales::oob_squish
)
})
plot_grid(
plots[[1]], textGrob("N=10"),
plots[[2]], textGrob("N=100"),
plots[[3]], textGrob("N=10000"),
nrow=3, rel_widths = c(4/5, 1/5), align = "v", axis = "l"
)
由 reprex package (v0.3.0)
于 2020-11-26 创建