geom_vline, легенда и производительность
Я хочу построить несколько вертикальных линий на моем графике и иметь легенду для каждого соответствующего влайна.
Прочитав этот пост, вот что я реализовал:
set.seed(99)
df.size <- 1e6
my.df <- data.frame(dist = rnorm(df.size, mean = 0, sd = 2))
library(ggplot2)
ggplot(my.df, aes(x=dist)) + geom_histogram(binwidth = 0.5)
vline1.threshold <- mean(my.df$dist)
vline2.threshold <- mean(my.df$dist) + 3*sd(my.df$dist)
Теперь о сюжете:
g <- ggplot(my.df, aes(x = dist)) +
geom_histogram(binwidth = 0.5) +
geom_vline(aes(color = "vline1", xintercept = vline1.threshold)) +
geom_vline(aes(color = "vline2", xintercept = vline2.threshold)) +
scale_color_manual("Threshold", values = c(vline1 = "red", vline2 = "blue"), labels = c("Mean", "Mean + 3*SD"))
system.time(print(g))
Это работает довольно хорошо:
Но это очень медленно
utilisateur système écoulé
51.667 1.883 53.652
(Извините, моя система на французском)
Однако, когда я делаю это (с xintercept вне aes):
g <- ggplot(my.df, aes(x = dist)) +
geom_histogram(binwidth = 0.5) +
geom_vline(aes(color = "vline1"), xintercept = vline1.threshold, color = "red") +
geom_vline(aes(color = "vline2"), xintercept = vline2.threshold, color = "blue") +
scale_color_manual("Threshold", values = c(vline1 = "red", vline2 = "blue"), labels = c("Mean", "Mean + 3*SD"))
system.time(print(g))
Легенда не отображается:
Но это намного быстрее:
utilisateur système écoulé
1.193 0.270 1.496
Как быстро получить лучшее из обоих миров, то есть легенду?
1 ответ
Решение
Вы можете использовать первый метод, но передать пустой data.frame как data
аргумент в geom_vline
, Проблема со скоростью вызвана geom_vline
линия для каждой строки в my.df
с data = data.frame()
это заговор только один раз.
g2 <- ggplot(my.df, aes(x = dist)) +
geom_histogram(binwidth = 0.5) +
# pass empty data.frame as data
geom_vline(aes(color = "vline1", xintercept = vline1.threshold), data.frame()) +
# pass empty data.frame as data
geom_vline(aes(color = "vline2", xintercept = vline2.threshold), data.frame()) +
scale_color_manual("Threshold", values = c(vline1 = "red", vline2 = "blue"), labels = c("Mean", "Mean + 3*SD"))
# OPs solution
# system.time(print(g))
# user system elapsed
# 36.636 1.714 38.397
# data.frame() solution
# system.time(print(g2))
# user system elapsed
# 2.203 0.265 2.504