如何在R中的3D绘图中添加椭圆平面

时间:2014-06-13 15:39:53

标签: r

关于绘图平面的R代码z = x + y:

library("rgl")
f <- function(x,y) 
x+y

x_grid <- seq(0,1, length=20)
y_grid <- x_grid 
z_grid <- outer(x_grid, y_grid, f)
surface3d(x_grid, y_grid, z_grid,front="line",back="line")
axes3d() 

关于绘图椭圆的R代码5x ^ 2-4xy + 5y ^ 2 = 1:

my.fun <- function(x,y){5*x^2 - 4*x*y + 5*y^2}
x<-seq(-sqrt(5/21), sqrt(5/21), length.out = 101)
y<-seq(-sqrt(5/21), sqrt(5/21), length.out = 101)
z<-outer(x,y,my.fun)
contour(x, y, z, levels = 1, drawlabels = 0, xlab = "x", ylab = "y")

如何将椭圆平面添加到R中的3D绘图?谢谢!

1 个答案:

答案 0 :(得分:2)

仍然不确定你要做什么,但这会绘制你的飞机的交叉点

  

z = x + y

和你的抛物线椭球

  

z = 5x 2 -4xy + 5y 2

并在链接的图像中为生成的椭圆着色。

library(rgl)
f      <- function(x,y) x+y
my.fun <- function(x,y) 5*x^2 - 4*x*y + 5*y^2

x_grid <- seq(0,1, length=20)
z_grid <- outer(x_grid, x_grid, f)

theta <- seq(0,2*pi,length=1000)
r     <- sqrt(5/21)
df    <- expand.grid(x=r*cos(theta),y=r*cos(theta))
df$z  <- with(df,f(x,y) - my.fun(x,y))
xyz   <- df[df$z>=0,]
surface3d(x_grid, x_grid, z_grid, front="line",back="line")
axes3d() 
zlim    <- range(-1000*f(xyz$x,xyz$y))
zlen    <- diff(zlim) + 1
palette <- heat.colors(zlen)                       
col     <- palette[-1000*f(xyz$x,xyz$y)-zlim[1]+1 ]
with(xyz,points3d(x,y,f(x,y),color=col))

这使用快速而肮脏的方法来计算平面和椭球的交点:在(x,y)中创建一个相对精细的点网格,然后简单地识别f(x,y) - my.fun(x,y) < 0的所有点。这些点位于交叉点形成的椭圆内。然后只绘制这些点。

我认为,执行此操作的惯用方法是使用ploygon3d(...),但是当我尝试使用该函数时,该功能并未收敛...

编辑回应OP的评论。

因此,这将绘制抛物线椭球与地点z = 1的交点,并根据x的增加值(看起来像您提供的图像)对结果进行着色。我不知道这是什么意思......

library(rgl)
f      <- function(x,y) rep(1,length(x))
my.fun <- function(x,y) 5*x^2 - 4*x*y + 5*y^2

x_grid <- seq(0,1, length=20)
z_grid <- outer(x_grid, x_grid, f)

theta <- seq(0,2*pi,length=1000)
r     <- sqrt(5/21)
df    <- expand.grid(x=r*cos(theta),y=r*cos(theta))
df$z  <- with(df,f(x,y) - my.fun(x,y))
xyz   <- df[df$z>=0,]
surface3d(x_grid, x_grid, z_grid, front="line",back="line")
axes3d() 
zlim    <- range(-1000*xyz$x)
zlen    <- diff(zlim) + 1
palette <- heat.colors(zlen)               # height color lookup table
col     <- palette[-1000*xyz$x-zlim[1]+1 ] # assign colors to heights for each point
with(xyz,points3d(x,y,f(x,y),color=col))