1

我在 R 中绘制了一个 knn 分类图,使用 plot 来绘制样本和轮廓以绘制对平面进行分类的线。

这是我的代码:

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 的蓝色区域。我该怎么做?谢谢

4

1 回答 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)

然而,到达绘图边缘的等高线并不完美(参见第二个绘图的左下角),因此需要一些手工调整:
在此处输入图像描述

编辑:在嵌套轮廓线的情况下,我认为没有一种简单的方法来处理它,但这是一种方法:

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)

在此处输入图像描述

第二次编辑:当然也有可能image在你的情况下使用函数:

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

在此处输入图像描述

于 2013-04-09T12:00:15.647 回答