gpt4 book ai didi

r - 如何更快地创建 1000 页的 pdf?

转载 作者:行者123 更新时间:2023-12-01 09:17:37 24 4
gpt4 key购买 nike

我需要在 R 中使用 ggplot2 将 1000 多页绘制到 PDF 文件中。除了以下代码之外,还有更快的方法:

library(ggplot2)
data(diamonds)
pdf("name.pdf", width = 6, height = 6)
for(i in 1:1000) {
p1 <- ggplot(diamonds, aes(x = carat, y = price)) +
geom_point()
print(p1)
}
dev.off()

我的实际情况是这样的;

(1)需要读取一个文件,根据文件每一行的值创建一个data.frame

(2) 将该文件的每一行绘制为 pdf。

fa <- read.table(file)
pdf(name.pdf, width = 6, height = 4)
for(i in 1:nrow(fa)) {
new.data <- function(i)
p1 <- ggplot(new.data,...) + ...
print(p1)
}
dev.off()

最佳答案

如上所述,速度是 ggplot2 的弱点之一。这需要一些工作,但您通常可以在其他标准绘图包(base 或 lattice)之一中复制 ggplot 的外观;例如this series of blog posts反其道而行之(从 lattice 到 ggplot),但这些示例应该会有所帮助。 (@G.Grothendieck 下面的评论 library(latticeExtra); xyplot(y ~ x, diamonds, par.settings = ggplot2like(), lattice.options = ggplot2like.opts()) 将生成 ggplot-像情节。)

如果您真的很绝望,我想您可以使用 parallel::parApply 生成合理数量的单独 PDF,然后使用诸如 pdftk 之类的外部工具来拼接它们一起...

设置机器以在所有三个系统中生成(大约)相同的图

 library("ggplot2")
library("lattice")
data(diamonds)
gg_plot <- function() {
cat(".")
print(ggplot(diamonds, aes(x = carat, y = price)) +
geom_point())
}
base_plot <- function() {
cat("+")
plot(y~x,data=diamonds)
}
lattice_plot <- function() {
cat("/")
print(xyplot(y~x,data=diamonds))
}
wrap <- function(f,npages=20,fn="name.pdf") {
pdf(fn, width = 6, height = 6)
for(i in 1:npages) {
f()
}
dev.off()
unlink(fn)
}

library("rbenchmark")
benchmark(wrap(gg_plot),wrap(base_plot),wrap(lattice_plot),
replications=10)

好的,这比我预期的要慢得多(我将其缩减为每个 PDF 20 页和 10 次复制)。 (我最初以为 lattice 赢了很多,但那是因为我忘了 print() 结果...)

lattice 和 base 的速度都是 ggplot 的两倍...

                test replications elapsed relative user.self sys.self
2 wrap(base_plot) 10 75.693 1.249 74.053 1.596
1 wrap(gg_plot) 10 120.397 1.987 117.507 2.832
3 wrap(lattice_plot) 10 60.590 1.000 58.580 1.976

关于r - 如何更快地创建 1000 页的 pdf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29158108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com