2014-06-17 9 views
6

Ggplot2 ile contour (temel R) eşdeğerini nasıl çizebilirim?ggplot2 ile karar sınırları çizilsin mi?

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 hatlar ve çizdirirken bir matris kullanmak mümkün değildir: Aşağıda doğrusal ayırma fonksiyonu analizi ile bir örnektir. Matris, eriyik kullanılarak bir veri çerçevesine yeniden düzenlenebilir. Aşağıdaki veri çerçevesinde, iris.pr1'den gelen olasılık değerleri, aşağıdaki iki kolondaki x ve y koordinatları ile birlikte ilk sütunda görüntülenir. X ve y koordinatları 30 x 30 puanlık bir ızgara oluşturur.

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

I arka olasılıklar 0.5 (yani karar sınırları) olan koordinat (tercihen yumuşatılmış eğrisi ile bağlı) çizmek istiyoruz.

cevap

6

Benzer bir etki elde etmek için ggplot'ta geom_contour'u kullanabilirsiniz. Doğru şekilde varsaydığınız gibi, verilerinizi dönüştürmek zorundasınız. Sadece

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

yapıyor Ve sonra geom_contour bu data.frame geçmek ve sen

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)) 

ile 0,5 sonlarını istiyorum belirtmek ve bu

ggplot with probability contour boundaries

verir edebilir sona erdi
+0

Bir çizgi çizmek için bir kontur çizimine girmek zorundayız? Geom_line kullanmanın başka yolu yok mu? – user3236841

0

KlaR kitaplığındaki partimat işlevi, gözlenen yordayıcılar için istediğiniz şeyi yapar, ancak LDA projeksiyonları için aynı şeyi isterseniz, bir veri ağı oluşturabilirsiniz. LD1 ... LDk projeksiyonları ile orijinali büyütme, daha sonra grup ~ LD1 + ... + LDk, method = 'lda' formülüyle partimat'ı çağır - sonra görmeyi planladığınız "LD-düzlemini" görürsünüz, güzel bölümlenmiş senin için. Bu benim için daha kolay görünüyordu, en azından R'ye daha yeni öğrencilere açıklamak için, çünkü zaten amaçlanmamış bir şekilde zaten sunulan bir işlevi yeniden kullanıyorum.