2013-04-08 3 views
13

मैं साजिश आर में (graphics::plot का प्रयोग करके) वेइबुल भूखंडों प्रदर्शित करने के लिए एक अनुसंधान पैकेज का निर्माण कर रहा हूँ एक लॉग-बदल एक्स धुरी और एक वेइबुल-बदल y धुरी (एक बेहतर वर्णन की कमी के लिए) है। दो-पैरामीटर वेबुल वितरण को इस साजिश पर सीधी रेखा के रूप में दर्शाया जा सकता है।ग्राफिक्स :: प्लॉट() अक्ष को किसी भी परिवर्तन के साथ स्केल/ट्रांसफॉर्म कैसे करें, न केवल लॉगरिदमिक (वेबुल प्लॉट्स के लिए)?

एक्स धुरी के लघुगणक परिवर्तन plot() या curve() करने के लिए log="x" पैरामीटर जोड़ने के रूप में सरल है। मैं वाई -axis परिवर्तन को एक सुरुचिपूर्ण तरीके से कैसे आपूर्ति कर सकता हूं, ताकि सभी ग्राफिक्स से संबंधित साजिश मेरे अक्ष-रूपांतरित प्लॉट पर काम करेगी? प्रदर्शित करने के लिए मैं क्या जरूरत है, निम्न उदाहरण कोड चलाएँ:

## initialisation ## 
beta  <- 2;eta <- 1000 
ticks <- c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01)) 
F0inv <- function (p) log(qweibull(p, 1, 1)) 
    # this is the transformation function 
F0  <- function (q) exp(-exp(q)) 
    # this is the inverse of the transformation function 
weibull <- function(x)pweibull(x,beta,eta) 
    # the curve of this function represents the weibull distribution 
    # as a straight line on weibull paper 
weibull2 <- function(x)F0inv(weibull(x)) 

पहले एक नियमित रूप से, untransformed भूखंड पर beta=2 और eta=1000 के साथ एक वेइबुल बंटन का एक उदाहरण:

## untransformed axes ## 
curve(weibull ,xlim=c(100,1e4),ylim=c(0.01,0.99)) 
abline(h=ticks,col="lightgray") 

plot1

यह प्लॉट वेबुल विश्लेषण के लिए बेकार है। यहां मेरा वर्तमान कार्यान्वित समाधान है जो डेटा F0inv() के साथ डेटा को बदलता है और साजिश के वाई-संशोधित करता है। ध्यान दें कि मुझे का उपयोग सभी y -axis संबंधित डेटा पर करना है।

## transformed axis with F0inv() ## 
curve(weibull2,xlim=c(100,1e4),ylim=F0inv(c(0.01,0.99)),log="x",axes=F) 
axis(1);axis(2,at=F0inv(ticks),labels=ticks) 
abline(h=F0inv(ticks),col="lightgray") 

plot2

यह काम करता है, लेकिन यह बहुत उपयोगकर्ता के अनुकूल नहीं है: जब उपयोगकर्ता टिप्पणियां जोड़ने के लिए चाहता है, एक हमेशा का उपयोग करना चाहिए F0inv():

text(300,F0inv(0.4),"at 40%") 

मैं पाया कि आप ggplot2 और स्केल का उपयोग करके मेरी समस्या का समाधान प्राप्त कर सकते हैं, लेकिन मैं अब तक ग्राफिक्स पैकेज में बदलना नहीं चाहता बहुत जरूरी है क्योंकि बहुत से अन्य कोड को फिर से लिखना होगा।

## with ggplot2 and scales ## 
library(ggplot2) 
library(scales) 
weibull_trans <- function()trans_new("weibull", F0inv, F0) 
qplot(c(100,1e4),xlim=c(100,1e4),ylim=c(0.01,0.99), 
    stat="function",geom="line",fun=weibull) + 
    coord_trans(x="log10",y = "weibull") 

plot3

मुझे लगता है कि अगर मैं गतिशील मेरे अपने साथ लघुगणक परिवर्तन लागू करने के लिए कोड की जगह सकता है, मेरी समस्या हल की जाएगी।

मैंने उपयोगी परिणामों के बिना "आर अक्ष रूपांतरण", "आर उपयोगकर्ता समन्वय", "आर अक्ष स्केलिंग" द्वारा अधिक जानकारी प्राप्त करने का प्रयास किया। लगभग हर चीज जो मैंने पाया है लॉगरिदमिक स्केल के साथ निपटाया।

मैंने plot() को log="x" पैरामीटर कैसे काम करता है, इस पर ध्यान देने की कोशिश की, लेकिन plot.window के लिए प्रासंगिक कोड सी में लिखा गया है - मेरा सबसे मजबूत बिंदु बिल्कुल नहीं।

+4

मैं दिलचस्पी होगी अगर किसी के साथ आता है एक बेहतर समाधान, लेकिन मुझे लगता है कि आपने प्रासंगिक जमीन को कवर किया है; मुझे नहीं लगता कि आप इससे बेहतर करने जा रहे हैं - 'ggplot2' के बाहर मैं सामान्य अक्ष परिवर्तन के लिए किसी भी सिस्टम के बारे में नहीं जानता। –

+0

जवाब देने के लिए समय निकालने के लिए धन्यवाद। इस बीच, मैं एक ही निष्कर्ष पर आया, ऐसा लगता है कि मुझे ggplot2 का उपयोग करने के लिए मजबूर किया जाएगा। – user2257135

उत्तर

1

हालांकि यह आधार ग्राफिक्स में संभव हो सकता है प्रकट नहीं होता है, तो आप इस समारोह क्या आप इतना है कि आप इसे अधिक सरलता कॉल कर सकते हैं करना चाहते हैं कर सकते हैं:

F0inv <- function (p) log(qweibull(p, 1, 1)) 
## this is the transformation function 
F0  <- function (q) exp(-exp(q)) 

weibullplot <- function(eta, beta, 
         ticks=c(seq(0.01,0.09,0.01),(1:9)/10,seq(0.91,0.99,0.01)), 
         ...) { 
    ## the curve of this function represents the weibull distribution 
    ## as a straight line on weibull paper 
    weibull2 <- function(x) 
    F0inv(pweibull(x, beta, eta)) 
    curve(weibull2, xlim=c(100, 1e4), ylim=F0inv(c(0.01, 0.99)), log="x", axes=FALSE) 
    axis(1); 
    axis(2, at=F0inv(ticks), labels=ticks) 
    abline(h=F0inv(ticks),col="lightgray") 
} 

weibullplot(eta=1000, beta=2) 
संबंधित मुद्दे