2013-04-08 12 views
13

Sto costruendo un pacchetto R per visualizzare trame Weibull (utilizzando graphics::plot) in R. La trama ha un log-trasformati x -axis e un Weibull-trasformato y -axis (per mancanza di una descrizione migliore). La distribuzione Weibull a due parametri può quindi essere rappresentata come una linea retta su questo grafico.Come ridimensionare/trasformare gli assi graphics :: plot() con qualsiasi trasformazione, non solo logaritmico (per i grafici di Weibull)?

La trasformazione logaritmica del x -axis è sufficiente aggiungere il parametro log="x" a plot() o curve(). Come posso fornire la trasformazione y -assieme in modo elegante, in modo che tutti i grafici relativi alla grafica funzionino sulla trama trasformata dall'asse? Per dimostrare che mi servono, eseguire il codice seguente esempio:

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

Prima un esempio di una distribuzione di Weibull con beta=2 e eta=1000 in modo regolare, la trama non trasformata:

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

plot1

Questa trama è inutile per l'analisi di Weibull. Ecco la mia soluzione attualmente implementata che trasforma i dati con la funzione F0inv() e modifica lo y - assi del grafico. Si noti che devo usare F0inv() su tutti i dati relativi a e.

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

Questo funziona, ma questo non è molto user-friendly: quando l'utente vuole aggiungere annotazioni, bisogna sempre usare F0inv():

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

I trovato che è possibile ottenere una soluzione al mio problema usando ggplot2 e scale, ma non voglio passare a un pacchetto di grafica a meno che ab assolutamente necessario poiché molti altri codici devono essere riscritti.

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

Penso che se potessi dinamicamente sostituire il codice per l'applicazione della trasformazione logaritmica con il mio, il mio problema sarebbe risolto.

Ho cercato di trovare ulteriori informazioni di googling "trasformazione dell'asse R", "coordinate utente R", "ridimensionamento dell'asse R" senza risultati utili. Quasi tutto ciò che ho trovato riguarda le scale logaritmiche.

Ho provato a esaminare plot() su come funziona il parametro log="x", ma il codice relativo per plot.window è scritto in C - non è il mio punto di forza.

+4

sarò interessato se qualcuno esce con una soluzione migliore, ma penso che tu abbia coperto il terreno pertinente; Non penso che farai meglio di così: al di fuori di 'ggplot2' non conosco alcun sistema per la trasformazione generica degli assi. –

+0

Grazie per aver dedicato del tempo per rispondere. Nel frattempo, sono giunto alla stessa conclusione, sembra che sarò costretto a usare ggplot2. – user2257135

risposta

1

Anche se non sembra essere possibile in grafica di base, è possibile rendere questa funzione fare quello che vuoi in modo che si può chiamare più semplicemente:

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) 
Problemi correlati