首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >geom_vline、图例和性能

geom_vline、图例和性能
EN

Stack Overflow用户
提问于 2019-02-27 19:47:41
回答 1查看 522关注 0票数 2

我想在我的图上画几条垂直线,每条对应的vline都有一个图例。

在阅读了this post之后,我实现了以下内容:

代码语言:javascript
复制
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)

现在来看图:

代码语言:javascript
复制
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))

这样做效果很好:

但它非常慢:

代码语言:javascript
复制
utilisateur     système      écoulé 
     51.667       1.883      53.652 

(对不起,我的系统是法语的)

但是,当我这样做时(在aes之外使用xintercept ):

代码语言:javascript
复制
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))

不显示图例:

但它要快得多:

代码语言:javascript
复制
utilisateur     système      écoulé 
      1.193       0.270       1.496 

我怎样才能有两个世界的最好的东西,即一个传奇,快速显示?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-27 20:23:14

您可以使用第一种方法,但在geom_vline中将空data.frame作为data参数传递。速度问题是由geom_vlinemy.df中的每一行绘制直线造成的,在data = data.frame()中,它只绘制一次。

代码语言:javascript
复制
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 
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54904797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档