【发布时间】:2019-01-17 03:39:05
【问题描述】:
我尝试使用ggplot2: Plots over Multiple pages 帖子中的代码。我可以让它工作一些,但我似乎无法弄清楚如何将图形数量更改为每页 4 个。我的代码将每页绘制 4 个图表,但在第二页上,它从列表中第 3 位的图表开始(它已经绘制了第一页),重新绘制列表中的第 4 个,然后转到第 5 个和第 6 名,完全跳过第 7 名。
我似乎也无法让 pdf 输出左侧的文本正常工作。
这是我目前拥有的代码:
plist = lapply(split(ChlFPALL, ChlFPALL$Tank), function(d) {
ggplot(data=d, aes(x=TimePoint, y=Chl, group=Variable, colour=Color, shape=Shape)) +
geom_line(size=1) +
geom_point(size=4) + scale_x_continuous(breaks = seq(0, 2, 1)) +
geom_point() +
facet_wrap(~ Tank) +
scale_y_continuous(limits=c(0, max(ChlFPALL$Chl, na.rm=TRUE))) +
theme(plot.margin=unit(rep(0.4,4),"lines"),
axis.title=element_blank()) + theme(plot.subtitle = element_text(vjust = 1),
plot.caption = element_text(vjust = 1),
axis.text = element_text(size = 10,
face = "bold", colour = "black"),
legend.text = element_text(size = 10,
face = "bold"), legend.key = element_rect(fill = NA),
legend.background = element_rect(fill = NA)) + scale_colour_manual(values = c("Bluegreen" = "#528B8B", "Cryptophyta" = "#8B4513", "Diatoms"="#A52A2A", "Green Algae" = "#008B00", "Total conc." = "#000000", "Yellow substances"= "#EEEE00"))
})
# Four pages of plots in one PDF file
pdf("FPplotsQs.pdf", 11, 8.5)
for (i in seq(1, length(plist), 2)) {
grid.arrange(grobs=plist[i:(i+3)],
ncol=2, left=expression(bold(paste("Chlorophyll", italic(" a "), mu, gL^-1))), bottom="Time (Hours)")
}
dev.off()
另外,有没有办法在页面上只获取一个常见的图例?我已经尝试了另一个示例中的代码,但无法使其工作。
pdf("FPplotsQs.pdf", 11, 8.5)
for (i in seq(1, length(plist), 2)) {
ggarrange(grobs=plist[i:(i+3)],
ncol=2, left=expression(bold(paste("Chlorophyll", italic(" a "), mu, gL^-1))), bottom="Time (Hours)", common.legend = TRUE)
}
dev.off()
更新: 添加以下代码来保存图形的输出效果很好:
plots <- marrangeGrob(plist, nrow = 2, ncol = 2)
ggsave("multipage.pdf", plots, width = 11, height = 8.5, units = "in")
【问题讨论】:
-
它看起来像你的
for()循环序列通过 1、3、5 等。也许你想要seq(1, length(plist), 4))? -
因为您的列表不能被 4 整除,所以在您提供给
grid.arrange()的最终列表中有NULL。看看plist[5:(5+3)](假设您的地块少于 8 个)。这是导致错误的原因。从列表here 中删除NULL的一些好方法。我认为purrr::compact()解决方案看起来很方便! -
@Tung 这完全有效,而且更简单,谢谢!
-
Tung 和@aosmith 感谢您的帮助和实际回答问题
-
很高兴你成功了!与其将解决方案添加到您的原始问题中,不如将其添加为答案,以便将其标记为已解决。