Changeset 6ed101a in sasview for guitools


Ignore:
Timestamp:
Apr 29, 2008 5:40:18 PM (17 years ago)
Author:
Gervaise Alina <gervyh@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
47f695c9
Parents:
f193585
Message:

more modification ..zoom is still bugging for logx logy

Location:
guitools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • guitools/PlotPanel.py

    rf193585 r6ed101a  
    6767        # keep track if the previous transformation of x and y in Property dialog 
    6868        self.prevXtrans =" " 
    69          
    7069        self.prevYtrans =" " 
    71          
     70        self.canvas.mpl_connect('scroll_event',self.onWheel) 
     71    def _rescale(lo,hi,step,pt=None,bal=None,scale='linear'): 
     72        """ 
     73        Rescale (lo,hi) by step, returning the new (lo,hi) 
     74        The scaling is centered on pt, with positive values of step 
     75        driving lo/hi away from pt and negative values pulling them in. 
     76        If bal is given instead of point, it is already in [0,1] coordinates. 
     77     
     78        This is a helper function for step-based zooming. 
     79        """ 
     80        # Convert values into the correct scale for a linear transformation 
     81        # TODO: use proper scale transformers 
     82        if scale=='log': 
     83            lo,hi = log10(lo),log10(hi) 
     84            if pt is not None: pt = log10(pt) 
     85     
     86        # Compute delta from axis range * %, or 1-% if persent is negative 
     87        if step > 0: 
     88            delta = float(hi-lo)*step/100 
     89        else: 
     90            delta = float(hi-lo)*step/(100-step) 
     91     
     92        # Add scale factor proportionally to the lo and hi values, preserving the 
     93        # point under the mouse 
     94        if bal is None: 
     95            bal = float(pt-lo)/(hi-lo) 
     96        lo = lo - bal*delta 
     97        hi = hi + (1-bal)*delta 
     98     
     99        # Convert transformed values back to the original scale 
     100        if scale=='log': 
     101            lo,hi = pow(10.,lo),pow(10.,hi) 
     102     
     103        return (lo,hi) 
     104 
     105    def onWheel(self, event): 
     106        """ 
     107        Process mouse wheel as zoom events 
     108        """ 
     109        ax = event.inaxes 
     110        step = event.step 
     111 
     112        if ax != None: 
     113            # Event occurred inside a plotting area 
     114            lo,hi = ax.get_xlim() 
     115            lo,hi = _rescale(lo,hi,step,pt=event.xdata) 
     116            ax.set_xlim((lo,hi)) 
     117 
     118            lo,hi = ax.get_ylim() 
     119            lo,hi = _rescale(lo,hi,step,pt=event.ydata) 
     120            ax.set_ylim((lo,hi)) 
     121        else: 
     122            # Check if zoom happens in the axes 
     123            xdata,ydata = None,None 
     124            x,y = event.x,event.y 
     125            for ax in self.axes: 
     126                insidex,_ = ax.xaxis.contains(event) 
     127                if insidex: 
     128                    xdata,_ = ax.transAxes.inverse_xy_tup((x,y)) 
     129                    #print "xaxis",x,"->",xdata 
     130                insidey,_ = ax.yaxis.contains(event) 
     131                if insidey: 
     132                    _,ydata = ax.transAxes.inverse_xy_tup((x,y)) 
     133                    #print "yaxis",y,"->",ydata 
     134            if xdata is not None: 
     135                lo,hi = ax.get_xlim() 
     136                lo,hi = _rescale(lo,hi,step,bal=xdata) 
     137                ax.set_xlim((lo,hi)) 
     138            if ydata is not None: 
     139                lo,hi = ax.get_ylim() 
     140                lo,hi = _rescale(lo,hi,step,bal=ydata) 
     141                ax.set_ylim((lo,hi)) 
     142 
     143        self.canvas.draw_idle() 
     144 
     145 
    72146    def returnTrans(self): 
    73147        return self.xscales,self.yscales 
     
    265339        self.subplot.clear() 
    266340        self.subplot.hold(True) 
    267          
     341     
    268342    def render(self): 
    269343        """Commit the plot after all objects are drawn""" 
  • guitools/canvas.py

    rf193585 r6ed101a  
    5353        """Translate mouse wheel events into matplotlib events""" 
    5454        # Determine mouse location 
     55        w,h = self.figure.canvas.get_width_height() 
    5556        x = evt.GetX() 
    56         y = self.figure.bbox.height - evt.GetY() 
     57        y = h - evt.GetY() 
    5758 
    5859        # Convert delta/rotation/rate into a floating point step size 
  • guitools/plottables.py

    rf193585 r6ed101a  
    406406        return 1 
    407407     
    408     def transform_x(self, func, errfunc): 
    409         """ 
    410             @param func: reference to x transformation function 
    411              
    412         """ 
    413         self.view.transform_x(func, errfunc, x=self.x, y=self.y, dx=self.dx, dy=self.dy) 
    414      
    415     def transform_y(self, func, errfunc): 
    416         """ 
    417             @param func: reference to y transformation function 
    418              
    419         """ 
    420         self.view.transform_y(func, errfunc, self.y, self.x, self.dx,  self.dy) 
    421          
     408    def transformView(self): 
     409        
     410        self.view.transform( self.x, self.y, self.dx,self.dy) 
    422411         
    423412    def returnValuesOfView(self): 
     
    460449            self.funcdx= None 
    461450            self.funcdy= None 
    462      
    463         def transform_x(self, func, errfunc, x,y=None,dx=None, dy=None): 
     451        def transform(self, x=None,y=None,dx=None, dy=None): 
    464452            """ 
    465453                Transforms the x and dx vectors and stores the output. 
     
    473461             
    474462            # Sanity check 
    475             has_y = False 
    476             if dx and not len(x)==len(dx): 
    477                     raise ValueError, "Plottable.View: Given x and dx are not of the same length"  
    478             # Check length of y array 
    479             if not y==None: 
     463            if (x!=None) and (y!=None): 
     464                if dx and not len(x)==len(dx): 
     465                        raise ValueError, "Plottable.View: Given x and dx are not of the same length"  
     466                # Check length of y array 
    480467                if not len(y)==len(x): 
    481468                    raise ValueError, "Plottable.View: Given y and x are not of the same length" 
    482                 else: 
    483                     has_y = True 
     469             
    484470                if dy and not len(y)==len(dy): 
    485471                    raise ValueError, "Plottable.View: Given y and dy are not of the same length" 
    486              
    487             self.x = [] 
    488             self.dx = [] 
    489             tempy=[] 
    490             tempdy=[] 
    491             print "this is initial value of y transformed",self.y 
    492             print "this is initial value of dy transformed",self.dy 
    493             for i in range(len(x)): 
    494                 if has_y: 
    495                      try: 
    496                          xtemp = func(x[i],y[i]) 
    497                          tempy.append(self.funcy.y[i]) 
    498                          tempdy.append(self.funcdy.dy[i]) 
    499                          if (dx!=None) and (dy !=None): 
    500                              dxtemp = errfunc(x[i], y[i], dx[i], dy[i]) 
    501                          elif (dx != None): 
    502                              dxtemp = errfunc(x[i], y[i], dx[i],0) 
    503                          elif (dy != None): 
    504                              dxtemp = errfunc(x[i], y[i],0,dy[i]) 
    505                          else: 
    506                              dxtemp = errfunc(x[i],y[i],0, 0) 
    507                          self.x.append(xtemp) 
    508                          self.dx.append(dxtemp)   
    509                      except: 
    510                          if len(tempy)>0: 
    511                              del tempy[len(tempy)-1] 
    512                              del tempdy[len(tempdy)-1] 
     472                self.x = [] 
     473                self.y = [] 
     474                self.dx = [] 
     475                self.dy = [] 
     476                tempx=[] 
     477                tempdx=[] 
     478                tempy=[] 
     479                tempdy=[] 
     480                if dx==None: 
     481                    dx=numpy.zeros(len(x)) 
     482                if dy==None: 
     483                    dy=numpy.zeros(len(y)) 
     484                
     485                for i in range(len(x)): 
     486                    try: 
     487                         tempx =self.funcx(x[i],y[i]) 
     488                         tempy =self.funcy(y[i],x[i]) 
     489                         tempdx = self.funcdx(x[i], y[i], dx[i], dy[i]) 
     490                         tempdy = self.funcdy(y[i], x[i], dy[i], dx[i]) 
     491                         
     492                         self.x.append(tempx) 
     493                         self.y.append(tempy) 
     494                         self.dx.append(tempdx) 
     495                         self.dy.append(tempdy) 
     496                    except: 
     497                          
    513498                         print "View.transform_x: skipping point %g" % x[i] 
    514499                         print sys.exc_value    
    515                 else: 
    516                     try: 
    517                         xtemp = func(x[i]) 
    518                         tempy.append(self.funcy.y[i]) 
    519                         tempdy.append(self.funcdy.dy[i]) 
    520                         if (dx != None): 
    521                             dxtemp = errfunc(x[i], dx[i]) 
    522                         else: 
    523                             dxtemp = errfunc(x[i],None)   
    524                         self.x.append(xtemp) 
    525                         self.dx.append(dxtemp)  
    526                     except: 
    527                          if len(tempy)>0: 
    528                              del tempy[len(tempy)-1] 
    529                              del tempdy[len(tempdy)-1] 
    530                          print "View.transform_x: skipping point %g" % x[i] 
    531                          print sys.exc_value 
    532             self.y=tempy 
    533             self.dy=tempdy 
    534             self.Xreel = [] 
    535             self.DXreel=[] 
     500                # Sanity check 
     501                if not (len(self.x)==len(self.dx))and(len(self.x)==len(self.dy))\ 
     502                and(len(self.x)==len(self.y))and(len(self.y)==len(self.dy)) : 
     503                        raise ValueError, "Plottable.View: Given x,y,dy and dx are not of the same length"  
     504             
    536505        def returntransformx(self,funcx,funcdx):     
    537506            self.funcx= funcx 
     
    541510            self.funcy= funcy 
    542511            self.funcdy= funcdy 
    543         def transform_y(self, func, errfunc, y, x=None,dx=None,dy=None): 
    544             """ 
    545                 Transforms the y and dy vectors and stores the output. 
    546                  
    547                 @param func: function to apply to the data y 
    548                 @param x: array of x values 
    549                 @param dx: array of error values 
    550                 @param y: array of y values 
    551                 @param dy: array of error values 
    552                 @param errfunc: function to apply to errors dy 
    553             """ 
    554             # Sanity check 
    555             has_x = False 
    556             if dy and not len(y)==len(dy): 
    557                 raise ValueError, "Plottable.View: Given y and dy are not of the same length" 
    558             # Check length of x array 
    559             if not x==None: 
    560                 if not len(y)==len(x): 
    561                     raise ValueError, "Plottable.View: Given y and x are not of the same length" 
    562                 else: 
    563                     has_x = True 
    564                 if dx and not len(x)==len(dx): 
    565                     raise ValueError, "Plottable.View: Given x and dx are not of the same length" 
    566              
    567             self.y = [] 
    568             self.dy = [] 
    569             tempx=[] 
    570             tempdx=[] 
    571             print "this is initial value of x transformed",self.x 
    572             print "this is initial value of dx transformed",self.dx 
    573             for i in range(len(y)): 
    574                  
    575                  if has_x: 
    576                      try: 
    577                          tempy = func(y[i],x[i]) 
    578                          tempx.append(self.funcx.x[i]) 
    579                          tempdx.append(self.funcdx.x[i]) 
    580                          if (dx!=None) and (dy !=None): 
    581                              tempdy = errfunc(y[i], x[i], dy[i], dx[i]) 
    582                          elif (dx != None): 
    583                              tempdy = errfunc(y[i], x[i], 0, dx[i]) 
    584                          elif (dy != None): 
    585                              tempdy = errfunc(y[i], x[i], dy[i], 0) 
    586                          else: 
    587                              tempdy = errfunc(y[i], None) 
    588                          self.y.append(tempy) 
    589                          self.dy.append(tempdy) 
    590                      except: 
    591                          if len(tempx)>0: 
    592                              del tempx[len(tempx)-1] 
    593                              del tempdx[len(tempdx)-1] 
    594                          print "View.transform_y: skipping point %g" % y[i] 
    595                          print sys.exc_value 
    596                              
    597                  else: 
    598                      try: 
    599                          tempy = func(y[i]) 
    600                          tempx.append(self.funcx.x[i]) 
    601                          tempdx.append(self.funcdx.dx[i]) 
    602                          if (dy != None): 
    603                              tempdy = errfunc( y[i],dy[i]) 
    604                          else: 
    605                              tempdy = errfunc( y[i],None) 
    606                          self.y.append(tempy) 
    607                          self.dy.append(tempdy)    
    608                      except: 
    609                           if len(tempx)>0: 
    610                               del tempx[len(tempx)-1] 
    611                               del tempdx[len(tempdx)-1] 
    612                           print "View.transform_y: skipping point %g" % y[i] 
    613                           print sys.exc_value 
    614                      
    615             self.x = tempx 
    616             self.dx = tempdx 
    617             self.Yreel = [] 
    618             self.DYreel=[] 
    619             self.Yreel = self.y 
    620             self.DYreel = self.dy 
    621             print "this is x length",self.x 
    622             print "this is y length",self.y 
    623             print "this is dx length",self.dx 
    624             print "this is dy length",self.dy 
     512        
    625513        def returnXview(self): 
    626514            return self.x,self.y,self.dx,self.dy 
     
    638526            tempy=[] 
    639527            tempdy=[] 
     528            if self.dx==None: 
     529                self.dx=numpy.zeros(len(self.x)) 
     530            if self.dy==None: 
     531                self.dy=numpy.zeros(len(self.y)) 
    640532            if self.transx=="log10(x)" : 
    641533                for i in range(len(self.x)): 
     
    651543                        print sys.exc_value   
    652544                        pass  
    653             if (self.transx == "x"):    
    654                 if (self.transy == "ln(y*x)"): 
    655                         try: 
    656                             if (self.y[i]*self.x[i]> 0): 
    657                                 tempx.append(self.x[i]) 
    658                                 tempdx.append(self.dx[i]) 
    659                                 tempy.append(self.y[i]) 
    660                                 tempdy.append(self.dy[i]) 
    661                         except: 
    662                             #print "View.transform_x: skipping point %g" %self.x[i] 
    663                             print sys.exc_value   
    664                             pass 
    665             if(self.transy =="ln(y*x^(2))")or(self.transy =="ln(y*x^(4))"): 
    666                 print "this is y transform",self.y 
    667                 print "this is x transform",self.x 
    668                 try: 
    669                     if (self.y[i]> 0 )and (self.x[i]!=0): 
    670                         tempx.append(self.x[i]) 
    671                         tempdx.append(self.dx[i]) 
    672                         tempy.append(self.y[i]) 
    673                         tempdy.append(self.dy[i]) 
    674                 except: 
    675                     #print "View.transform_x: skipping point %g" %self.x[i] 
    676                     print sys.exc_value   
    677                     pass 
     545            
    678546            self.x=[] 
    679547            self.dx=[] 
     
    690558            tempy=[] 
    691559            tempdy=[] 
    692             for i in range(len(self.x)): 
    693                 if (self.transy == "ln(y)") or (self.transy == "log10(y)" )or\ 
    694                      (self.transy =="1/sqrt(y)") : 
     560            if self.dx==None: 
     561                self.dx=numpy.zeros(len(self.x)) 
     562            if self.dy==None: 
     563                self.dy=numpy.zeros(len(self.y)) 
     564            if (self.transy == "log10(y)" ): 
     565                for i in range(len(self.x)): 
    695566                     try: 
    696567                        if (self.y[i]> 0): 
     
    703574                        print sys.exc_value   
    704575                        pass 
    705                 if(self.transy == "1/y"): 
    706                     try: 
    707                         if (self.y[i]!=0): 
    708                             tempx.append(self.x[i]) 
    709                             tempdx.append(self.dx[i]) 
    710                             tempy.append(self.y[i]) 
    711                             tempdy.append(self.dy[i]) 
    712                     except: 
    713                         #print "View.transform_x: skipping point %g" %self.x[i] 
    714                         print sys.exc_value   
    715                         pass   
    716             if (self.transx == "x"):    
    717                 if (self.transy == "ln(y*x)"): 
    718                         try: 
    719                             if (self.y[i]*self.x[i]> 0): 
    720                                 tempx.append(self.x[i]) 
    721                                 tempdx.append(self.dx[i]) 
    722                                 tempy.append(self.y[i]) 
    723                                 tempdy.append(self.dy[i]) 
    724                         except: 
    725                             #print "View.transform_x: skipping point %g" %self.x[i] 
    726                             print sys.exc_value   
    727                             pass 
    728             if(self.transy =="ln(y*x^(2))")or(self.transy =="ln(y*x^(4))"): 
    729                 print "this is y transform",self.y 
    730                 print "this is x transform",self.x 
    731                 try: 
    732                     if (self.y[i]> 0 )and (self.x[i]!= 0): 
    733                         tempx.append(self.x[i]) 
    734                         tempdx.append(self.dx[i]) 
    735                         tempy.append(self.y[i]) 
    736                         tempdy.append(self.dy[i]) 
    737                 except: 
    738                     #print "View.transform_x: skipping point %g" %self.x[i] 
    739                     print sys.exc_value   
    740                     pass 
    741576                 
    742577            self.x=[] 
Note: See TracChangeset for help on using the changeset viewer.