[R] constructing a matrix for rgl plots

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Sat May 31 19:30:42 CEST 2025


The akima package has a somewhat problematic license (the ACM license, 
which doesn't allow commercial use).  The interp package provides some 
of the same functionality but is free open source.

rgl has some support for output from interp.  I forget if it would also 
work with akima.

Duncan

On 2025-05-31 12:28 p.m., Ben Bolker wrote:
>      I'll mention that the 'akima' package is also handy for this kind of
> interpolation.
> 
> On 5/31/25 11:18, Duncan Murdoch wrote:
>> 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
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide https://www.R-project.org/posting-
>> guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list