2013-04-08 22 views
13

Ich baue ein R-Paket Weibull Plots angezeigt werden (unter Verwendung von graphics::plot) in R. Das Grundstück hat ein logtransformierten x -Achse und a-Weibull umgewandelt y -Achse (mangels einer besseren Beschreibung). Die Zwei-Parameter-Weibull-Verteilung kann somit als eine gerade Linie auf diesem Diagramm dargestellt werden.Wie skaliert/transformiere ich Graphics :: Plot() Achsen mit irgendeiner Transformation, nicht nur logarithmisch (für Weibull-Plots)?

Die logarithmische Transformation der x -Achse ist so einfach wie die log="x" Parameter plot() oder curve() Zugabe. Wie kann ich die y -Achs-Transformation in einer eleganten Art und Weise liefern, so dass alle graphischen Darstellungen auf meiner Achse-transformierten Handlung funktionieren? Um zu zeigen, was ich brauche, führen Sie den folgenden Beispielcode:

## 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)) 

Zunächst ein Beispiel für eine Weibull-Verteilung mit beta=2 und eta=1000 auf einer regelmäßigen, nicht transformierte Grundstück:

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

plot1

Dieses Diagramm ist nutzlos für Weibull-Analyse. Hier ist meine derzeit implementierte Lösung, die die Daten mit der Funktion F0inv() transformiert und die y -Achse des Diagramms ändert. Beachten Sie, dass ich F0inv() für alle y -Achse Daten verwenden muss.

## 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

Dies funktioniert, aber das ist nicht sehr benutzerfreundlich: wenn der Benutzer Anmerkungen hinzufügen möchte, muss man immer F0inv() verwenden:

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

I festgestellt, dass Sie eine Lösung für mein Problem mit ggplot2 und Skalen erreichen können, aber ich möchte nicht zu einem Grafikpaket, wenn ab Gelegentlich notwendig, da viel anderer Code neu geschrieben werden muss.

## 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

Ich glaube, wenn ich dynamisch den Code für die Anwendung der logarithmische Transformation mit meinem eigenen ersetzen könnte, würde mein Problem gelöst werden.

Ich habe versucht, weitere Informationen von Googling "R-Achse Transformation", "R Benutzer Koordinaten", "R-Achse Skalierung" ohne nützliche Ergebnisse zu finden. Fast alles, was ich gefunden habe, behandelt logarithmische Skalen.

ich versuchte, in plot() zu prüfen, wie die log="x" Parameter funktioniert, aber der entsprechende Code für plot.window ist in C geschrieben - nicht meine stärkste Seite überhaupt.

+4

ich daran interessiert sein wird, wenn jemand mit aufkommt eine bessere Lösung, aber ich denke, Sie haben den relevanten Grund abgedeckt; Ich glaube nicht, dass Sie es besser machen werden - außerhalb von 'ggplot2' kenne ich keine Systeme für die generische Achsentransformation. –

+0

Danke, dass Sie sich die Zeit genommen haben, zu antworten. In der Zwischenzeit kam ich zu dem gleichen Schluss, es sieht so aus, als ob ich gezwungen wäre, ggplot2 zu benutzen. – user2257135

Antwort

1

Es ist zwar nicht in der Basis Grafiken möglich zu sein scheint, können Sie diese Funktion machen, was Sie wollen, so dass Sie es einfach mehr anrufen:

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)