2014-06-17 9 views
6

मैं ggplot2 के साथ contour (बेस आर) के बराबर कैसे प्लॉट करूं?ggplot2 के साथ प्लॉट निर्णय सीमाएं?

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 निर्देशांक के साथ पहले कॉलम में प्रदर्शित किया गया है। एक्स और वाई निर्देशांक 30 x 30 अंक का ग्रिड बनाते हैं।

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

मैं निर्देशांक (अधिमानतः एक समतल वक्र से जुड़े हुए) जहां पीछे संभावनाओं 0.5 (अर्थात निर्णय सीमाओं) कर रहे हैं साजिश करना चाहते हैं।

उत्तर

6

आप इसी तरह के प्रभाव को प्राप्त करने के लिए 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)) 

कर और फिर आप geom_contour है कि data.frame गुजरती हैं और आप

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

साथ 0.5 पर टूट जाता है निर्दिष्ट और उस

ggplot with probability contour boundaries

देता कर सकते हैं
+0

एक रेखा खींचने के लिए, हमें एक समोच्च साजिश से गुजरना है? Geom_line का उपयोग करने का कोई और तरीका नहीं है? – user3236841

0

klaR लाइब्रेरी में पार्टिमाट फ़ंक्शन वह करता है जो आप अनुमानित भविष्यवाणियों के लिए चाहते हैं, लेकिन यदि आप एलडीए अनुमानों के लिए वही चाहते हैं, तो आप डेटा बना सकते हैं एलडी 1 एलडीके अनुमानों के साथ मूल को बढ़ा रहा है, फिर फार्मूला समूह ~ एलडी 1 + ... + एलडीके, विधि = 'एलडीए' के ​​साथ पार्टिमेट को कॉल करें - फिर आप "एलडी-प्लेन" देखते हैं जिसे आप देखना चाहते हैं, अच्छी तरह से विभाजित तुम्हारे लिए। यह मेरे लिए आसान लग रहा था, कम से कम छात्रों को आर के लिए समझाओ, क्योंकि मैं पहले से ही एक ऐसे तरीके से प्रदान किया गया एक फ़ंक्शन का पुन: उपयोग कर रहा हूं जिसमें यह काफी इरादा नहीं था।