如何使用ggplot以自动方式叠加许多相关函数?

Wil*_*rly 3 r ggplot2

除了一个可调参数外,我有一系列相同的函数,我想在一组轴上绘制所有这些函数,所有这些函数都叠加在一起.例如,这可能是sin(n*x),具有n的各种值,比如说1:30,我不想单独输出每个命令 - 我想应该有一些方法可以做到这一点编程.

library(ggplot2)
Run Code Online (Sandbox Code Playgroud)

将trig函数定义为频率的函数:sin(x),sin(2x),sin(3x)等.

trigf <- function(i)(function(x)(sin(i*x)))
Run Code Online (Sandbox Code Playgroud)

叠加两个功能图 - 当然这是手动的

ggplot(data.frame(x=c(0,pi)), aes(x)) + stat_function(fun=trigf(1)) +  stat_function(fun=trigf(2))
Run Code Online (Sandbox Code Playgroud)

现在尝试概括 - 我的想法是使用一个stat_functions列表 lapply

plotTrigf <- lapply(1:5, function(i)(stat_function(fun=function(x)(sin(i*x))) ))
Run Code Online (Sandbox Code Playgroud)

尝试手动使用列表的元素,但它并没有真正起作用 - 只显示了i=5图表,我不知道为什么不是我引用的那个

ggplot(data.frame(x=c(0,pi)), aes(x)) +plotTrigf[[1]] + plotTrigf[[2]]
Run Code Online (Sandbox Code Playgroud)

我认为这Reduce可能会处理添加到a的'generalized sum' ggplot()但它不起作用 - 它抱怨二元运算符的非数字参数

Reduce("+", plotTrigf)
Run Code Online (Sandbox Code Playgroud)

所以我在执行这个策略时都会遇到困难,或者可能还有其他一些方法可以做到这一点.

MrF*_*ick 5

你使用的版本R <3.2?问题是您实际上需要ilapply通话中评估您的参数.现在它被留下作为一个承诺,并且在你尝试绘制之前不会被评估,并且在那一点i上它具有它在lapply循环中的最后一个值,即5.使用:

plotTrigf <- lapply(1:5, function(i) {force(i);stat_function(fun=function(x)(sin(i*x))) })
Run Code Online (Sandbox Code Playgroud)

您不能只是stat_function一起添加呼叫,即使没有Reduce()您收到错误

stat_function(fun=sin)  + stat_function(fun=cos)
# Error in stat_function(fun = sin) + stat_function(fun = cos) : 
#   non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)

您需要将它们添加 ggplot对象.Reduce()如果只指定init=参数,则可以执行此操作

Reduce("+", plotTrigf, ggplot(data.frame(x=c(0,pi)), aes(x)))
Run Code Online (Sandbox Code Playgroud)

实际上+ggplot对象的特殊操作符允许您添加对象列表,因此您根本不需要它Reduce(请参阅代码ggplot2:::add_ggplot)

ggplot(data.frame(x=c(0,pi)), aes(x)) + plotTrigf
Run Code Online (Sandbox Code Playgroud)

最终的结果是

在此输入图像描述