如何使用任何变换来缩放/变换graphics :: plot()轴,而不仅仅是对数(对于Weibull图)?

时间:2013-04-08 12:29:38

标签: r plot ggplot2 weibull

我正在构建一个R包以在R中显示Weibull图(使用graphics::plot)。该图具有对数转换的 x -axis和Weibull转换的 y -axis(缺乏更好的描述)。因此,双参数威布尔分布可以在该图上表示为直线。

x -axis的对数转换就像将log="x"参数添加到plot()curve()一样简单。如何以优雅的方式提供 y -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))

首先是一个Weibull分布的例子,beta=2eta=1000在一个常规的,未转换的图上:

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

plot1

这个图对Weibull分析没用。这是我目前实现的解决方案,它使用函数F0inv()转换数据并修改绘图的 y -axis。请注意,我必须在所有 y -axis相关数据上使用F0inv()

## 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和缩放来解决我的问题,但我不想更改为图形包,除非绝对必要,因为很多其他代码需要重写。< / p>

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

我认为如果我能用我自己的代码动态替换代码转换代码,我的问题就会解决。

我试图通过谷歌搜索“R轴转换”,“R用户坐标”,“R轴缩放”找到更多信息而没有有用的结果。我发现的几乎所有东西都处理对数刻度。

我尝试查看plot() log="x"参数如何工作,但plot.window的相关代码是用C语言编写的 - 而不是我最强的一点。

1 个答案:

答案 0 :(得分: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)