[R] RGL 'front' upwards default in rendering image
Joe Byers
joe-byers at utulsa.edu
Tue Oct 3 20:27:34 CEST 2006
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
>>
>>
>> ------------------------------------------------------------------------
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch 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.
>
More information about the R-help
mailing list