在多个页面上绘图 [英] Plot over multiple pages

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

问题描述

我有 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天全站免登陆