2016-12-01 1 views
2

Используя R, я хотел построить некоторые точки данных и кривую над ними (что является границей принятия решений, обученной нейронной сети). Сначала я сделал это с обычными функциями графика, но теперь я хочу, чтобы он выглядел более причудливым, используя ggplot2.R ggplot2: как мне построить неявную функцию (контурная линия только на одном уровне)?

Это то, что она выглядит без ggplot (обратите внимание на кривую особенно, точки не слишком актуальны):

Image

Plotting точки с ggplot не является проблемой, но теперь я хочу добавить кривая а, которая описывается следующей функцией:

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 

это просто функция с двумя переменными приравнены к нулю, как и 3x-2y = 0, например. Как вы можете видеть, это сложно переписать в форме ay = ..., поэтому я хотел бы построить уравнение, используя график контура на уровне = 0. Он работал с использованием curve3d поверх моего диаграммы рассеяния:

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) 

Теперь я действительно хочу использовать ggplot2 для достижения того же результата. Я пробовал графики stat_contour, но они, похоже, не выполняют функции и не позволят выбрать только один уровень. Таким образом:

  1. Есть ли способ построить функцию в форме уравнения (например, ax + by = 0, но, вероятно, более сложную), используя ggplot?
  2. Могу ли я добавить такую ​​графическую кривую в свою геометрию ggplot с точками datapoints?

EDIT: вот пример кода воссоздании мои данные:

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

Так что с этими данными, я хотел бы построить график функции 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 (или любой другой неявной функции, как 5x+2y=0 без переписать его).

+0

Это поможет вам, если вы предоставите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с образцом входные значения. Определите все переменные, чтобы мы могли попытаться воссоздать график для проверки возможных решений. – MrFlick

+0

Насколько я понимаю, я просто добавил пример кода. – sds

ответ

1

tl; dr Единственное, что вам действительно не хватало, было breaks=0. Базовый сюжет:

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

Генерация данных для контура (без рисования ничего):

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

реорганизовать данные в кадре данных:

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

Ничья с breaks=0

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

enter image description here

Смежные вопросы