2016-12-01 2 views
2

Mit R wollte ich einige Datenpunkte und eine Kurve über sie (das ist die Entscheidungsgrenze mit neuronalen Netzwerk trainiert). Zuerst habe ich es mit den normalen Plot-Funktionen gemacht, aber jetzt will ich, dass es mit Hilfe von ggplot2 etwas schicker aussieht.R ggplot2: Wie zeichne ich eine implizite Funktion (Konturlinie auf nur einer Ebene)?

Dies ist, was es ohne ggplot (besonders beachten Sie die Kurve, die Punkte sind nicht allzu relevant) wie folgt aussieht:

Image

die Punkte mit ggplot Plotten ist kein Problem, aber jetzt will ich hinzufügen wie auch die Kurve, die durch die folgende Funktion beschrieben:

1.91*(1/(1+exp(-(23.50+12.64*x-24.54*y))))-1.95*(1/(1+exp(-(73.51-12.36*x-10.01*y)))) + 0.98 = 0 

Dies ist eine gerade Funktion mit zwei Variablen gleich Null gesetzt, wie 3X-2y = 0 zum Beispiel. Wie Sie sehen können, ist es schwierig, diese in ay = ... umzuschreiben, deshalb möchte ich die Gleichung mit einem Konturdiagramm bei Level = 0 darstellen. Es funktionierte mit curve3d über meinem Streudiagramm:

curve3d(1.91*(1/(1+exp(-(23.50+12.64*x-24.54*y))))-1.95*(1/(1+exp(-(73.51-12.36*x-10.01*y)))) + 0.98 = 0, sys3d="contour",levels=0, add=TRUE) 

Jetzt möchte ich wirklich ggplot2 verwenden, um das gleiche Ergebnis zu erzielen. Ich habe versucht, die stat_contour Plots, aber sie scheinen keine Funktionen zu übernehmen und wird nicht erlauben, nur eine Ebene zu wählen. Also:

  1. Gibt es eine Möglichkeit, eine Funktion in Form einer Gleichung zu plotten (wie ax + by = 0, aber wahrscheinlich komplexere) Form mit ggplot?
  2. Kann ich eine solche geplottete Kurve zu meinem geom_point ggplot mit Datenpunkten hinzufügen?

EDIT: hier ist ein Codebeispiel meine Daten neu zu erstellen:

# data 
x1 <- rnorm(200, 3, .28) 
y1 <- rnorm(200, 3, .28) 
x2 <- rnorm(100, 3.45, .15) 
y2 <- rnorm(100, 3.35, .15) 
x3 <- rnorm(100, 3.3, .15) 
y3 <- rnorm(100, 2.4, .15) 

groups <- c(rep("H",200), rep("A",100), rep("B",100)) 
data <- data.frame(x = c(x1,x2,x3), y = c(y1,y2,y3), group = groups) 

# the working ggplot 
windows() 
ggplot(data, aes(x=x,y=y)) + xlim(2,4) + ylim(2,4) + geom_point(aes(color = group)) + scale_shape_manual(values=c(1,16)) 

# the old plot that I would like to plot with ggplot over the previous one with as well (doesn't work) 
curve3d(1.91*(1/(1+exp(-(23.50+12.64*x-24.54*y))))-1.95*(1/(1+exp(-(73.51-12.36*x-10.01*y)))) + 0.98, xlim=c(2,4), ylim=c(2,4), sys3d="contour",levels=0, add=TRUE) 

Also mit diesen Daten würde ich 1.91*(1/(1+exp(-(23.50+12.64*x-24.54*y))))-1.95*(1/(1+exp(-(73.51-12.36*x-10.01*y)))) + 0.98 = 0 die Funktion zeichnen möchten (oder jede andere implizite Funktion, wie 5x+2y=0 ohne umschreiben).

+0

Es ist einfacher, Ihnen zu helfen, wenn Sie ein Beispiel liefern (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) Eingabewerte. Definieren Sie alle Variablen, damit wir versuchen können, das Diagramm neu zu erstellen, um mögliche Lösungen zu testen. – MrFlick

+0

Ich verstehe, ich habe gerade ein Codebeispiel hinzugefügt. – sds

Antwort

1

tl; dr Das einzige, was Sie wirklich vermisst haben, war breaks=0. Grundstück:

g0 <- ggplot(data, aes(x=x,y=y)) + xlim(2,4) + ylim(2,4) + 
    geom_point(aes(color = group)) + scale_shape_manual(values=c(1,16)) 

für Kontur Daten generieren (ohne etwas zu zeichnen):

cc <- emdbook::curve3d(1.91*(1/(1+exp(-(23.50+12.64*x-24.54*y))))- 
       1.95*(1/(1+exp(-(73.51-12.36*x-10.01*y)))) + 0.98, 
       xlim=c(2,4), ylim=c(2,4), sys3d="none") 

reorganisieren Daten in einem Datenrahmen:

dimnames(cc$z) <- list(cc$x,cc$y) 
mm <- reshape2::melt(cc$z) 

Draw mit breaks=0

g0 + geom_contour(data=mm, 
        aes(x=Var1,y=Var2,z=value),breaks=0, 
        colour="black") 

enter image description here

Verwandte Themen