[R] can I draw 3D plot like this using R?
Duncan Murdoch
murdoch at stats.uwo.ca
Sat Mar 14 22:49:49 CET 2009
On 12/03/2009 6:51 AM, Duncan Murdoch wrote:
> On 11/03/2009 11:35 PM, Oliver wrote:
>> hi, all
>>
>> I am looking at R package RGL to draw a colored mesh/surface plot like
>> this one (from matlab).
>> http://www.mathworks.com/access/helpdesk/help/techdoc/visualize/cbar.gif
>>
>> The key features I am looking for is surfaced with grid and color, but
>> not the terrain-like gradient. but I didn't come even close to it
>> after browsing through rgl help file.
>
> It is a little tricky to draw both lines and solid colours on a surface
> in rgl, because one will hide the other: there's no way to turn off the
> hidden object removal in rgl.
>
> The easiest way to do it would be to draw the grid slightly above the
> surface. For example,
>
> x <- seq(-2, 2, len=17)
> y <- seq(-2, 2, len=17)
> z <- outer(x,y, function(x,y) exp(-y^2)*sin(1.5*x))
> color <- rainbow(41)[1+round(10*outer(x,y, function(x,y) x^2 + y^2))]
>
> persp3d(x,y,z, color=color, smooth=FALSE)
> surface3d(x,y,z+0.001, front="lines", back="culled")
>
> (Fiddle with the 0.001 value if the grid disappears behind the surface,
> or floats too high above it.)
>
> Another way would be to draw the grid (and maybe the colour) as a texture.
I just did that, and it does look better. The texture was a simple
100x100 PNG image grid.png that was white with a black border 1 pixel
wide. (Fiddle with the dimensions and border width for different weight
of grid lines.) Then for 4 grid lines per unit of x and y (the same as
the colour grid), do this:
# First, repeat the lines above:
x <- seq(-2, 2, len=17)
y <- seq(-2, 2, len=17)
z <- outer(x,y, function(x,y) exp(-y^2)*sin(1.5*x))
color <- rainbow(41)[1+round(10*outer(x,y, function(x,y) x^2 + y^2))]
# Create texture coordinates
s <- outer(x, y, function(x, y) 4*x)
t <- outer(x, y, function(x, y) 4*y)
# Draw with a texture
persp3d(x,y,z, color=color, texture_s=s, texture_t=t,texture="grid.png",
smooth=FALSE)
This doesn't look good when it's small (the grid lines tend to disappear
when reduced), but looks fine in large sizes. Use fatter borders or a
smaller texture if you want it to look good when small.
Duncan Murdoch
More information about the R-help
mailing list