Changeset 1c94a9f1 in sasview for guitools/PlotPanel.py


Ignore:
Timestamp:
Jul 8, 2008 11:40:33 AM (16 years ago)
Author:
Mathieu Doucet <doucetm@…>
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:
792db7d5
Parents:
9a3adab
Message:

Fixed all sorts of bugs: replotting problems, bad logic in rescaling function, removed buggy field in dialog box, improved usability for linear fit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • guitools/PlotPanel.py

    ra17ffdf r1c94a9f1  
    150150        self.axes = [self.subplot] 
    151151         
     152        ## Fit dialog 
     153        self._fit_dialog = None 
     154         
    152155        # Interactor 
    153156        self.connect = BindArtist(self.subplot.figure) 
     
    163166        self.xminView=0.0 
    164167        self.xmaxView=0.0 
     168        self._scale_xlo = None 
     169        self._scale_xhi = None 
     170        self._scale_ylo = None 
     171        self._scale_yhi = None 
    165172        self.Avalue=None 
    166173        self.Bvalue=None 
     
    224231                self.dragHelper(0,0) 
    225232                 
     233    def _offset_graph(self): 
     234        """ 
     235             Zoom and offset the graph to the last known  
     236             settings  
     237        """ 
     238 
     239        for ax in self.axes: 
     240            if self._scale_xhi is not None and self._scale_xlo is not None: 
     241                ax.set_xlim(self._scale_xlo, self._scale_xhi) 
     242            if self._scale_yhi is not None and self._scale_ylo is not None: 
     243                ax.set_ylim(self._scale_ylo, self._scale_yhi) 
     244             
     245             
    226246    def dragHelper(self,xdelta,ydelta): 
    227247        """ dragging occurs here""" 
     
    238258                    newhi= math.log10(hi)-xdelta 
    239259            if self.xscale=='log': 
     260                self._scale_xlo = math.pow(10,newlo) 
     261                self._scale_xhi = math.pow(10,newhi) 
    240262                ax.set_xlim(math.pow(10,newlo),math.pow(10,newhi)) 
    241263            else: 
     264                self._scale_xlo = newlo 
     265                self._scale_xhi = newhi 
    242266                ax.set_xlim(newlo,newhi) 
    243267            #print "new lo %f and new hi %f"%(newlo,newhi) 
     
    253277                #print "new lo %f and new hi %f"%(newlo,newhi) 
    254278            if  self.yscale=='log': 
     279                self._scale_ylo = math.pow(10,newlo) 
     280                self._scale_yhi = math.pow(10,newhi) 
    255281                ax.set_ylim(math.pow(10,newlo),math.pow(10,newhi)) 
    256282            else: 
     283                self._scale_ylo = newlo 
     284                self._scale_yhi = newhi 
    257285                ax.set_ylim(newlo,newhi) 
    258286        self.canvas.draw_idle() 
     
    268296        self.xminView=0.0 
    269297        self.xmaxView=0.0 
     298        self._scale_xlo = None 
     299        self._scale_xhi = None 
     300        self._scale_ylo = None 
     301        self._scale_yhi = None 
    270302        self.Avalue=None 
    271303        self.Bvalue=None 
     
    287319            lo,hi = _rescale(lo,hi,step,pt=event.xdata,scale=ax.get_xscale()) 
    288320            if not self.xscale=='log' or lo>0: 
     321                self._scale_xlo = lo 
     322                self._scale_xhi = hi 
    289323                ax.set_xlim((lo,hi)) 
    290324 
     
    292326            lo,hi = _rescale(lo,hi,step,pt=event.ydata,scale=ax.get_yscale()) 
    293327            if not self.yscale=='log' or lo>0: 
     328                self._scale_ylo = lo 
     329                self._scale_yhi = hi 
    294330                ax.set_ylim((lo,hi)) 
    295331        else: 
     
    309345                lo,hi = _rescale(lo,hi,step,bal=xdata,scale=ax.get_xscale()) 
    310346                if not self.xscale=='log' or lo>0: 
     347                    self._scale_xlo = lo 
     348                    self._scale_xhi = hi 
    311349                    ax.set_xlim((lo,hi)) 
    312350            if ydata is not None: 
     
    314352                lo,hi = _rescale(lo,hi,step,bal=ydata,scale=ax.get_yscale()) 
    315353                if not self.yscale=='log' or lo>0: 
     354                    self._scale_ylo = lo 
     355                    self._scale_yhi = hi 
    316356                    ax.set_ylim((lo,hi)) 
    317357                
     
    354394        """ 
    355395            when clicking on linear Fit on context menu , display Fitting Dialog 
     396            @param plot: PlotPanel owning the graph 
    356397        """ 
    357398        from fitDialog import LinearFit 
    358399         
    359         dlg = LinearFit( None, plot, self.onFitDisplay,self.returnTrans, -1, 'Linear Fit') 
    360         
    361         if (self.xmin !=0.0 )and ( self.xmax !=0.0)\ 
    362             and(self.xminView !=0.0 )and ( self.xmaxView !=0.0): 
    363             dlg.setFitRange(self.xminView,self.xmaxView,self.xmin,self.xmax) 
    364         dlg.ShowModal()  
     400        if self._fit_dialog is not None: 
     401            return 
     402         
     403        self._fit_dialog = LinearFit( None, plot, self.onFitDisplay,self.returnTrans, -1, 'Linear Fit') 
     404         
     405        # Set the zoom area  
     406        if self._scale_xhi is not None and self._scale_xlo is not None: 
     407            self._fit_dialog.set_fit_region(self._scale_xlo, self._scale_xhi) 
     408         
     409        # Register the close event 
     410        self._fit_dialog.register_close(self._linear_fit_close) 
     411         
     412        # Show a non-model dialog 
     413        self._fit_dialog.Show()  
     414 
     415    def _linear_fit_close(self): 
     416        """ 
     417            A fit dialog was closed 
     418        """ 
     419        self._fit_dialog = None 
     420         
    365421 
    366422    def _onProperties(self, event): 
     
    369425            The user selects a transformation for x or y value and a new plot is displayed 
    370426        """ 
     427        if self._fit_dialog is not None: 
     428            self._fit_dialog.Destroy() 
     429            self._fit_dialog = None 
     430             
    371431        list =[] 
    372432        list = self.graph.returnPlottable() 
     
    641701        return self.symbollist[s%len(self.symbollist)] 
    642702    
    643     def _replot(self): 
     703    def _replot(self, remove_fit=False): 
    644704        """ 
    645705            Rescale the plottables according to the latest 
    646706            user selection and update the plot 
     707             
     708            @param remove_fit: Fit line will be removed if True 
    647709        """ 
    648710        self.graph.reset_scale() 
    649         self._onEVT_FUNC_PROPERTY(remove_fit=False) 
     711        self._onEVT_FUNC_PROPERTY(remove_fit=remove_fit) 
    650712         
    651713        #TODO: Why do we have to have the following line? 
     
    660722              and set the scale     
    661723        """  
     724        # The logic should be in the right order 
     725        # Delete first, and then get the whole list... 
     726        if remove_fit: 
     727            self.graph.delete(self.fit_result) 
     728             
    662729        list =[] 
    663730        list = self.graph.returnPlottable() 
    664731         
    665         if remove_fit: 
    666             self.fit_result.x =[]   
    667             self.fit_result.y =[]  
    668             self.fit_result.dx=None 
    669             self.fit_result.dy=None 
    670             self.graph.delete(self.fit_result) 
     732        # Changing the scale might be incompatible with 
     733        # currently displayed data (for instance, going  
     734        # from ln to log when all plotted values have 
     735        # negative natural logs).  
     736        # Go linear and only change the scale at the end. 
     737        self.set_xscale("linear") 
     738        self.set_yscale("linear") 
     739        _xscale = 'linear' 
     740        _yscale = 'linear' 
     741         
    671742         
    672743        for item in list: 
     744            print item.name 
    673745            item.setLabel(self.xLabel,self.yLabel) 
    674746            if ( self.xLabel=="x" ): 
    675747                item.transformX(transform.toX,transform.errToX) 
    676                 self.set_xscale("linear") 
    677748                name, units = item.get_xaxis() 
    678749                self.graph.xaxis("%s" % name,  "%s" % units) 
     
    681752            if ( self.xLabel=="x^(2)" ): 
    682753                item.transformX(transform.toX2,transform.errToX2) 
    683                 self.set_xscale('linear') 
    684754                name, units = item.get_xaxis() 
    685755                units=convertUnit(2,units)  
     
    689759            if (self.xLabel=="log10(x)" ): 
    690760                item.transformX(transform.toX_pos,transform.errToX_pos) 
    691                 self.set_xscale("log") 
     761                _xscale = 'log' 
    692762                name, units = item.get_xaxis()  
    693763                self.graph.xaxis("\log_{10}\ \  (%s)" % name,  "%s" % units) 
     
    696766            if ( self.yLabel=="ln(y)" ): 
    697767                item.transformY(transform.toLogX,transform.errToLogX) 
    698                 self.set_yscale("linear") 
    699768                name, units = item.get_yaxis() 
    700769                self.graph.yaxis("\log\ \ %s" % name,  "%s" % units) 
     
    703772            if ( self.yLabel=="y" ): 
    704773                item.transformY(transform.toX,transform.errToX) 
    705                 self.set_yscale("linear") 
    706774                name, units = item.get_yaxis() 
    707775                self.graph.yaxis("%s" % name,  "%s" % units) 
     
    710778            if ( self.yLabel=="log10(y)" ):  
    711779                item.transformY(transform.toX_pos,transform.errToX_pos) 
    712                 self.set_yscale("log")   
     780                _yscale = 'log'   
    713781                name, units = item.get_yaxis() 
    714782                self.graph.yaxis("\log_{10}\ \ (%s)" % name,  "%s" % units) 
     
    717785            if ( self.yLabel=="y^(2)" ): 
    718786                item.transformY( transform.toX2,transform.errToX2 )     
    719                 self.set_yscale("linear") 
    720787                name, units = item.get_yaxis() 
    721788                units=convertUnit(2,units)  
     
    725792            if ( self.yLabel =="1/y"): 
    726793                item.transformY(transform.toOneOverX,transform.errOneOverX ) 
    727                 self.set_yscale("linear") 
    728794                name, units = item.get_yaxis() 
    729795                units=convertUnit(-1,units) 
     
    732798            if ( self.yLabel =="1/sqrt(y)" ): 
    733799                item.transformY(transform.toOneOverSqrtX,transform.errOneOverSqrtX ) 
    734                 self.set_yscale("linear") 
    735800                name, units = item.get_yaxis() 
    736801                units=convertUnit(-0.5,units) 
     
    739804            if ( self.yLabel =="ln(y*x)"): 
    740805                item.transformY( transform.toLogXY,transform.errToLogXY) 
    741                 self.set_yscale("linear") 
    742806                yname, yunits = item.get_yaxis() 
    743807                xname, xunits = item.get_xaxis() 
     
    747811            if ( self.yLabel =="ln(y*x^(2))"): 
    748812                item.transformY( transform.toLogYX2,transform.errToLogYX2) 
    749                 self.set_yscale("linear") 
    750813                yname, yunits = item.get_yaxis() 
    751814                xname, xunits = item.get_xaxis()  
     
    756819            if ( self.yLabel =="ln(y*x^(4))"): 
    757820                item.transformY(transform.toLogYX4,transform.errToLogYX4) 
    758                 self.set_yscale("linear") 
    759821                yname, yunits = item.get_yaxis() 
    760822                xname, xunits = item.get_xaxis() 
     
    765827                 
    766828                item.transformX(transform.toX2,transform.errToX2) 
    767                 self.set_xscale('linear') 
    768829                name, units = item.get_xaxis() 
    769830                units = convertUnit(2,units)  
     
    772833                 
    773834                item.transformY(transform.toLogX,transform.errToLogX ) 
    774                 self.set_yscale("linear") 
    775835                name, units = item.get_yaxis() 
    776836                self.graph.yaxis("\log\ \ %s" % name,  "%s" % units) 
     
    779839            item.transformView() 
    780840             
    781           
    782841        self.resetFitView()    
    783842        self.prevXtrans = self.xLabel  
    784843        self.prevYtrans = self.yLabel   
    785844        self.graph.render(self) 
     845         
     846        self.set_xscale(_xscale) 
     847        self.set_yscale(_yscale) 
     848          
    786849        self.subplot.figure.canvas.draw_idle() 
    787850         
     
    824887        self.graph.add(self.fit_result)  
    825888        self.graph.render(self) 
     889        self._offset_graph() 
    826890        self.subplot.figure.canvas.draw_idle() 
    827891         
Note: See TracChangeset for help on using the changeset viewer.