2012-11-01 8 views
5

मैं एक पावर-लॉ फ़ंक्शन तैयार करना चाहता हूं जो तीन मानकों पर निर्भर करता है: x, a, और gamma। समारोह इस तरह दिखता है:ggplot2 में x से अधिक पैरामीटर के रूप में ggplot2 में एक फ़ंक्शन ड्रा करें

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

अब मैं इस साजिश करना चाहते हैं, लेकिन मैं समझ नहीं a और gamma specifiy के लिए कैसे आर कह जबकि x के लिए चुना रेंज का उपयोग करने के लिए। मैं इस की कोशिश की:

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

लेकिन यह

Error in (x^(-gamma)): x is missing 
बेशक

, निम्नलिखित कोड काम करता है कहते हैं a और gamma फिक्सिंग द्वारा:

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

कोई भी विचार?

उत्तर

3

आप अलग तर्क निर्दिष्ट करने की आवश्यकता:

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

अधिक जानकारी के लिए ?stat_function देखें।

+0

धन्यवाद, कि यह किया! – networker

1

मैं सिर्फ एक समारोह जो रिटर्न पैदा करेगा एक data.frame उचित 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 

और एक साजिश बनाने के (ध्यान दें कि मैं एक और अधिक मजबूती से स्थान दिया गया है x श्रृंखला का उपयोग एक चिकनी लाइन प्राप्त करने के लिए):

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

enter image description here

+0

धन्यवाद पॉल, यह भी एक दिलचस्प समाधान है कि मैं निश्चित रूप से एक अलग समस्या के लिए उपयोग करेंगे। उपर्युक्त समस्या के लिए, हालांकि, एक चिकनी वक्र होना महत्वपूर्ण था। ggplot2 stat = "function" विकल्प के साथ इस तरह के वक्र प्रदान करने में एक अद्भुत काम करता है। – networker

+0

एक चिकनी वक्र के लिए आप केवल एक छोटे xx के साथ 'x' का उपयोग कर सकते हैं: 'dat = power_data (seq (1, 10, 0.01), 1, 1)'। –