【问题标题】:R: How to join two different plots in the same pdf page over a loopR:如何通过循环在同一个pdf页面中加入两个不同的图
【发布时间】:2020-12-10 19:34:54
【问题描述】:

我有兴趣在同一页面中同时可视化两个图。一个图显示药物随时间的使用情况,另一图显示抗药性随时间的发生情况。两者的 Y 轴刻度非常不同,因此我认为将它们显示在单独的图表中很有用。

我使用以下代码将 676 个 ID(或我的数据中的元素)的两个不同图表生成到两个单独的 pdf 中。在比较一个 id 的使用和阻力如何随时间变化时,这没有帮助。相反,我想生成一个 pdf,并且在 pdf 的每一页中,我想显示同一 id/元素随时间的阻力和使用变化。所以目标是在我的 pdf 中为 676 个 id 提供 676 页,并在每个页面中显示相同 id 的使用和阻力。

我知道这可以使用 gridExtra 中的 grid.arrange 来完成,但不确定如何在循环和 lapply 中使用它。

###Resistance
Plot_list1 =list()
#this is the loop
for (i in J0$id){
  temp1 <-  J0%>%
    filter(id==i)%>%
    ggplot(aes(x = Year  , y = Rest)) + 
    geom_line()+
    geom_point()+
    scale_x_continuous(breaks=c(2008, 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018))+
    theme(axis.text.x = element_text(angle = 90))+
    theme(legend.position = "none") + 
    ggtitle(i) 
  
  Plot_list1[[i]] <-  temp1
}
##saving the loop in pdf
pdf("Resistance.pdf")
invisible(lapply(Plot_list1, print))
dev.off()

###Usage
Plot_list2 =list()
#this is the loop
for (i in J0$id){
  temp2 <-  J0%>%
    filter(id==i)%>%
    ggplot(aes(x = Year  , y = DUL0)) + 
    geom_line()+
    geom_point()+
    scale_x_continuous(breaks=c(2008, 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018))+
    theme(axis.text.x = element_text(angle = 90))+
    theme(legend.position = "none") + 
    ggtitle(i) 
  
  Plot_list2[[i]] <-  temp2
}
##saving the loop in pdf
pdf("UsageDUL0.pdf")
invisible(lapply(Plot_list2, print))
dev.off()

【问题讨论】:

  • 我实际上推荐 patchwork 来组合 grobs:虽然它在后台使用 grid 等,但在我看来,界面更好,功能更强大(&lt;/opinion&gt;)。不管。至于创建 676 页的 pdf,如果您使用 pdf(..., onefile=TRUE),那么您渲染的每个绘图都会有自己的页面。确保你 print 每个组合的情节。
  • 关于如何使用拼凑组合图的任何提示?我运行两个循环来生成两种类型的图。我应该如何使用 pathcwork 为每个 id 组合两种类型的图表?
  • 浏览Getting Started 小插图并选择最适合您的。可能就像gg1 + gg2 一样简单。

标签: r ggplot2 lapply


【解决方案1】:

这是一个简短的演练。

第 1 步,生成假数据,将其分别绘制成 gg1gg2,然后使用 patchwork 组合它们。这可以很容易地(也许可以说应该)分成多个阶段,但它足够小,可以只使用一个lapply

library(ggplot2)
library(patchwork)
set.seed(42)
allgg <- lapply(1:3, function(ind) {
  dat <- mtcars[sample(NROW(mtcars), 10),]
  gg1 <- ggplot(dat, aes(disp, mpg)) + geom_point(color = "red") + labs(title = paste("Page ", ind), subtitle = "mpg ~ disp")
  gg2 <- ggplot(dat, aes(qsec, drat)) + geom_point(color = "blue") + labs(subtitle = "drat ~ qsec")
  gg1 / gg2
})

启动 pdf 文件,将它们全部绘制出来,然后关闭设备。

pdf("quux.pdf", onefile = TRUE, width = 6, height = 6)
for (pg in allgg) print(pg)
dev.off()

对我来说,我得到一个 6x6(英寸)的 PDF,三页,看起来像:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2018-03-04
    相关资源
    最近更新 更多