在 R 中绘制两个 ecdf 进行比较时,如何将轴缩放到更大的向量?

How do I scales the axes to the larger vector when plotting two ecdfs for comparison in R?

最初我从 2 个向量(我的数据的子集)开始。我 运行 ecdf 在两者上,将它们绘制在同一个图中以便于比较。所有这些都很好,但我需要知道的是如何使该函数对任何一对向量都通用,这样我只需输入向量,该函数就会起作用。就像我第二次调用较大的矢量一样,我希望绘图的轴自动缩放为较大的矢量,而不管调用的顺序如何,这样就不会丢失数据。

为了以防万一,我已经包含了一个使用虹膜数据的设置。

data=iris

virg<-subset(iris, iris$Species=="virginica"); virg
virg_pl<-virg$Petal.Length; virg_pl

versi<-subset(iris, iris$Species=="versicolor"); versi
versi_pl<-versi$Petal.Length; versi_pl

这是我拥有的:

twoecdfsoner<-function(x,y,z){
       ecdf1<-ecdf(x)
       ecdf2<-ecdf(y)
    plot(ecdf1,xlab=head(z,n=1),
        ylab="cumulative relative frequency",
        lty=1,pch=".",
        main="",
        do.point=FALSE,
        verticals=TRUE,xlim=c(min (y),max (x)))

    plot(ecdf2,verticals=TRUE, 
        do.points=FALSE,
        lty=3,pch=".", 
        add=TRUE, xlim=c(min (y),max (x)))

    legend("right","center",
    legend=c(deparse(substitute(x)),
        deparse(substitute(y))),
        lty=c(1,3),cex=0.8)
    }
    twoecdfsoner(virg_pl,versi_pl,"inches")

我好像可以写一个条件语句,但我得到这个错误:

Warning messages:
1: In x > y :
  longer object length is not a multiple of shorter object length
2: In x > y :
  longer object length is not a multiple of shorter object length
3: In x > y :
  longer object length is not a multiple of shorter object length

到目前为止我已经试过了

xlim=c(min (y),max (x)))
xlim=range(c(x),c(y)
xlim=pmax(x,y)

和编写条件语句

我还想用实线来编码那个更大的矢量。如果有人有任何建议,将不胜感激。

@42- 仔细阅读后我想我可以做一个条件语句,这似乎也有效。对 运行 以这种方式编写代码有任何批评吗?

twoecdfsoner<-function(x,y,z){
ecdf_1 <- plot(ecdf(x),
    verticals=TRUE,
    pch=".",
    main="",
    do.points=FALSE,
    lty=ifelse(max(x)>max(y), c(1), c(3)),
    xlab=head(z,n=1),
    ylab="Cumulative relative frequency", 
    xlim=range(x,y))

ecdf_2 <- lines(ecdf(y), 
    verticals=TRUE, 
    do.points=FALSE,
    lty=ifelse(max(y)>max(x), c(1), c(3)), 
    pch=".")

legend_text<-
if (max(x)>max(y)){
    legend=c(deparse(substitute(x)), deparse(substitute(y)))
} else {max(y)>max(x)
    legend=c(deparse(substitute(y)), deparse(substitute(x)))
}


legend("right",
    legend=legend_text,
    lty=c(1,3))
}

twoecdfsoner(virg_pl,versi_pl,"inches")

ecdf 有问题...它隐藏了环境中的 "x" 参数。新手则找不到它们。

> ecdf(versi$Petal.Length)
Empirical CDF 
Call: ecdf(versi$Petal.Length)
 x[1:19] =      3,    3.3,    3.5,  ...,      5,    5.1
> str(ecdf(versi$Petal.Length))
function (v)  
 - attr(*, "class")= chr [1:3] "ecdf" "stepfun" "function"
 - attr(*, "call")= language ecdf(versi$Petal.Length)

此时 运行 帮助页面中的所有示例都具有指导意义:

?ecdf   # and probably also look at ?stepfun

请注意,结果是 function,因此尝试不带参数导出 min and/or max 总是会失败。一旦找到如何访问 ecdf 的环境(见下文),那么您可能需要两个向量的连接值的最小值,而不是假设一个具有最小值而另一个具有最大值。以下是 ecdf 函数的环境:

ls( environment(ecdf(versi_pl)) )
[1] "f"      "method" "nobs"   "x"      "y"      "yleft"  "yright"

 twoecdfsoner<-function(x,y,z){
       ecdf1<-ecdf(x);
       x1 <- environment(ecdf1)$x
       ecdf2<-ecdf(y); 
       x2 <- environment(ecdf2)$x
    plot(ecdf1,xlab=head(z,n=1),
        ylab="cumulative relative frequency",
        lty=1,pch=".",
        main="",
        do.point=FALSE,
        verticals=TRUE,xlim=c( min ( c(x1,x2) ),max ( c(x1,x2)) ) )

    plot(ecdf2,verticals=TRUE, 
        do.points=FALSE,
        lty=3,pch=".", 
        add=TRUE, xlim=c( min ( c(x1,x2) ), max ( c(x1,x2) )) ) 

    legend("right","center",
    legend=c(deparse(substitute(x)),
        deparse(substitute(y))),
        lty=c(1,3),cex=0.8)
    }
    twoecdfsoner(versi_pl, virg_pl,"inches")