我有这个功能。
change <- function(score, d, k, p) {k*(score - 1/(1+k^(d/p)))}
我想在一个单独的情节中,为一系列参数d和p绘制此函数的所有结果。在基地r就是这样。
parameters <- c(100:400)
colorshelf <-rainbow(length(parameters)) #red is low
for(i in seq_along(parameters)) {
print(i)
curve(change(score=1, d=x, k=100, p=parameters[i]), from=0, to=500, add=T, col=colorshelf[i])
}
但是我认为这在ggplot2中一定是可行的,但无法解决这个问题。我目前仍然坚持这一点。任何帮助表示赞赏。
ggp <- ggplot(data.frame(Ds=c(0:1000), Ps=c(0:1000)), aes(x=Ds, col=Ps)) +
stat_function(fun=change, args=list(score=1, d=Ds, k=100, p=Ps))
ggp
答案 0 :(得分:5)
我会在man
之外执行此操作。我认为期望ggplot2
对两个不同的参数进行矢量化可能太过分了......
这是tidyverse,但也可以使用ggplot
轻松完成。
apply
我只做 library(dplyr)
change <- function(score, d, k, p) {k*(score - 1/(1+k^(d/p)))}
dd <- expand.grid(d=0:1000,p=0:100)
dd %>% rowwise %>%
mutate(c=change(score=1,d=d,k=100,p=p)) ->
dd2
library(ggplot2)
ggp <- ggplot(dd2,aes(d,c,col=p,group=p))+
geom_path()
从0到100(而不是0到1000),因为100万个点是ggplot的一个相当大的数据集。 (你真的需要看到1000个单独的值吗?也许p
?
答案 1 :(得分:0)
现在,我有一个非常相似的问题;我想在ggplot中绘制一个函数,其中多个参数按行存储在数据框中。由于我不需要在代码的其余部分中为每个数据点评估函数的数据框,因此让ggplot 为我做肮脏的工作。 但是,我的方法的缺点是在应用中对数据帧进行排序时位置知识的次要缺点(这不应该是您的问题)。我还需要一个颜色列(在这里:“组”),在我的情况下,这实际上是分组所需要的。而且,由于您的参数是非平衡的,因此您必须扩展.grid参数
我想出的解决方案的基本原理如下:
p = ggplot(data.frame(x = c(-5, 10)), aes(x))
# this format specifies start & end of the x-axis for which the function is evaluated.
d = data.frame(mu = 1:4, sigma= c(1,1,2,2), group = c(1,1,2,2))
# each row is a parameter set.
p = p + apply(
d,
MARGIN = 1,
FUN = function(z)
stat_function(
fun = dnorm, # you can specify your own function which lives in .GlobalEnvir
geom = "line",
args = list(mean = z[1] , sd = z[2]),
color = z[3]
)
)
print(p)
但是如果您有一组非标准化的参数(例如,有时您没有均值或sd的值,并且希望在传递args时完全忽略它们),则可以使用lapply更为灵活的方法。 请注意,如果您想使用函数的默认值,例如dnorm,则无需指定特定参数。