如何使用相关数据框内部或外部的变量在 ggplot 中转换美学 'on the fly'?

How can I transform aesthetics 'on the fly' in ggplot using variables inside or outside the relevant dataframe?

在心理学中,显示带有叠加正态曲线的直方图是很常见的。同样用 geom_line 显示观测值的密度将有助于与正态曲线进行比较,因此我编写了另一个直方图函数来执行此操作(userfriendlyscience 包中的 powerHist )。但是,它对于大向量(目前处理 1670 万个数据点)的执行速度非常慢,所以我试图让它更快。我曾经使用 density 手动计算密度估计值,然后将它们与 bin 中的最大数据点数相乘以缩放它以匹配直方图。

但这很慢,另外,我认为 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');

这产生:

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

用常规数字替换 scalingFactor 时,有效:

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

此外,当单独使用 scalingFactor 时,它也有效:

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

所以 scalingFactor 似乎可用;乘法可用;显然 ..scaled.. 可用。尽管如此,将它们结合起来似乎还是失败了。我在这里错过了什么?我在 'computation with variables generated by stat' 上找不到任何东西。 . .

有人 运行 以前参与过这个吗?我刚刚错过了已知的 ggplot2 行为吗?

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

(尽管我认为某处存在错误,因为 ?ggplot 中的环境参数表明不需要这样做,实际上在处理不是来自统计的变量时不需要)