2016-09-17 56 views
1

在心理学中,通常会用覆盖正常曲线显示直方图。用geom_line显示观察值的密度将有利于与正常曲线进行比较,所以我编写了另一个直方图函数来执行此操作(userfriendlyscience包中的powerHist)。然而,对于大型矢量(目前与1670万个数据点一起工作),它执行速度非常缓慢,所以我试图让它更快。我曾经使用density来手动计算密度估计值,然后将它们与一个箱中的最大数据点数相乘以缩放它以匹配直方图。如何使用相关数据框内部或外部的变量在ggplot中实时转换美学?

但是,这是非常缓慢,加上,我想ggplot2应该能够做到这一点。由stat_density计算的变量之一是..scaled..,这是密度估计缩放到1的最大值。现在我只需要乘以这个。但ggplot2不会找到我使用的变量。将它与常量相乘可以正常工作,但是否将变量放在我传递给ggplot2的数据帧中似乎没有关系:ggplot2找不到它。

scalingFactor <- max(table(cut(mtcars$mpg, breaks=20))); 
dat <- data.frame(mpg = mtcars$mpg, 
        scalingFactor = scalingFactor); 
ggplot(mtcars, aes(x=mpg)) + 
    geom_histogram(bins=20) + 
    geom_line(aes(y=..scaled.. * scalingFactor), 
      stat='density', color='red'); 

这产生了:只用scalingFactor自身时

ggplot(mtcars, aes(x=mpg)) + 
    geom_histogram(bins=20) + 
    geom_line(aes(y=..scaled.. * 10), 
      stat='density', color='red'); 

Histogram with hardcoded scaled densitycurve

而且,:

Error in eval(expr, envir, enclos) : object 'scalingFactor' not found 

当用常规数字替换scalingFactor,它的工作原理,它也可以工作:

ggplot(mtcars, aes(x=mpg)) + 
    geom_histogram(bins=20) + 
    geom_line(aes(y=scalingFactor), 
      stat='density', color='red'); 

Histogram with horizontal line showing scalingFactor

所以scalingFactor似乎可用;乘法是可用的;并且显然..scaled..可用。不过,将它们结合起来似乎失败了。我在这里错过了什么?我无法找到任何有关'通过stat生成的变量或其他东西计算'的内容。 。 。

有没有人碰到过这个?它是否知道我刚刚错过的ggplot2行为?

回答

2

尝试aes_q(y=bquote(..scaled.. * .(scalingFactor)))

(虽然我认为是有缺陷的地方,因为在环境参数?ggplot表明,这不应该是必要的,而事实上与变量打交道时不需要,唐来自一个统计)

相关问题