11

我正在对我的数据进行探索性分析,需要使用 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()
4

4 回答 4

11
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)

未经测试。

于 2013-09-28T04:31:28.907 回答
1

面对可能是要走的路。决定每页需要多少个小平面图,然后循环所需的次数,随时生成 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)
于 2013-09-27T22:52:18.533 回答
1

你应该简化你的情节,因为一旦你用一个简单的情节得到了正确的顺序,你只需用复杂的情节来代替它。ggplot2是基于grid包的,所以你需要用来gridExtra安排你的情节。然后循环遍历,对于每 8 个图,将它们存储在一个列表中并调用grid.arrange它,然后重复此操作直到图结束...

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()
于 2013-09-27T21:46:28.717 回答
0

不幸的是,mfrow不适用于ggplot2. 您必须使用其他方法,例如thisthis或使用本机plot功能。

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

于 2013-09-27T22:03:33.287 回答