在R中,我正在用ggplot绘制大型(400,000个以上的时间点)时间序列。这是两条平均迹线,每条geom_ribbon
作为误差线。
我在相当长的时间内无法在png
中导出此地块时遇到严重问题。在尝试一些不同的调整时,我发现geom_ribbon
是罪魁祸首。
这是一个可重现的示例(由于某种原因,它不如我的真实数据糟糕,但足以回答我的问题)。
创建示例数据
library(ggplot2)
library(data.table)
library(tictoc)
test <- structure(list(grp = c("wt", "wt", "wt", "wt", "wt", "ko", "ko", "ko", "ko", "ko"),
sec = c(1, 2, 3, 4, 5, 226151, 226152, 226153, 226154, 226155),
mean = c(11.5208333333333, 9.84020145833333, 12.3625, 12.2381927083333, 11.6596766666667, 17.1381563414634, 16.0591951219512, 14.7609756097561, 12.5528292682927, 0),
sem = c(5.07322179860576, 4.04012867067194, 4.56616703891842, 4.70160041654607, 4.39606445058998, 3.02442054646122, 2.8947715702581, 2.73842770904548, 2.87276280525331, 0)),
.Names = c("grp", "sec", "mean", "sem"), class = c("data.table", "data.frame"), row.names = c(NA, -10L))
nrows <- 400000
test2 <- do.call("rbind", replicate(nrows/10, test, simplify = FALSE))
test2$sec[1:(nrow(test2)/2)] <- 1:(nrow(test2)/2)
test2$sec[(nrow(test2)/2+1):nrow(test2)] <- 1:(nrow(test2)/2)
具有/不具有功能区的图
testp <- ggplot (test2, aes(x=sec, y=mean, group=grp, colour=grp)) +
geom_line() +
geom_ribbon(aes(ymin=mean-sem, ymax=mean+sem, fill=grp), alpha=0.4)
testp2 <- ggplot (test2, aes(x=sec, y=mean, group=grp, colour=grp)) +
geom_line()
导出带状色带/不带状色带
tic('ribbon')
ggsave (filename='testp.png', device='png', plot=testp, dpi=20, width=5, height=5, units='in')
toc()
tic('no ribbon')
ggsave (filename='testp2.png', device='png', plot=testp2, dpi=20, width=5, height=5, units='in')
toc()
结果
色带:过去26.729秒
无色带:过去了2.009秒
我不明白为什么丝带要花这么长时间。它似乎也随着行数呈指数增长,这是一个真正的痛苦(如预期的那样,多2倍的行使用功能区需要5倍的时间,而不使用功能区则需要2倍的时间)。这对我来说没有意义!
我该怎么办?