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:从列表和常见图例中在多个页面上绘制图形的主要内容,如果未能解决你的问题,请参考以下文章

在ggplot2中的图表下方绘制图例和图例标题上方的图例

ggplot2 绘制两个图例

pyqtgraph删除pyqt4 gui中的持久图例

为ggplot2线图创建图例

R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(设置图例位置移除图例)实战

lattice levelplot 或 ggplot2 map R 的自定义图例