绘制多页 [英] Plot over multiple pages

查看:92
本文介绍了绘制多页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我具有facet_wrap函数来制作多个图形(n =〜51),但是它们全部出现在一页上.现在搜索之后,我发现 ggplot2 不能在多个页面上放置图形.

I have the facet_wrap function to make multiple graphs (n=~51) but they all appear on one page. Now after searching, I found out that ggplot2 can't place graphs on multiple pages.

有没有办法做到这一点?我看着这个问题(使用ggplot在多个页面上的多个图)并尝试了代码,但收效甚微.

Is there a way to do this? I looked at this question (Multiple graphs over multiple pages using ggplot) and tried out the code, with little success.

这是我的图形代码,它在一页上生成约51个图形,这使其非常小且难以看清,如果我可以将其打印到pdf中每页1张图形的话,那就太好了:

Here is my code for my graphs, it produces ~51 graphs on one page, making them very small and hard to see, if I could print this to 1 graph per page in a pdf, that would be great:

ggplot(indbill, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
facet_wrap(~ individual) +
theme(axis.ticks.x = element_blank(),
    axis.text.x = element_text(size=rel(0.5)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()

如果有人可以编写一些代码并向我解释,那就太好了.

If someone could write up a little code and explain it to me, that would be great.

推荐答案

一个选择是使用与您现在使用的相同的代码一次绘制六个级别的individual.您只需要对其进行多次迭代,就数据的每个子集而言一次.您尚未提供示例数据,因此这是使用Baseball数据框的示例:

One option is to just plot, say, six levels of individual at a time using the same code you're using now. You'll just need to iterate it several times, once for each subset of your data. You haven't provided sample data, so here's an example using the Baseball data frame:

library(ggplot2)
library(vcd) # For the Baseball data
data(Baseball)

pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
   print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
                  aes(hits86, sal87)) + 
    geom_point() +
    facet_wrap(~ team87) +
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
    theme_bw())
}
dev.off()

上面的代码将生成一个PDF文件,该文件包含四页绘图,每页有六个构面.您还可以创建四个单独的PDF文件,每个文件包含六个构面:

The code above will produce a PDF file with four pages of plots, each with six facets to a page. You can also create four separate PDF files, one for each group of six facets:

for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
  ...ggplot code...
dev.off()
}

如果需要更大的灵活性,另一种选择是为构面变量的每个级别(即每个唯一值)创建一个单独的图,并将所有单个图保存在列表中.然后,您可以在每页上布置任意数量的图.在这里这可能有点过分,但是这是一个示例,其中的灵活性非常有用.

Another option, if you need more flexibility, is to create a separate plot for each level (that is, each unique value) of the facetting variable and save all of the individual plots in a list. Then you can lay out any number of the plots on each page. That's probably overkill here, but here's an example where the flexibility comes in handy.

首先,让我们创建所有图.我们将使用team87作为分面列.因此,我们想为每个team87级别绘制一个图.为此,我们将数据按team87拆分,并为数据的每个子集绘制一个单独的图.

First, let's create all of the plots. We'll use team87 as our facetting column. So we want to make one plot for each level of team87. We'll do this by splitting the data by team87 and making a separate plot for each subset of the data.

在下面的代码中,split将每个级别的team87数据拆分为单独的数据帧. lapply包装器将每个数据子集依次输入到ggplot中,以为每个团队创建一个图.我们将输出保存在plist中,该列表是(在这种情况下)24个图的列表.

In the code below, split splits the data into separate data frames for each level of team87. The lapply wrapper sequentially feeds each data subset into ggplot to create a plot for each team. We save the output in plist, a list of (in this case) 24 plots.

plist = lapply(split(Baseball, Baseball$team87), function(d) {
  ggplot(d, aes(hits86, sal87)) + 
    geom_point() +
    facet_wrap(~ team87) +
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
    theme_bw() +
    theme(plot.margin=unit(rep(0.4,4),"lines"),
          axis.title=element_blank())
})

现在,我们将一次在一个PDF文件中布置六个图.以下是两个选项,一个带有四个单独的PDF文件,每个带有六个图,另一个带有一个四页PDF文件.我还粘贴了底部的其中一个地块.我们使用grid.arrange布置图,包括使用leftbottom参数添加轴标题.

Now we'll lay out six plots at time in a PDF file. Below are two options, one with four separate PDF files, each with six plots, the other with a single four-page PDF file. I've also pasted in one of the plots at the bottom. We use grid.arrange to lay out the plots, including using the left and bottom arguments to add axis titles.

library(gridExtra)

# Four separate single-page PDF files, each with six plots
for (i in seq(1, length(plist), 6)) {
  pdf(paste0("baseball_",i,".pdf"), 7, 5)
  grid.arrange(grobs=plist[i:(i+5)], 
               ncol=3, left="Salary 1987", bottom="Hits 1986")
  dev.off()
}

# Four pages of plots in one PDF file
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(plist), 6)) {
  grid.arrange(grobs=plist[i:(i+5)], 
               ncol=3, left="Salary 1987", bottom="Hits 1986")
}
dev.off()

这篇关于绘制多页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆