r - 在多个页面上绘图

标签 r ggplot2 plot gridextra radar-chart

我有 facet_wrap函数来制作多个图形 (n=~51) 但它们都出现在一页上。现在搜索后,我发现ggplot2无法在多个页面上放置图形。

有没有办法做到这一点?我查看了这个问题( Multiple graphs over multiple pages using ggplot )并尝试了代码,但收效甚微。

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

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

如果有人能写出一小段代码并向我解释,那就太好了。

最佳答案

一种选择是仅绘制 individual 的六个级别。一次使用您现在使用的相同代码。您只需要迭代它几次,每个数据子集迭代一次。您尚未提供示例数据,因此这里是使用 Baseball 的示例数据框:

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 文件,每组六个面一个:
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
  ...ggplot code...
dev.off()
}

如果您需要更大的灵活性,另一种选择是为分面变量的每个级别(即每个唯一值)创建一个单独的图,并将所有单个图保存在一个列表中。然后您可以在每页上布置任意数量的图。这在这里可能有点矫枉过正,但是 here's an example灵活性派上用场的地方。

首先,让我们创建所有的图。我们将使用 team87作为我们的刻面列。所以我们想为 team87 的每一层绘制一个图。 .我们将通过 team87 分割数据来实现这一点。并为每个数据子集绘制单独的图。

在下面的代码中,splitteam87 的每个级别将数据拆分为单独的数据帧. lapply包装器将每个数据子集依次输入 ggplot 以创建每个团队的图。我们将输出保存在 plist ,(在本例中)24 个图的列表。
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添加轴标题的参数。
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()

关于r - 在多个页面上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736655/

相关文章:

r - 在 r 中使用 ggplot2 创建月份大小的 bin

r - 如何在 ggplot2 中创建 Marimekko/马赛克图

r - R 函数错误 `is.positive.definite`

r - 如何根据 ggplot2 散点图的数值阈值定义颜色组

r - 如何删除R中第n个分隔符之后的所有内容?

r - 带有先前计算值的箱线图

matlab - MATLAB 中的抗锯齿线和标记

java - java android 中的等待/恢复线程

r - Tidyverse : Converting numerical data into categorical data for plotting with uneven bin width

r - R 中的内存高效分类器,用于极宽且不太长的训练集