Changeset 10832:c101ce95dd16 in orange


Ignore:
Timestamp:
04/20/12 13:07:39 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Added "All" special value to the max components spin box.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Prototypes/OWPCA.py

    r10812 r10832  
    2222from plot.owcurve import OWCurve 
    2323from plot import owaxis 
     24 
    2425 
    2526class ScreePlot(OWPlot): 
     
    4950        if self.is_cutoff_enabled() and event.buttons() & Qt.LeftButton: 
    5051            pos = self.mapToScene(event.pos()) 
    51             x, _  = self.map_from_graph(pos) 
     52            x, _ = self.map_from_graph(pos) 
    5253            xmin, xmax = self.x_scale() 
    5354            if x >= xmin - 0.1 and x <= xmax + 0.1: 
     
    9091        self.map_transform = self.transform_for_axes() 
    9192 
     93 
    9294class CutoffCurve(OWCurve): 
    9395    def __init__(self, *args, **kwargs): 
     
    9698        self.setCursor(Qt.SizeHorCursor) 
    9799 
     100 
    98101class OWPCA(OWWidget): 
    99102    settingsList = ["standardize", "max_components", "variance_covered", 
    100103                    "use_generalized_eigenvectors", "auto_commit"] 
     104 
    101105    def __init__(self, parent=None, signalManager=None, title="PCA"): 
    102106        OWWidget.__init__(self, parent, signalManager, title, wantGraph=True) 
     
    127131        grid.addWidget(label1, 1, 0) 
    128132 
    129         sb1 = OWGUI.spin(box, self, "max_components", 1, 1000, 
     133        sb1 = OWGUI.spin(box, self, "max_components", 0, 1000, 
    130134                         tooltip="Maximum number of components", 
    131135                         callback=self.on_update, 
     
    134138                         ) 
    135139        self.max_components_spin = sb1.control 
     140        self.max_components_spin.setSpecialValueText("All") 
    136141        grid.addWidget(sb1.control, 1, 1) 
    137142 
     
    167172        self.variance_curve = self.scree_plot.add_curve( 
    168173                        "Variance", 
    169                         Qt.red, Qt.red, 2,  
     174                        Qt.red, Qt.red, 2, 
    170175                        xData=[], 
    171176                        yData=[], 
     
    180185        self.cumulative_variance_curve = self.scree_plot.add_curve( 
    181186                        "Cumulative Variance", 
    182                         Qt.darkYellow, Qt.darkYellow, 2,  
     187                        Qt.darkYellow, Qt.darkYellow, 2, 
    183188                        xData=[], 
    184189                        yData=[], 
     
    285290        self.variances_cumsum = np.cumsum(self.variances) 
    286291 
    287         self.max_components_spin.setRange(1, len(self.variances)) 
     292        self.max_components_spin.setRange(0, len(self.variances)) 
    288293        self.update_scree_plot() 
    289294        self.update_cutoff_curve() 
     
    295300        else: 
    296301            self.changed_flag = True 
    297          
     302 
    298303    def update_components(self): 
    299304        """Update the output components. 
    300305        """ 
    301306        if self.data is None: 
    302             return  
     307            return 
    303308 
    304309        scale = self.projector_full.scale 
     
    309314        variance_sum = self.projector_full.variance_sum 
    310315 
    311         # Get selected components (based on max_components and  
     316        # Get selected components (based on max_components and 
    312317        # variance_coverd) 
    313318        pca = self.construct_pca() 
     
    341346        self.scree_plot.set_axis_enabled(owaxis.xBottom, True) 
    342347        self.scree_plot.set_axis_enabled(owaxis.yLeft, True) 
    343         self.scree_plot.set_axis_labels(owaxis.xBottom,  
     348        self.scree_plot.set_axis_labels(owaxis.xBottom, 
    344349                                        ["PC" + str(i + 1) for i in x_space]) 
    345350 
     
    365370        """Update cutoff curve from 'Components Selection' control box. 
    366371        """ 
    367         variance = self.variances_cumsum[self.max_components - 1] * 100.0 
     372        if self.max_components == 0: 
     373            # Special "All" value 
     374            max_components = len(self.variances_cumsum) 
     375        else: 
     376            max_components = self.max_components 
     377 
     378        variance = self.variances_cumsum[max_components - 1] * 100.0 
    368379        if variance < self.variance_covered: 
    369             cutoff = float(self.max_components - 1) 
     380            cutoff = float(max_components - 1) 
    370381        else: 
    371382            cutoff = np.searchsorted(self.variances_cumsum, 
     
    381392        variance_components = np.searchsorted(self.variances_cumsum, 
    382393                                              self.variance_covered / 100.0) 
    383         return min(variance_components + 1, self.max_components) 
     394        if self.max_components == 0: 
     395            # Special "All" value 
     396            max_components = len(self.variances_cumsum) 
     397        else: 
     398            max_components = self.max_components 
     399        return min(variance_components + 1, max_components) 
    384400 
    385401    def sendReport(self): 
     
    411427            self.reportImage(self.scree_plot.save_to_file_direct) 
    412428 
     429 
    413430if __name__ == "__main__": 
    414431    app = QApplication(sys.argv) 
Note: See TracChangeset for help on using the changeset viewer.