除了一个可调参数外,我有一系列相同的函数,我想在一组轴上绘制所有这些函数,所有这些函数都叠加在一起.例如,这可能是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)
所以我在执行这个策略时都会遇到困难,或者可能还有其他一些方法可以做到这一点.
你使用的版本R <3.2?问题是您实际上需要i在lapply通话中评估您的参数.现在它被留下作为一个承诺,并且在你尝试绘制之前不会被评估,并且在那一点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)
最终的结果是

| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |