[R] constructing a matrix for rgl plots

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Sat May 31 17:18:17 CEST 2025


On 2025-05-31 7:04 a.m., ravi via R-help wrote:
> Hi,
> rgl plots seem to require the z object in the form of a matrix. I would like some help in constructing this matrix when I cannot use the outer function. Let me explain.
> library(rgl)
> library(plot3D)
> x <- 1:10
> y <- 1:20
> fun1 <- function (x,y) {x^2+y^2}
> z <- outer(x,y, fun1)
> open3d()
> surface3d(x,y,z,col="red",theta=50, phi=20)
> 
> This works fine. However, when I have a data frame of x, y and z with z as a vector, how do I proceed?
> z <- x^2+y^2
>> surface3d(x,y,z,col="red",theta=50, phi=20)
> 
> Error in surface3d(x, y, z, col = "red", theta = 50, phi = 20) :
>    At least one coordinate must be a matrix
> 
> How do I get z in the form of a matrix?

 From a private message, it appears you have a scattering of x and y 
values, and each has a z.  You'd like a plot of the surface z(x, y).

It won't work with your sample data because x and y have different 
lengths, but you can do something like this to triangulate your data and 
do linear interpolation within each triangle:

    x <- runif(100, 0, 10)   # 100 random points from 0 to 10
    y <- runif(100, 0, 20)   # 100 random points from 0 to 20
    z <- x^2 + y^2           # z as a function of x and y

    library(deldir)  # need this to triangulate the x, y values
    dxyz <- deldir(x, y, z = z)

    library(rgl)
    plot3d(dxyz, col = "red")


Use plot3d(dxyz, col = "red", front = "lines") to see the triangulation 
more clearly.

Duncan Murdoch



More information about the R-help mailing list