用ggplot2绘制决策边界?

时间:2014-06-17 09:46:03

标签: r ggplot2

如何使用ggplot2绘制contour(基数R)的等效值?以下是线性判别函数分析的示例:

require(MASS)
iris.lda<-lda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data =    iris)
datPred<-data.frame(Species=predict(iris.lda)$class,predict(iris.lda)$x) #create data.frame

#Base R plot
eqscplot(datPred[,2],datPred[,3],pch=as.double(datPred[,1]),col=as.double(datPred[,1])+1) 

#Create decision boundaries
iris.lda2 <- lda(datPred[,2:3], datPred[,1])
x <- seq(min(datPred[,2]), max(datPred[,2]), length.out=30)
y <- seq(min(datPred[,3]), max(datPred[,3]), length.out=30)
Xcon <- matrix(c(rep(x,length(y)),
             rep(y, rep(length(x), length(y)))),,2) #Set all possible pairs of x and y  on a grid

iris.pr1 <- predict(iris.lda2, Xcon)$post[, c("setosa","versicolor")] %*% c(1,1)    #posterior probabilities of a point belonging to each class 
contour(x, y, matrix(iris.pr1, length(x), length(y)), 
    levels=0.5, add=T, lty=3,method="simple") #Plot contour lines in the base R plot
iris.pr2 <- predict(iris.lda2, Xcon)$post[, c("virginica","setosa")] %*% c(1,1)
contour(x, y, matrix(iris.pr2, length(x), length(y)), 
    levels=0.5, add=T, lty=3,method="simple") 

#Eqivalent plot with ggplot2 but without decision boundaries
ggplot(datPred, aes(x=LD1, y=LD2, col=Species) ) + 
geom_point(size = 3, aes(pch = Species))

使用ggplot绘制轮廓线时,无法使用矩阵。可以使用熔化将矩阵重新排列为数据帧。在下面的数据框中,iris.pr1的概率值与第二列中的x和y坐标一起显示在第一列中。 x和y坐标形成30 x 30点的网格。

df <- transform(melt(matrix(iris.pr1, length(x), length(y))), x=x[X1], y=y[X2])[,-c(1,2)]

我想绘制坐标(最好通过平滑曲线连接),后验概率为0.5(即决策边界)。

2 个答案:

答案 0 :(得分:7)

您可以在ggplot中使用geom_contour来实现类似的效果。正如您所假设的那样,您必须转换数据。我最后只是做了

pr<-data.frame(x=rep(x, length(y)), y=rep(y, each=length(x)), 
    z1=as.vector(iris.pr1), z2=as.vector(iris.pr2))

然后你可以将data.frame传递给geom_contour并指定你希望中断为0.5

ggplot(datPred, aes(x=LD1, y=LD2) ) + 
    geom_point(size = 3, aes(pch = Species,  col=Species)) + 
    geom_contour(data=pr, aes(x=x, y=y, z=z1), breaks=c(0,.5)) + 
    geom_contour(data=pr, aes(x=x, y=y, z=z2), breaks=c(0,.5))

,这给了

ggplot with probability contour boundaries

答案 1 :(得分:0)

klaR库中的partimat函数可以为观察到的预测变量做你想要的,但是如果你想要LDA投影的相同,你可以建立一个数据框,用LD1 ... LDk投影增加原始数据,然后调用partimat使用公式Group~LD1 + ... + LDk,method ='lda' - 然后你会看到你打算看到的“LD平面”,很好地为你分区。这对我来说似乎更容易,至少向R更新的学生解释,因为我只是重复使用已经提供的功能,而这种功能并不是很有意义。