2012-11-01 11 views
5

Chciałbym narysować funkcję prawa mocy, która zależy od trzech parametrów: x, a i gamma. Funkcja wygląda tak:Narysuj funkcję w ggplot2 z więcej niż x jako parametr

powerlaw <- function(x, a, gamma){ 
    a*(x**(-gamma)) 
} 

Teraz chcę wykreślić to, ale nie mogę dowiedzieć się, jak specifiy a i gamma opowiadając R, aby skorzystać z wybranego zakresu dla x. Próbowałem to:

require(ggplot2) 
qplot(c(1,10), stat="function", fun=powerlaw(x, a=1, gamma=1), geom="line") 

ale mówi

Error in (x^(-gamma)): x is missing 

Oczywiście poniższy kod działa poprzez ustalenie a i gamma:

powerlaw1 <- function(x){ 
    1*(x**(-1)) 
} 
qplot(c(1,10), stat="function", fun=powerlaw1, geom="line") 

Jakieś pomysły?

Odpowiedz

3

musisz określić argumenty oddzielnie:

qplot(x=c(1,10), stat="function", 
     fun=powerlaw, geom="line", 
     arg=list(a=1, gamma=1)) 

Zobacz ?stat_function więcej szczegółów.

+0

Dzięki, to się udało! – networker

1

Chciałbym po prostu utworzyć funkcję, która zwraca data.frame odpowiednie dla ggplot2:

power_data = function(x, a, gamma) { 
    return(data.frame(x = x, y = a * (x**(-gamma)))) 
} 

> power_data(1:10, 1, 1)           
    x   y              
1 1 1.0000000              
2 2 0.5000000              
3 3 0.3333333              
4 4 0.2500000              
5 5 0.2000000              
6 6 0.1666667              
7 7 0.1428571              
8 8 0.1250000              
9 9 0.1111111 
10 10 0.1000000 

i zrobić wykres (zauważ, że używam bardziej ciasno rozmieszczone x serię, aby uzyskać płynność linii):

dat = power_data(seq(1,10,0.01), 1, 1) 
qplot(dat$x, dat$y, geom = "line") 

enter image description here

+0

Dzięki Paul, to także interesujące rozwiązanie, które z pewnością wykorzystam do innego problemu. W przypadku powyższego problemu ważne było jednak uzyskanie gładkiej krzywej. ggplot2 wykonuje cudowną pracę polegającą na zapewnieniu takiej krzywej z opcją stat = "function". – networker

+0

Aby uzyskać gładką krzywą, wystarczy użyć 'x' z mniejszym dx:' dat = power_data (seq (1, 10, 0.01), 1, 1) '. –

Powiązane problemy