在多个页面上绘制
Plot over multiple pages
我有 facet_wrap
功能来制作多个图表 (n=~51),但它们都出现在一页上。现在经过搜索,我发现 ggplot2 不能在多个页面上放置图形。
有办法吗?我查看了这个问题 (Multiple graphs over multiple pages using ggplot) 并尝试了代码,但收效甚微。
这是我的图表代码,它在一页上生成约 51 个图表,使它们非常小且难以看到,如果我可以将其打印为 pdf 每页 1 个图表,那就太好了:
ggplot(indbill, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
facet_wrap(~ individual) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
如果有人能写一点代码并向我解释,那就太好了。
类似于:
by(indbill, indbill$individual, function (x){
ggplot(x, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
}
一种选择是使用您现在使用的相同代码一次绘制 individual
的六个级别。您只需要对其进行多次迭代,对数据的每个子集进行一次。您还没有提供示例数据,所以这里有一个使用 Baseball
数据框的示例:
library(ggplot2)
library(vcd) # For the Baseball data
data(Baseball)
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ],
aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw())
}
dev.off()
上面的代码将生成一个包含四页图的 PDF 文件,每页有六个面。您还可以创建四个单独的 PDF 文件,每组六个面一个:
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
...ggplot code...
dev.off()
}
如果您需要更大的灵活性,另一种选择是为分面变量的每个级别(即每个唯一值)创建一个单独的图,并将所有单独的图保存在一个列表中。然后你可以在每一页上布置任意数量的图。这在这里可能有点矫枉过正,但是 here's an example 灵活性可以派上用场。
首先,让我们创建所有的绘图。我们将使用 team87
作为分面列。所以我们想为 team87
的每个级别绘制一个图。我们将通过 team87
拆分数据并为数据的每个子集制作单独的图来做到这一点。
在下面的代码中,split
为 team87
的每个级别将数据拆分为单独的数据帧。 lapply
包装器按顺序将每个数据子集馈送到 ggplot 中,为每个团队创建一个图。我们将输出保存在 plist
中,这是一个(在本例中)24 个图的列表。
plist = lapply(split(Baseball, Baseball$team87), function(d) {
ggplot(d, aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw() +
theme(plot.margin=unit(rep(0.4,4),"lines"),
axis.title=element_blank())
})
现在我们将在一个 PDF 文件中一次布置六个图。下面是两个选项,一个有四个单独的 PDF 文件,每个有六个图,另一个有一个 four-page PDF 文件。我还粘贴了底部的一个图。我们使用 grid.arrange
来布置图表,包括使用 left
和 bottom
参数添加轴标题。
library(gridExtra)
# Four separate single-page PDF files, each with six plots
for (i in seq(1, length(plist), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
dev.off()
}
# Four pages of plots in one PDF file
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(plist), 6)) {
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
}
dev.off()
分页有多种方法:ggforce or gridExtra::marrangeGrob. See also this 再举一个例子。
ggforce:
library(ggplot2)
# install.packages("ggforce")
library(ggforce)
# Standard facetting: too many small plots
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap(~cut:clarity, ncol = 3)
# Pagination: page 1
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 1)
# Pagination: page 2
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 2)
# Works with grid as well
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_grid_paginate(color~cut:clarity, ncol = 3, nrow = 3, page = 4)
额外网格:
# install.packages("gridExtra")
library(gridExtra)
set.seed(123)
pl <- lapply(1:11, function(.x)
qplot(1:10, rnorm(10), main=paste("plot", .x)))
ml <- marrangeGrob(pl, nrow=2, ncol=2)
## non-interactive use, multipage pdf
## ggsave("multipage.pdf", ml)
## interactive use; calling `dev.new` multiple times
ml
由 reprex package (v0.2.0.9000) 创建于 2018-08-09。
我有 facet_wrap
功能来制作多个图表 (n=~51),但它们都出现在一页上。现在经过搜索,我发现 ggplot2 不能在多个页面上放置图形。
有办法吗?我查看了这个问题 (Multiple graphs over multiple pages using ggplot) 并尝试了代码,但收效甚微。
这是我的图表代码,它在一页上生成约 51 个图表,使它们非常小且难以看到,如果我可以将其打印为 pdf 每页 1 个图表,那就太好了:
ggplot(indbill, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
facet_wrap(~ individual) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
如果有人能写一点代码并向我解释,那就太好了。
类似于:
by(indbill, indbill$individual, function (x){
ggplot(x, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
theme(axis.ticks.x = element_blank(),
axis.text.x = element_text(size=rel(0.5)),
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()
}
一种选择是使用您现在使用的相同代码一次绘制 individual
的六个级别。您只需要对其进行多次迭代,对数据的每个子集进行一次。您还没有提供示例数据,所以这里有一个使用 Baseball
数据框的示例:
library(ggplot2)
library(vcd) # For the Baseball data
data(Baseball)
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ],
aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw())
}
dev.off()
上面的代码将生成一个包含四页图的 PDF 文件,每页有六个面。您还可以创建四个单独的 PDF 文件,每组六个面一个:
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
...ggplot code...
dev.off()
}
如果您需要更大的灵活性,另一种选择是为分面变量的每个级别(即每个唯一值)创建一个单独的图,并将所有单独的图保存在一个列表中。然后你可以在每一页上布置任意数量的图。这在这里可能有点矫枉过正,但是 here's an example 灵活性可以派上用场。
首先,让我们创建所有的绘图。我们将使用 team87
作为分面列。所以我们想为 team87
的每个级别绘制一个图。我们将通过 team87
拆分数据并为数据的每个子集制作单独的图来做到这一点。
在下面的代码中,split
为 team87
的每个级别将数据拆分为单独的数据帧。 lapply
包装器按顺序将每个数据子集馈送到 ggplot 中,为每个团队创建一个图。我们将输出保存在 plist
中,这是一个(在本例中)24 个图的列表。
plist = lapply(split(Baseball, Baseball$team87), function(d) {
ggplot(d, aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw() +
theme(plot.margin=unit(rep(0.4,4),"lines"),
axis.title=element_blank())
})
现在我们将在一个 PDF 文件中一次布置六个图。下面是两个选项,一个有四个单独的 PDF 文件,每个有六个图,另一个有一个 four-page PDF 文件。我还粘贴了底部的一个图。我们使用 grid.arrange
来布置图表,包括使用 left
和 bottom
参数添加轴标题。
library(gridExtra)
# Four separate single-page PDF files, each with six plots
for (i in seq(1, length(plist), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
dev.off()
}
# Four pages of plots in one PDF file
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(plist), 6)) {
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
}
dev.off()
分页有多种方法:ggforce or gridExtra::marrangeGrob. See also this
ggforce:
library(ggplot2)
# install.packages("ggforce")
library(ggforce)
# Standard facetting: too many small plots
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap(~cut:clarity, ncol = 3)
# Pagination: page 1
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 1)
# Pagination: page 2
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 2)
# Works with grid as well
ggplot(diamonds) +
geom_point(aes(carat, price), alpha = 0.1) +
facet_grid_paginate(color~cut:clarity, ncol = 3, nrow = 3, page = 4)
额外网格:
# install.packages("gridExtra")
library(gridExtra)
set.seed(123)
pl <- lapply(1:11, function(.x)
qplot(1:10, rnorm(10), main=paste("plot", .x)))
ml <- marrangeGrob(pl, nrow=2, ncol=2)
## non-interactive use, multipage pdf
## ggsave("multipage.pdf", ml)
## interactive use; calling `dev.new` multiple times
ml
由 reprex package (v0.2.0.9000) 创建于 2018-08-09。