[R] x-only zoom and pan?

Peter Wolf s-plus at wiwi.uni-bielefeld.de
Mon Apr 5 10:41:24 CEST 2004


Hallo here is a simple proposal using tcltk-sliders.

Peter Wolf

# step 1:   define general slider function

slider<-function(refresh.code,names,minima,maxima,resolutions,starts,title="control",no=0,
   set.no.value=0){
# pw 03/2004
   if(no!=0) 
return(as.numeric(tclvalue(get(paste("slider",no,sep=""),env=slider.env))))
   if(set.no.value[1]!=0){ 
try(eval(parse(text=paste("tclvalue(slider",set.no.value[1],")<-",
            set.no.value[2],sep="")),env=slider.env)); 
return(set.no.value[2]) }
   if(!exists("slider.env")) slider.env<<-new.env()
   library(tcltk); nt<-tktoplevel(); tkwm.title(nt,title); 
tkwm.geometry(nt,"+0+0")
   for(i in seq(names))
      
eval(parse(text=paste("assign(\"slider",i,"\",tclVar(starts[i]),env=slider.env)",sep="")))
   for(i in seq(names)){
      tkpack(fr<-tkframe(nt));  lab<-tklabel(fr, text=names[i], width="25")
      sc<-tkscale(fr, command=refresh.code, from=minima[i], to=maxima[i],
                     showvalue=T, resolution=resolutions[i], orient="horiz")
      assign("sc",sc,env=slider.env); tkpack(lab,sc,side="right")
      
eval(parse(text=paste("tkconfigure(sc,variable=slider",i,")",sep="")),env=slider.env)
   }
   tkpack(fr<-tkframe(nt),fill="x")
   tkpack(tkbutton(fr, text="Exit",    
command=function()tkdestroy(nt)),side="right")
   tkpack(tkbutton(fr, text="Reset", command=function(){
      for(i in seq(starts)) 
eval(parse(text=paste("tclvalue(slider",i,")<-",starts[i],sep="")),env=slider.env)
      refresh.code()    }  ),side="left")
}

# step 2: define function for zooming

ts.zoom<-function(x,y,z){
# pw 05042004
  library(tcltk)
  n.ts<-1; if(!missing(y)) n.ts<-2; if(!missing(z)) n.ts<-3
  refresh.code<-function(...){
  # initialization
    start<-slider(no=1)*100; delta<-slider(no=2)*100
    if(start+delta>length(x))
      start<-slider(set.no.value=c(1,(length(x)-delta)/100))*100
  # plot
    par(mfrow=c(n.ts,1))
    plot(x,type="l",xlim=c(start,start+delta))
    if(n.ts>=2)  plot(y,type="l",xlim=c(start,start+delta))
    if(n.ts>=3) plot(z,type="l",xlim=c(start,start+delta))
    par(mfrow=c(1,1))
 }
  slider(refresh.code,
  # names of sliders
       c("begin index (unit=100)",  "window width (unit=100)"),
  # min of sliders
       c(0,1),
  # max of sliders
       c(floor(length(x)/100),length(x)/100),
  # step of sliders
       c(1,1),
  # initial values
       c(1,1))
}

# step 3: test it.

ts.zoom(runif(10000), rexp(10000), rnorm(10000))




Randy Zelick wrote:

>Hello list,
>
>Could the following be done without too much grief...?
>
>Lets say I have two or three time series objects that I want to inspect
>visually. Each I would plot with a y-offset so they stack up. They share
>the same X scaling. The problem is that each is perhaps 100K values. Due
>to the large number of values, features of the data sets cannot be seen
>when all values are plotted.
>
>What would be nice is to plot a fraction of the X range (say 10%). This
>would be equivalent to zooming in the X direction. Then using a key
>(ideally an arrow key), shift the viewing frame right or left to
>effectively scroll through the data. So first you view 0-10%, then 10-20%
>and so forth.
>
>If necessary I can fabricate a vector with X values in it and plot(x,y)
>instead of as time series, if this makes it any easier.
>
>I am using a Windows version of R.
>
>Thanks,
>
>=Randy=
>
>R. Zelick				email: zelickr at pdx.edu
>Department of Biology			voice: 503-725-3086
>Portland State University		fax:   503-725-3888
>
>mailing:
>P.O. Box 751
>Portland, OR 97207
>
>shipping:
>1719 SW 10th Ave, Room 246
>Portland, OR 97201
>
>______________________________________________
>R-help at stat.math.ethz.ch mailing list
>https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>  
>




More information about the R-help mailing list