2017-03-04 63 views
1

我得到了這個函數。帶有幾個參數的ggplot2繪圖函數

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 

回答

5

我會在ggplot2以外做這個。我認爲可能期望ggplot矢量化兩個不同的參數可能太多了......

這是與tidyverse,但也可以很容易地與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() 

我只是做p從0到100(而不是0至1000),因爲100萬點是一個相當大的數據集ggplot。 (你真的需要看到1000個單獨的值嗎?也許seq(0,1000,length=100)

+0

使用mutate(obs = 1:n())%>%group_by(obs)'和使用rowwise()'有區別嗎? – Phil