如何使用相关数据框内部或外部的变量在 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 中的环境参数表明不需要这样做,实际上在处理不是来自统计的变量时不需要)
在心理学中,显示带有叠加正态曲线的直方图是很常见的。同样用 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 中的环境参数表明不需要这样做,实际上在处理不是来自统计的变量时不需要)