R ggplot2:如何绘制隐式函数(仅一个级别的等高线)?
R ggplot2: how do I plot an implicit function (contour line at just one level)?
我想使用 R 绘制一些数据点和一条曲线(这是用神经网络训练的决策边界)。首先我用普通的绘图函数来做,但现在我想让它看起来更花哨 ggplot2
.
这是没有 ggplot 的样子(特别注意曲线,点不太相关):
用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。正如您所看到的,这个很难以 y=... 形式重写,所以这就是为什么我想通过在 level = 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
图,但它们似乎没有功能,也不允许只选择一个级别。所以:
- 有什么方法可以使用
ggplot
绘制方程形式的函数(如 ax+by=0 但可能更复杂)?
- 我可以将这样绘制的曲线添加到带有数据点的 geom_point
ggplot
中吗?
编辑:这是一个重新创建我的数据的代码示例:
# 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
,而无需重写)。
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")
我想使用 R 绘制一些数据点和一条曲线(这是用神经网络训练的决策边界)。首先我用普通的绘图函数来做,但现在我想让它看起来更花哨 ggplot2
.
这是没有 ggplot 的样子(特别注意曲线,点不太相关):
用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。正如您所看到的,这个很难以 y=... 形式重写,所以这就是为什么我想通过在 level = 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
图,但它们似乎没有功能,也不允许只选择一个级别。所以:
- 有什么方法可以使用
ggplot
绘制方程形式的函数(如 ax+by=0 但可能更复杂)? - 我可以将这样绘制的曲线添加到带有数据点的 geom_point
ggplot
中吗?
编辑:这是一个重新创建我的数据的代码示例:
# 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
,而无需重写)。
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")