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.