Thanx for the help.  Other comments are posted inline below.

Joe

Duncan Murdoch wrote:
On 10/3/2006 11:31 AM, Joe Byers wrote:
thanks for the reply.

I wish I could create a self contained example of the problem, but I can't.

My task is displaying the surface generated from a simulation of Forward prices for a selected trajectory. The x axis is time from 9/25/06 to 3/31/2007 or 133X1 vector of integers. The z axis is the expiration month of the forwards as integers (1-36), the y axis is price. For each day(x) there are 36 prices (y). surface3d displays the surface but displays the z axis in reverse order and the x axis in reverse order as well. I can rotate the image 180 degrees but time on the x axis is running from right to left instead of left to right. My z axis is now in ascending order.

I have read the documentation for rgl and much of the supported documents on neosciences web site, but I can not understand how to generate the image with the displaying the x axis left to right and z axis in ascending order. I think that rotation matrix or a setting in rgl.materials will do it, but I can't figure out which one. This mathematical conversions is beyond me.

Generally I'd suggest using surface3d, which uses the same conventions as persp and other R functions, rather than rgl.surface, which uses the OpenGL/computer graphics conventions.

If you do that, you would want x and y to be the fixed variables (rows and columns) and z to be the response.
surface3d instead of rgl.surface seems to have worked. I need to work out issued with the axis labels and placement, but you made some suggestions below that I will try. I think I have my y and z ases turned around. The documentation for rgl.surface uses y and surface3d uses z in their examples, but the examples do the same thing.

One note is surface3d uses a white background instead of black that rgl.surface has. I did see the rgl.bg method that I will experiment with to see how this works.



Here is my code
library(rgl);
#set x and z vectors
x<-as.numeric(as.date(rownames(calday.1),order='ymd'));
z<-as.numeric(colnames(a)[1:ncurve]); #only use the portion of the curve with data, exclude NaN's
    res<-par3d('zoom'=5);
#attempt to set the image/window size, constrained to 0,0,256,256 wish I could change this to 0,0,640,640

That's on my wish list too. All I can suggest is that in the current release in Windows in MDI mode, the Windows|Tile command works.

(The difficulty is that rgl is portable to 3 incompatible windowing systems. Things like setting the size of a Window thus take much more work than you'd expect. More than three times as much, because I don't think there's anybody who is familiar with all 3 systems.)
I do understand. I know windows, and have a linux server running that is used for a data warehouse and web server at home. Here at the university of Tulsa, I am stuck with Windows only in our college. But I am not a OS programmer, and for that matter not a very good high level programmer either:).


res<- rotationMatrix(pi,0, 1, 0) # attempt to set rotation, does not make a difference

That just stored a matrix. You need to use view3d to set the userMatrix to that value.

#create a x labels vectors that somewhat matches in the image, trial and error here
labels<-as.character(as.date(x))# could just use rownames(calday.1)
labels<-labels[c(1,n%/%6,n%/%4,n%/%3,n%/%2,(n*2)%/%3,(n*3)%/%4,(n*5)%/%6,n)]
    i=1;
    y<-ez[,,i]; # set y array
#create the y axis labels,again trial and error to fit, using 7 slots from 0 to the max(y) labelsy<-as.character(format(max(y)*rep(1/7,8)*(seq(1:8)-1),digits=2))
#pretty colors thank you rgl docs.
    ylim <- range(y)
    ylen <- ylim[2] - ylim[1] + 1
    colorlut <- terrain.colors(ylen) # height color lookup table
col <- colorlut[ y-ylim[1]+1 ] # assign colors to heights for each point
#generate the surface
        rgl.surface(x,z,y,ylim=c(0,max(ez[,,i])),back='lines',color=col)
title3d(xlab='Date',zlab='Contract Month');#,ylab='Price $'); #sub='Forward curve Trajectory 1',
        axis3d('x--',labels=labels,nticks=9)
        axis3d('y+-',labels=labelsy,nticks=8)
        axis3d('z--',labels=as.character(z),nticks=ncurve);

You can use the "at" argument to set ticks at some location and "labels" to set the text to something else. For example, you might want to reverse one of the axes if the direction isn't the one you want.

Duncan Murdoch


Thank you
Joe

Duncan Murdoch wrote:
Joe Byers wrote:
The documentation for surface3d and rgl.surface in the package RGL states
"'surface3d' always draws the surface with the `front' upwards
(i.e. towards higher 'z' values). This can be used to render the
      top and bottom differently; see 'rgl.material' and the example
      below."

Is there a way to override this default? I have search all the related methods help and the documents on RGL's website.
There are lots of ways to override it: as the docs say, rgl.surface is more flexible than surface3d, and you can draw triangles or quads arbitrarily. What sort of thing do you want to do?

Duncan Murdoch


------------------------------------------------------------------------

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to