【发布时间】:2020-03-10 18:56:01
【问题描述】:
尝试将多个绘图绘制到 PDF 时出现错误。我已经使用来自Printing multiple ggplots into a single pdf, multiple plots per page 的代码来创建我的循环,但我不确定是什么导致了错误。
PDF 可以编译,但它只有一页,而且是空白的。我已经重新创建了下面的问题,它似乎是一个数据维度问题,但我不清楚应该如何解决它。可以从绘图查看器手动将绘图保存为 PDF,但它似乎在循环中失败了。我的期望是获得一份 3 页长的 PDF,每页一张图表。
library(ggplot2)
library(naniar)
library(visdat)
library(gridExtra)
p = list()
head(iris)
p[[1]] = gg_miss_var(iris)
p[[2]] = vis_miss(iris)
p[[3]] = vis_dat(iris)
pdf("plots_test2.pdf", onefile = TRUE)
for (i in seq(length(p))) {
do.call("grid.arrange", p[[i]])
}
dev.off()
出现的错误:
Error in `$<-.data.frame`(`*tmp*`, "wrapvp", value = list(x = 0.5, y = 0.5, :
replacement has 17 rows, data has 5
【问题讨论】:
-
如果你删除
pdf和`dev.off` 行,只有循环工作吗?似乎我们可以将问题缩小到与(a)产生情节(你说这对观众有效),(b)在循环中产生情节(似乎可能是问题的根源......)(c)把pdf 中的绘图。 -
很好发现 - 循环不起作用。当我删除
pdf和dev.off()时,我收到错误消息。所以现在我想这与grid.arrange通话有关 -
我建议编辑您的问题,然后专注于循环打印这些图,而不是生成 pdf。也就是说,我不熟悉您正在使用的非 ggplot 包,但在您指向的问题中
p是一个列表,其中每个项目都是多个图的子列表,需要显示grid.arrange一起。你的情况也是这样吗?如果gg_miss_var和vis_miss给出单个图,而print(p[[1]])可以显示第一个图,则忘记do.call,只需将print(p[[i]])放在for 循环中。 -
轰——这行得通!谢谢你。将
do.call替换为print()