R 使用ggplot在多个页面上绘制多个图形
我正在对我的数据进行探索性分析,需要使用ggplot绘制多个图形。图形的数量非常巨大(206个站点),我想在需要的这么多页面上,将它们绘制成1列,而不是每页8行。我知道诸如viewport或grid.arrange之类的函数,但在这种情况下我无法使它们正常工作。我已经注意到layout()或par(mfrow=c(8,1))不适用于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=
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
系列。所以我在这里猜测,但这是否意味着您已经将subsetedtab
对象(按桩号subseted)传递到ggplotp
,使用%+%
函数覆盖了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)