Итак, я провел несколько тестов с n = 50000
:
base <- system.time({
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
print(p)
})
facet <- system.time({
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
print(p)
})
# Adding group to stat_smooth, so the number of lines it
# has to estimate is consistent with the facetted option
smooth <- system.time({
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2, group = interaction(name1, name2)), method = "lm")
print(p)
})
smooth_facet <- system.time({
p <- ggplot()
p <- p + geom_point(data=FACET, aes(a1, a2), size = 0.5)
p <- p + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
p <- p + facet_grid(vars(name1), vars(name2)) + coord_fixed()
print(p)
})
building <- system.time({
pp <- ggplot_build(p)
})
interpreting <- system.time({
ppp <- ggplotGrob(pp$plot)
})
library(grid)
drawing <- system.time({
grid.newpage(); grid.draw(ppp)
})
alternative <- system.time({
g <- ggplot()
g <- g + geom_point(data=FACET, aes(a1, a2), size = 0.5, shape = ".")
g <- g + stat_smooth(data=FACET, aes(a1, a2), method = "lm")
g <- g + facet_grid(vars(name1), vars(name2)) + coord_fixed()
print(g)
})
Это были результаты:
rbind(base, facet, smooth, smooth_facet, building, interpreting, drawing, alternative)
user.self sys.self elapsed user.child sys.child
base 8.34 30.96 39.44 NA NA
facet 8.56 30.48 39.12 NA NA
smooth 10.00 31.14 41.18 NA NA
smooth_facet 10.14 31.50 41.73 NA NA
building 2.59 0.42 3.03 NA NA
interpreting 5.08 0.61 5.76 NA NA
drawing 5.13 30.23 35.39 NA NA
alternative 7.58 8.23 15.86 NA NA
Что подсказывает мне, что это не код медленного ggplot, это либо код рисования, либо тот факт, что вам нужно рисовать много точек.
Однако может показаться, что вы можете сократить время более чем наполовину, не используя округленные точки, а используя shape = "."
в выражении geom_point()
(как в «альтернативном» тесте). В любом случае, вы, вероятно, перепланируете точки. Вот как это выглядит: