简体   繁体   English

使用ggplot在多个页面上的多个图形

[英]Multiple graphs over multiple pages using ggplot

I am doing an exploratory analysis of my data and need to plot multiple graphics using ggplot. 我正在对我的数据进行探索性分析,需要使用ggplot绘制多个图形。 The amount of graphics is really huge (206 Stations), and I wanted to plot them in 1 column vs. 8 rows per page over the so many pages needed. 图形数量非常庞大(206个工作站),我想在所需的许多页面上将它们绘制成1列而不是每页8行。 I am aware of functions like viewport or grid.arrange, but I am not managing to make them work in this case. 我知道像viewport或grid.arrange这样的函数,但我不能让它们在这种情况下工作。 I have already noticed that layout() nor par(mfrow=c(8,1)) do not work with ggplot, but I send the part of the code where I am stuck bellow. 我已经注意到layout()和par(mfrow = c(8,1))不能与ggplot一起使用,但是我发送了代码中我被卡住的部分。 Any help would be much appreciated! 任何帮助将非常感激!

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

untested. 未经测试。

You should simplify your plot since once you get the right order with a simple plot you just replace it with your complicated one. 您应该简化您的情节,因为一旦您通过简单的情节获得正确的顺序,您只需将其替换为复杂的情节。 ggplot2 are based on grid package so you need to use gridExtra to arrange your plots. ggplot2基于grid包,因此您需要使用gridExtra来排列图。 Then you loop through , for each 8 plots, you store them in a list and you call grid.arrange over it, and you repeat this until the end of your plots... 然后你循环,对于每8个图,你将它们存储在一个列表中, grid.arrange在它上面调用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()

Faceting might be the way to go. 分面可能是要走的路。 Decide how many faceted mini-plots you want per page, then loop through the required number of times, generating a png or a pdf as you go. 确定每页需要多少个刻面的迷你图,然后循环所需的次数,随时生成png或pdf。 So if you have 200 data items and you want 50 per page, in facets of 5 across and 10 down, just loop through 200/50 = 4 iterations. 因此,如果您有200个数据项,并且每页需要50个数据项,则在5个横向和10个向下的方面,只需循环200/50 = 4个迭代。 Crude, but should work. 原油,但应该工作。

面

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)

Unfortunately, mfrow doesn't work with ggplot2 . 不幸的是, mfrow不适用于ggplot2 You have to use other methods like this one or this one or use the native plot function. 您必须使用此类此类的其他方法或使用本机plot功能。

Maybe you can use faceting to get the 8 plots onto one page, then the second link to put it into multiple documents... 也许你可以使用faceting将8个图表放到一个页面上,然后将第二个链接放到多个文档中......

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM