R 使用ggplot在多个页面上绘制多个图形

R 使用ggplot在多个页面上绘制多个图形,r,ggplot2,R,Ggplot2,我正在对我的数据进行探索性分析,需要使用ggplot绘制多个图形。图形的数量非常巨大(206个站点),我想在需要的这么多页面上,将它们绘制成1列,而不是每页8行。我知道诸如viewport或grid.arrange之类的函数,但在这种情况下我无法使它们正常工作。我已经注意到layout()或par(mfrow=c(8,1))不适用于ggplot,但我发送了代码中我被困在下面的部分。任何帮助都将不胜感激 pdf('test.pdf', width=21, height=27) par(mfrow=

我正在对我的数据进行探索性分析,需要使用ggplot绘制多个图形。图形的数量非常巨大(206个站点),我想在需要的这么多页面上,将它们绘制成1列,而不是每页8行。我知道诸如viewport或grid.arrange之类的函数,但在这种情况下我无法使它们正常工作。我已经注意到layout()或par(mfrow=c(8,1))不适用于ggplot,但我发送了代码中我被困在下面的部分。任何帮助都将不胜感激

pdf('test.pdf', width=21, height=27)
par(mfrow=c(8,1))
for(i in levels(tab$Station))
{

print(ggplot(tab[tab$Station==i], aes(x=Date)) +
  geom_line(aes(y=Tmin), col="blue", size=0.1) + 
  geom_line(aes(y=Tmax), col="red", size=0.1) + 
  geom_text(aes(x=as.Date('2010-01-01'), y=45), label=i) +
  ylim(0, 45) + 
  scale_x_date(labels = date_format("%Y")) +
  theme_bw() +
  theme(
    plot.background = element_blank()
    ,panel.grid.major = element_blank()
    ,panel.grid.minor = element_blank()
    ,panel.border = element_rect(color = 'black')
    ,panel.background = element_blank()

  )
)

}

dev.off()

你应该简化你的绘图,因为一旦你用一个简单的绘图得到正确的顺序,你就可以用复杂的绘图代替它
ggplot2
基于
grid
程序包,因此您需要使用
gridExtra
来安排绘图。然后循环,对于每8个绘图,将它们存储在列表中,然后调用
网格。在其上排列
,然后重复此操作,直到绘图结束

library(gridExtra)
library(ggplot2)
pdf('test.pdf', width=21, height=27)
i = 1
plot = list() 
for (n in unique(tab$Station)){
  ### process data for plotting here ####
  plot[[i]] = ggplot(tab[tab$Station==n], aes(x=Date)) +...
  if (i %% 8 == 0) { ## print 8 plots on a page
    print (do.call(grid.arrange,  plot))
    plot = list() # reset plot 
    i = 0 # reset index
  }
  i = i + 1
}
if (length(plot) != 0) { 
  print (do.call(grid.arrange,  plot))
}
dev.off()

不幸的是,
mfrow
不适用于
ggplot2
。您必须使用其他方法,如or或使用本机
plot
函数


也许你可以使用faceting将8个绘图放到一个页面上,然后使用第二个链接将其放入多个文档中……

faceting可能是一种方法。确定每页需要多少个分面迷你图,然后循环所需的次数,边走边生成png或pdf。因此,如果您有200个数据项,并且您希望每页50个,在5个面和10个面之间,只需循环200/50=4次迭代。原油,但应该有效

library(ggplot2)

ii <- 7
nn <- 49

mydf <- data.frame(date = rep(seq(as.Date('2013-03-01'),
                       by = 'day', length.out = ii), nn),
                   value = rep(runif(nn, 100, 200)))

mydf$facet.variable <- rep(1:nn, each = ii)

p <- ggplot(mydf, aes(x = date, y = value)) +
    geom_line() +
    facet_wrap(~ facet.variable, ncol = ii)

print(p)

库(ggplot2)
二,

未经测试。

嗨,Jose,你介意将此作为一个可复制的示例吗?这通常意味着提供玩具数据,这样我们就可以获取代码并运行它。通常,人们使用
data()
函数来执行此操作。例如,
data(mtcars)
mtcars
data.frame加载到内存中。@baptiste的答案有效吗?我知道这是一个老问题,但请尝试在ggforce包中使用facet\u wrap\u paginate函数。请参阅此处的帮助,这就是我解决类似问题的方法。您能否解释一下,您是如何创建上面的
绘图
对象的?
%+%
做什么?
%+%
覆盖GGPLOT中的数据我仍然是r绿带,所以需要像你这样的第四丹黑带的帮助。另外,我刚刚开始熟悉使用
plyr
dplyr
而不是
apply
系列。所以我在这里猜测,但这是否意味着您已经将subseted
tab
对象(按桩号subseted)传递到ggplot
p
,使用
%+%
函数覆盖了
tab
参数在原始文件中的位置?如果是这样的话,那太棒了。比你@baptiste。请原谅后续操作,但是
e1=
dlply
功能中做了什么?当我删除它并将
p
放在它的位置时,
plots
函数仍然工作,但突然调用
plots
对象时,不会出现任何图形。
%+%
是一个中缀运算符,有两个参数名为
e1
e2
。它的定义相当笨拙,这里的案例考虑的是
e1
ggplot和
e2
data.frame(实际上是其他东西)。默认情况下,dlply循环(相当于LAPPY)会将data.frames作为第一个参数提供给函数,除非有人以命名的第一个参数显式传递一个绘图(dlply然后跳到下一个参数)。
library(plyr)
library(gridExtra)

p = ggplot(tab, aes(x=Date)) +
       geom_line(aes(y=Tmin), col="blue", size=0.1)

plots = dlply(tab , "Station", `%+%`, e1 = p)
ml = do.call(marrangeGrob, c(plots, list(nrow=8, ncol=1)))
ggsave("multipage.pdf", ml)