2017-10-07 63 views
2

最初我從2個向量開始(我的數據的子集)。我在兩者上運行ecdf,將它們繪製在同一個圖中以便於比較。所有這些都很好,但我需要知道的是如何使這個函數對於任何一對向量都能夠普遍使用,所以我只需輸入向量就可以工作。就像我要第二次調用較大的矢量一樣,我希望繪圖的座標軸自動縮放較大的矢量,無論調用順序如何,都不會丟失數據。在R中繪製兩個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) 

and writing condit離線陳述

我還想要實線爲該較大的矢量編碼。如果有人有任何建議,將不勝感激。

@ 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") 
+0

當我運行代碼時,我得不到任何錯誤。 – G5W

+0

@ G5W:嘗試顛倒前兩個參數。 –

+0

@ 42我明白了。沒有錯誤,但圖表縮小。得到它了。 – G5W

回答

1

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和/或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")