2012-11-01 2 views
5

Mi piacerebbe disegnare una funzione di legge di potenza che dipende da tre parametri: x, a e gamma. La funzione è simile al seguente:Disegna una funzione in ggplot2 con più di x come parametro

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

Ora voglio tracciare questo, ma non riesco a capire come specifiy a e gamma mentre dice R per utilizzare la gamma di scelta per x. Ho provato questo:

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

ma si dice

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

Naturalmente, il seguente codice funziona fissando a e gamma:

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

Tutte le idee?

risposta

3

è necessario specificare gli argomenti separatamente:

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

Vedere ?stat_function per maggiori dettagli.

+0

Grazie, l'ha fatto! – networker

1

vorrei solo creare una funzione che restituisce una data.frame appropriato per 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 

e fare una trama (notare che io uso un più strettamente distanziati serie x per ottenere una linea più fluida):

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

enter image description here

+0

Grazie Paul, anche questa è una soluzione interessante che userò sicuramente per un altro problema. Per il problema sopra, era importante avere una curva liscia, però. ggplot2 fa un lavoro meraviglioso nel fornire tale curva con l'opzione stat = "function". – networker

+0

Per una curva uniforme è sufficiente usare un 'x' con un dx più piccolo:' dat = power_data (seq (1, 10, 0.01), 1, 1) '. –