【问题标题】:R: Filling enclosed areas in contourR:填充轮廓中的封闭区域
【发布时间】:2013-04-09 11:35:15
【问题描述】:

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

【问题讨论】:

    标签: r plot contour


    【解决方案1】:

    您可以使用contourLines 代替contour 来保留等高线边缘的坐标并使用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)
    

    【讨论】:

    • 谢谢!当我这样做时,情节中的小圆圈和小圆圈就消失了。我该如何保留它们?
    • 对不起,我忘记了一行:points(datax[,1], datax[,2],pch = datay+1)。您必须在多边形填充后绘制它们,否则它们会被它覆盖。
    • 谢谢!但是有一个问题:例如,如果您 set.seed(24) 并以上述方式绘制它,则即使它们不属于相应的类,也会以蓝色绘制区域。难道我不是必须以某种方式将 knn 的信息传递给绘图,以便它知道哪些区域要着色,哪些不可以?
    • 好吧,但现在当我执行 set.seed(10) 时也会出现同样的问题。我的意思是我已经设置了已经包含所有级别信息的网格矩阵 zM,有没有办法简单地说如果值等于蓝色背景,如果它为零,然后将其变为白色?
    • 是的,通过使用功能图像(见第二次编辑)。我之前没有提出它,因为我没有检查你在 zM 中的内容(而且因为我不知道函数 knn 我无法猜测),但既然你已经完成了所有这些工作,这显然是最简单的方法去这里.很抱歉没有早点看到。
    猜你喜欢
    • 2019-12-22
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多