2013-04-08 19 views
13

Tôi đang xây dựng một gói R để hiển thị các ô Weibull (sử dụng graphics::plot) trong R. Cốt truyện có một bản ghi được chuyển đổi x -axis và một số được chuyển đổi y -axis (vì thiếu mô tả tốt hơn). Do đó, phân phối Weibull hai tham số có thể được biểu diễn như một đường thẳng trên cốt truyện này.Làm thế nào để quy mô/chuyển đổi đồ họa :: âm mưu() trục với bất kỳ chuyển đổi, không chỉ logarit (cho lô Weibull)?

Sự biến đổi logarit của x trục là đơn giản như thêm tham số log="x"-plot() hoặc curve(). Làm cách nào để tôi có thể cung cấp sự chuyển đổi một lần một cách thanh lịch cho y -axis, để tất cả âm mưu liên quan đến đồ họa sẽ hoạt động trên cốt truyện được chuyển đổi trục của tôi? Để chứng minh những gì tôi cần, chạy các mã ví dụ sau:

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

Đầu tiên một ví dụ về phân phối Weibull với beta=2eta=1000 trên thường xuyên, cốt truyện untransformed:

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

plot1

Cốt truyện này vô dụng đối với phân tích Weibull. Đây là giải pháp hiện đang được triển khai của tôi để chuyển đổi dữ liệu có chức năng F0inv() và sửa đổi y -axis của cốt truyện. Lưu ý rằng tôi phải sử dụng F0inv() trên tất cả y -axi dữ liệu có liên quan.

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

này hoạt động, nhưng đây không phải là rất dễ sử dụng: khi người dùng muốn thêm chú thích, người ta luôn phải sử dụng F0inv():

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

tôi thấy rằng bạn có thể đạt được giải pháp cho vấn đề của tôi bằng cách sử dụng ggplot2 và tỷ lệ, nhưng tôi không muốn thay đổi thành gói đồ họa trừ khi ab cần thiết vì rất nhiều mã khác cần được viết lại.

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

Tôi nghĩ rằng nếu tôi tự động có thể thay thế mã để áp dụng việc chuyển đổi logarit với riêng tôi, vấn đề của tôi sẽ được giải quyết.

Tôi đã cố gắng tìm thêm thông tin bằng cách Googling "chuyển đổi trục R", "R tọa độ người dùng", "chia tỷ lệ trục R" mà không có kết quả hữu ích. Hầu như tất cả mọi thứ tôi đã tìm thấy xử lý với quy mô logarit.

Tôi cố gắng xem xét plot() cách tham số log="x" hoạt động, nhưng mã có liên quan cho plot.window được viết bằng C - không phải là điểm mạnh nhất của tôi.

+4

Tôi sẽ quan tâm nếu ai đó đi lên với một giải pháp tốt hơn, nhưng tôi nghĩ bạn đã đề cập đến nền tảng liên quan; Tôi không nghĩ rằng bạn sẽ làm tốt hơn thế này - bên ngoài 'ggplot2' Tôi không biết bất kỳ hệ thống nào để biến đổi trục chung. –

+0

Cảm ơn bạn đã dành thời gian trả lời. Trong thời gian đó, tôi đã đi đến cùng một kết luận, có vẻ như tôi sẽ bị buộc phải sử dụng ggplot2. – user2257135

Trả lời

1

Trong khi nó không xuất hiện để có thể trong đồ họa cơ bản, bạn có thể thực hiện chức năng này làm những gì bạn muốn để bạn có thể gọi nó là đơn giản hơn:

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) 
Các vấn đề liên quan