在 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")
最初我从 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")