2015-07-23 25 views
13

का उपयोग करके एक पावर वक्र कैसे आकर्षित करें मैं पावर वक्र का पालन करने वाले कुछ डेटा को देखने के लिए ggplot2 का उपयोग करना चाहता हूं। इससे पहले पूछा गया है (Add exp/power trend line to a ggplot) लेकिन उत्तर वास्तव में मदद नहीं करता था।ggplot2

एक चाल एक वक्र बनाने के लिए stat_function() का उपयोग करना है। हालांकि, मैं stat_function() और लॉगरिदमिक स्केल के साथ काम करने के लिए अपने पावर वक्र प्राप्त करने में असमर्थ हूं।

मैं अपनी समस्याओं का वर्णन करता हूं।

नमूना डेटा और एक आधार साजिश बनाएँ:

library(ggplot2) 

x <- 1:100 
pwr <- function(x)x^-2.5 
dat <- data.frame(x, y = pwr(x)) 

p <- ggplot(dat, aes(x = x, y = y)) + 
    geom_point() 

p + stat_function(fun = pwr) 

enter image description here

बढ़िया है, चलो एक coord_trans() का उपयोग कर कुछ logaritmic तराजू जोड़ते हैं। यह पूरी तरह से काम करता है, सिवाय इसके कि मेरी सीधी रेखाएं अब सीधे नहीं हैं (ठीक उसी तरह जैसे दस्तावेज मुझे उम्मीद करने के लिए कहता है)।

p + stat_function(fun = pwr) + coord_trans(x = "log10", y = "log10") 

enter image description here

तो, coord_x_log10() और coord_y_log10() साथ फिर से प्रयास है, लेकिन इस एक त्रुटि फेंकता है:

p + stat_function(fun = pwr) + scale_x_log10() + scale_y_log10() 

Error in seq.default(min, max, by = by) : 
    'from' cannot be NA, NaN or infinite 

यह सबसे तथ्य मैं समायोजित करने के लिए है कि के साथ क्या होने की संभावना है मेरे काम तराजू के प्रभाव को उलटने के लिए, लेकिन मैं इसे काफी समझ नहीं सकता।

मैं केवल logarithmix एक्स पैमाने के साथ यह कर सकते हैं:

p + scale_x_log10() + stat_function(fun = function(x)pwr(10^x)) 

enter image description here

मैं पता नहीं कैसे अगर मैं scale_y_log10() जोड़ने y- मानों कन्वर्ट करना होगा।

मुझे शायद कुछ मौलिक याद आ रही है। क्या इस वक्र को साजिश करने का कोई आसान तरीका है?

+1

तो 'ggplot2' हिस्सा एक सौदा ब्रेकर नहीं है, वहाँ एक पैकेज,' poweRlaw', कि यह करता है: https://cran.r-project.org/web /packages/poweRlaw/index.html। – ulfelder

+0

बेवकूफ सवाल: मूल डेटा के साथ 'geom_point()' के अलावा 'geom_line()' करें और 'stat_function' का उपयोग न करें ...? – joran

+0

दो समस्याएं: आपको शून्य/नकारात्मक मानों से बचने के लिए अक्ष सीमा निर्धारित करने की आवश्यकता है। उदा।, 'Scale_x_log10 (सीमा = सी (1, 200)) + scale_y_log10 (सीमा = सी (1e-5, 1)) '। हालांकि, 'stat_function' अक्ष परिवर्तन के साथ मिलकर काम नहीं करता है: http://stackoverflow.com/questions/9382032/ggplot2-scale-x-log10-destroys-doesnt-apply-for-function-plotted-via-stat- मजेदार – Roland

उत्तर

6

एक जवाब में मेरी टिप्पणी लाना:

मुख्य समस्या stat_function में एक बग है। जब अक्ष रूपांतरणों के संयोजन के साथ प्रयोग किया जाता है तो यह मूल मूल्यों से परिवर्तित किए गए वाई-मानों की गणना करता है। यह हाल ही में fixed on github रहा है।

हालांकि, यह देखने में आसान नहीं है क्योंकि धुरी ब्रेक की गणना करते समय पहली त्रुटि होती है क्योंकि बग Inf, शून्य और/या नकारात्मक वाई-मान उत्पन्न करता है।आप देखने के लिए कि वास्तविक समस्या stat_function है स्पष्ट अक्ष सीमा निर्धारित करने की जरूरत है:

p + stat_function(fun = pwr) + 
    scale_x_log10() + scale_y_log10(limits = c(1e-5, 1)) 
#Warning message: 
#Removed 100 rows containing missing values (geom_path). 

resulting plot

यह और भी अधिक स्पष्ट अगर आप केवल x अक्ष को बदलने के लिए:

p + stat_function(fun = pwr) + 
    scale_x_log10() 

resulting plot

यदि आप github से ggplot2 संस्करण का उपयोग नहीं कर सकते हैं तो आप इसका उपयोग कर सकते हैं:

p + geom_line(data = data.frame(x = seq(min(dat$x), max(dat$x), length.out = 100)), 
       aes(y = pwr(x))) + 
    scale_x_log10() + scale_y_log10() 

resulting plot