2011-01-19 9 views
3

私はcontour関数を使ってプロットしているKNNモデルを持っています。これは、(this Purdue examに基づいて)私がやっているものの種類の簡単な例です:ggplotのKNNモデルの輪郭?

library(class) 
library(nnet) 

TrainC<-read.table("http://miner.chem.purdue.edu/Exam1/TrainC.dat") 
names(TrainC)<-c("x1","x2","y") 

K=15 

p <- as.matrix(TrainC[, -3]) 
xp <- seq(min(TrainC$x1), max(TrainC$x1), length = 50); np <- length(xp) 
yp <- seq(min(TrainC$x2), max(TrainC$x2), length = 50) 
tp<-TrainC$y 

yhat <- knn(p, p, tp, k = K) 

plot(TrainC[, 1], TrainC[, 2], xlab = "x1", ylab = "x2", col=as.numeric(TrainC$y)+1) 
pt <- expand.grid(x1 = xp, x2 = yp) 
Z <- knn(p, pt, tp, k = K) 
zp<-class.ind(Z)[,1] - class.ind(Z)[,2] 

contour(xp, yp, matrix(zp, np), add = T, levels = 0, labex = 0) 

私の質問は:どのように私はggplotでこれと同じプロットを作ることができますか?特に、contourと同等の処理を行うにはどうすればよいですか?

+0

あなたのコードには "class.ind"という関数があるパッケージ名がありません。そのエラーを過ぎても、npがどこに定義されているのかわかりません。 –

+0

@DWin申し訳ありません... class.indは 'nnet'のものです。これが修正されます。 npは、xpが定義されている行(セミコロンの後)で定義されます。 – griffin

答えて

7
d <- transform(melt(matrix(zp, np)), xp=xp[X1], yp=yp[X2]) 
ggplot(d, aes(xp, yp, z=value)) + 
    geom_contour() + 
    geom_point(aes(x1, x2, colour=y, z=NULL), data=TrainC) 
3

あなたのコードの後に​​これを試してみてください。二つの別々のプロットをだ

library(ggplot2) 

p <- ggplot(TrainC, aes(x1, x2)) 
p + geom_point(aes(colour = as.numeric(y) + 1)) 

df <- data.frame(x = rep(xp, np), y = rep(yp, each = np), z = zp) 
p <- ggplot(df, aes(x, y, z = z)) 
p + stat_contour(bins = 1) 

を。それらを組み合わせる方法は分かりませんが、文書hereを掘り下げて始めてください。

+2

最初の画像を取り出し、 'p + stat_contour(data = df、aes(x、y、z = z)、bins = 1)'を追加するだけです。 – Shane