geom_vline, легенда и производительность - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу построить несколько вертикальных линий на моем графике и иметь легенду для каждого соответствующего 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))

Это работает довольно хорошо:

enter image description here

Но это очень медленно:

utilisateur     système      écoulé 
     51.667       1.883      53.652 

(Извините, моя система на французском языке)

Однако, когда я делаю это (с ксинтерцептом за пределами 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))

Легенда гласит:не отображается:

enter image description here

Но это намного быстрее:

utilisateur     système      écoulé 
      1.193       0.270       1.496 

Как я могу получить лучшее из обоих миров, т.е.легенда, отображаемая быстро?

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете использовать первый метод, но передать пустой 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 
...