2013-04-09 114 views
1

在R中使用繪圖繪製knn分類圖以繪製樣本和輪廓以繪製將平面分類的線。R:在輪廓中填充封閉區域

這裏是我的代碼:

k<-1 
datax<-rbind(matrix(rnorm(30,-1,5.25),15,2),matrix(rnorm(36,1,5.25),18,2)) 
datay<-rbind(matrix(1,15,1),matrix(0,18,1)) 
plot(datax[,1], datax[,2],pch = datay+1,axes=FALSE,ann=FALSE) 
box() 
n <- 1000 
xp <- seq(length=n, from = min(datax[,1]), to = max(datax[,1])) 
yp <- seq(length=n,from = min(datax[,2]) ,to = max(datax[,2])) 
gr <- expand.grid(xp, yp) 
library(class) 
z <- as.numeric(knn(datax, gr, datay,k))-1 
zM <- matrix(z, n, n, byrow = FALSE) 
contour(xp, yp, zM, xlab="x",ylab="",nlevels = 1 ,lwd=2, add=TRUE, drawlabels =FALSE) 

我的問題是:我怎樣才能顏色在劇情的封閉區域?我試過filled.contour,但沒有添加參數。我只想要分類器= 0的區域爲白色,並且其分類爲藍色的區域爲1。我應該怎麼做? 感謝

回答

2

相反的contour,您可以使用contourLines保持輪廓線的邊緣的座標,並與polygon繪製出來。

plot(datax[,1], datax[,2],axes=FALSE,ann=FALSE, type="n") 
box() 
cL <- contourLines(xp, yp, zM,nlevels = 1) 
lapply(cL,function(x)polygon(x$x,x$y,col="red")) 
points(datax[,1], datax[,2],pch = datay+1) 

但是它並不完美與達到情節的邊緣輪廓線(見第二個圖的左下角),所以它需要一些手工製作的調整:
enter image description here

編輯:在嵌套的輪廓線,我不認爲有一個簡單的方法來對付它,但這裏的情況是單向的:

library(splancs) 
ord <- sapply(lapply(cL,function(x)datay[inout(datax,cbind(x$x,x$y))]), 
       median) #Check what values are present in the polygon and 
         #take the most common one 
plot(datax[,1], datax[,2],axes=FALSE,ann=FALSE, type="n") 
box() 
lapply(cL[ord==1],function(x)polygon(x$x,x$y,col="blue")) 
lapply(cL[ord==0],function(x)polygon(x$x,x$y,col="white")) 
points(datax[,1], datax[,2],pch = datay+1) 

enter image description here

2日編輯:當然還有也是在你的情況使用功能image的可能性:

image(xp, yp, zM, col=c("transparent","blue")) 
points(datax[,1], datax[,2],pch = datay+1) 

enter image description here

+0

謝謝!當我這樣做的時候,小圈子和小混蛋們都走了。我如何保留它們? – user2058490 2013-04-09 12:07:29

+0

對不起,我忘了一行:'points(datax [,1],datax [,2],pch = datay + 1)'。你必須在多邊形填充後繪製它們,否則它們會被它覆蓋。 – plannapus 2013-04-09 12:10:08

+0

謝謝!然而存在一個問題:例如,如果你設置了.seed(24)並且按照上面的方式繪製,那麼以藍色繪製的區域儘管它們不屬於相應的類別。難道我不知道怎麼把knn的信息傳遞給情節,所以它知道哪些區域需要着色,哪些區域不着色? – user2058490 2013-04-09 12:38:56