ggplot2:从列表和常见图例中在多个页面上绘制图形
Posted
技术标签:
【中文标题】ggplot2:从列表和常见图例中在多个页面上绘制图形【英文标题】:ggplot2: Plotting graphs on multiple pages from a list and common legend 【发布时间】:2019-01-17 03:39:05 【问题描述】:我尝试使用ggplot2: Plots over Multiple pages 帖子中的代码。我可以让它工作一些,但我似乎无法弄清楚如何将图形数量更改为每页 4 个。我的代码将每页绘制 4 个图表,但在第二页上,它从列表中第 3 位的图表开始(它已经绘制了第一页),重新绘制列表中的第 4 个,然后转到第 5 个和第 6 名,完全跳过第 7 名。
我似乎也无法让 pdf 输出左侧的文本正常工作。
My data is here
这是我目前拥有的代码:
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 感谢您的帮助和实际回答问题
很高兴你成功了!与其将解决方案添加到您的原始问题中,不如将其添加为答案,以便将其标记为已解决。
【参考方案1】:
更新: 添加以下代码来保存图形的输出效果很好:
plots <- marrangeGrob(plist, nrow = 2, ncol = 2)
ggsave("multipage.pdf", plots, width = 11, height = 8.5, units = "in")
【讨论】:
以上是关于ggplot2:从列表和常见图例中在多个页面上绘制图形的主要内容,如果未能解决你的问题,请参考以下文章