Changeset 6990:3aa3e0646813 in orange


Ignore:
Timestamp:
09/28/10 15:30:09 (4 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
c0484003ce188c1f5f50f2c641aca947166494d4
Message:
  • code speedup (removed redundant computation)
  • fixed some errors
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Unsupervised/OWSOMVisualizer.py

    r6978 r6990  
    1919from functools import partial 
    2020 
     21class ColorPaletteBW(ColorPalette): 
     22    def __init__(self, *args, **kwargs): 
     23        ColorPalette.__init__(self, [(0, 0, 0,), (255, 255, 255)], *args, **kwargs) 
     24         
     25class ColorPaletteHSV(ColorPalette): 
     26    def __init__(self, num_of_colors): 
     27        ColorPalette.__init__(self, OWColorPalette.defaultRGBColors) 
     28        self.num_of_colors = num_of_colors 
     29         
     30    def get_rgb(self, value, gamma=None): 
     31        if isinstance(value, int): 
     32            return self.colors[value] 
     33        else: 
     34            raise ValueError("int expected for discrete color palette") 
     35         
     36class ColorPaletteGR(ColorPalette): 
     37    def __init__(self, *args, **kwargs): 
     38        ColorPalette.__init__(self, [(0, 255, 0), (255, 0, 0)], *args, **kwargs) 
     39         
    2140class GraphicsSOMItem(QGraphicsPolygonItem): 
    2241    startAngle=0 
     
    3352        self.setSize(10) 
    3453        self.setZValue(0) 
    35 #        self.setFlags(QGraphicsItem.ItemIsSelectable) 
    3654 
    3755    def areaPoints(self): 
     
    280298        size=self.objSize*2-1 
    281299        x,y=size, size 
    282 ##            self.resize(1,1)    # crashes at update without this line !!! 
    283300        for n in self.map.map: 
    284301            r=GraphicsSOMRectangle(self) 
     
    313330    @property 
    314331    def colorSchema(self): 
     332        """ Color schema for component planes 
     333        """ 
    315334        if hasattr(self, "_colorSchema"): 
    316335            return self._colorSchema 
     
    321340                elif type(attr) == int: 
    322341                    attr = self.map.examples.domain[attr] 
    323                  
    324                 if attr.varType == orange.VarTypes.Discrete and False: 
    325                     return lambda val: OWColorPalette.ColorPaletteHSV(self.map.examples.domain[attr].values)[val] 
     342                if attr.varType == orange.VarTypes.Discrete: 
     343                    index = self.map.examples.domain.index(attr) 
     344                    vals = [n.vector[index] for n in self.map.map] 
     345                    minval, maxval = min(vals), max(vals) 
     346                    print minval, maxval 
     347                    return lambda val: OWColorPalette.ColorPaletteBW()[min(max(1 - (val - minval) / (maxval - minval or 1), 0.0), 1.0)] 
    326348                else: 
    327349                    index = self.map.examples.domain.index(attr) 
     
    336358    @property 
    337359    def histogramColorSchema(self): 
     360        """ Color schema for histograms 
     361        """ 
    338362        if hasattr(self, "_histogramColorSchema"): 
    339363            def colorSchema(attr): 
     
    348372                    index = self.map.examples.domain.index(attr) 
    349373                    arr, c, w = self.histogramData.toNumpyMA() 
    350                     vals = arr[:,index] 
    351                     minval, maxval = min(vals), max(vals) 
    352                     return lambda val: self._histogramColorSchema(1 - (val - minval) / (maxval - minval or 1)) 
     374                    if index == arr.shape[1]: 
     375                        vals = c 
     376                    else: 
     377                        vals = arr[:,index] 
     378                    minval, maxval = numpy.min(vals), numpy.max(vals) 
     379                    def f(val): 
     380                        return self._histogramColorSchema((val - minval) / (maxval - minval or 1)) 
     381                    return f 
    353382            return colorSchema 
    354383        else: 
     
    711740        self.legendLayout = QGraphicsLinearLayout(Qt.Vertical) 
    712741        self.layout().addItem(self.legendLayout) 
    713 #        self.setGraphicsEffect(QGraphicsDropShadowEffect(offset=QPointF(1,2), blurRadius=5)) 
     742        self.componentLegendItem = None 
     743        self.histLegendItem = None 
    714744         
    715745    def clear(self): 
     
    728758        self.componentPlane = attr 
    729759        self.somItem.setComponentPlane(attr) 
    730         if self.legendLayout.count() > 0: 
    731             item = self.legendLayout.itemAt(0) 
    732             item.scene().removeItem(item) 
    733             self.legendLayout.removeAt(0) 
     760        if self.componentLegendItem is not None: 
     761            self.scene().removeItem(self.componentLegendItem) 
     762            self.componentLegendItem = None 
    734763        if attr is not None: 
    735             self.legendItem = LegendItem(attr, parent=self) 
    736             self.legendItem.setOrientation(Qt.Vertical) 
    737             self.legendLayout.addItem(self.legendItem) 
    738             self.legendItem.setScale(self.somItem.componentRange(attr)) 
     764            self.componentLegendItem = LegendItem(attr, parent=self) 
     765            self.componentLegendItem.setOrientation(Qt.Vertical) 
     766            self.legendLayout.insertItem(0, self.componentLegendItem) 
     767            self.componentLegendItem.setScale(self.somItem.componentRange(attr)) 
    739768         
    740769    def setHistogramData(self, data): 
     
    745774        self.histogramConstructor = constructor  
    746775        self.somItem.setHistogramConstructor(constructor) 
    747         if getattr(self, "histLegendItem", None) is not None: 
     776        if self.histLegendItem is not None: 
    748777            self.scene().removeItem(self.histLegendItem) 
    749778            self.histLegendItem = None 
     
    782811            self.somItem = None 
    783812        self.somItem = SOMUMatrixItem(som, parent=self) 
    784 #        item = self.layout().itemAt(0) 
    785 #        if item: 
    786 #            self.layout().removeItem(item) 
    787 #            item.scene().removeItem(item) 
    788813        self.layout().insertItem(0, LayoutItemWrapper(self.somItem)) 
    789814         
     
    838863             
    839864class SOMScene(QGraphicsScene): 
     865    def __init__(self, parent=None): 
     866        QGraphicsScene.__init__(self, parent) 
     867        self.histogramData = None 
     868        self.histogramConstructor = None 
     869        self.histogramColorSchema = None 
     870        self.componentColorSchema = None 
     871        self.componentPlane = None 
     872        self.somWidget = None 
     873         
     874    def clear(self): 
     875        QGraphicsScene.clear(self) 
     876        self.histogramData = None 
     877        self.histogramConstructor = None 
     878        self.histogramColorSchema = None 
     879        self.componentColorSchema = None 
     880        self.componentPlane = None 
     881        self.somWidget = None 
     882         
    840883    def setSom(self, map): 
    841884        self.clear() 
    842          
    843885        self.map = map 
    844886         
     
    847889        self.selectionManager = SceneSelectionManager(self) 
    848890        self.connect(self.selectionManager, SIGNAL("selectionGeometryChanged()"), self.onSelectionAreaChange) 
     891         
     892    def setComponentPlane(self, attr): 
     893        if type(self.somWidget) != SOMGraphicsWidget: 
     894            self.clear() 
     895            self.somWidget = SOMGraphicsWidget(None) 
     896            self.somWidget.setSOM(self.map) 
     897            self.somWidget.setComponentPlane(attr) 
     898            self.addItem(self.somWidget) 
     899            self.componentPlane = None 
     900            self.histogramData = None 
     901            self.histogramConstructor = None 
     902             
     903        if attr is not self.componentPlane: 
     904            self.componentPlane = attr 
     905            for item in self.somWidgets(): 
     906                item.setComponentPlane(attr) 
     907                 
     908    def setUMatrix(self): 
     909        if type(self.somWidget) != SOMGraphicsUMatrix: 
     910            self.clear() 
     911            self.somWidget = SOMGraphicsUMatrix(None) 
     912            self.somWidget.setSOM(self.map) 
     913            self.addItem(self.somWidget) 
    849914         
    850915    def somWidgets(self): 
     
    854919         
    855920    def setHistogramData(self, data): 
    856         self.data = data 
    857         for item in self.somWidgets(): 
    858             item.setHistogramData(data) 
     921        if data is not self.histogramData: 
     922            self.histogramData = data 
     923            for item in self.somWidgets(): 
     924                item.setHistogramData(data) 
    859925                 
    860926    def setHistogramConstructor(self, constructor): 
    861         for item in self.somWidgets(): 
    862             item.setHistogramConstructor(constructor) 
     927        if self.histogramConstructor is not constructor: 
     928            self.histogramConstructor = constructor 
     929            for item in self.somWidgets(): 
     930                item.setHistogramConstructor(constructor) 
    863931             
    864932    def setHistogramColorSchema(self, schema): 
    865         for item in self.somWidgets(): 
    866             item.setHistogramColorSchema(schema) 
    867              
    868     def setGridMode(self, mode): 
    869         return 
    870         for item in self.somWidgets(): 
    871             item.setGridMode(mode) 
    872              
    873     def setColorSchema(self, schema): 
    874         for item in self.somWidgets(): 
    875             item.setColorSchema(schema) 
    876  
    877     def setComponentPlane(self, attr): 
    878         self.clear() 
    879         self.somWidget = SOMGraphicsWidget(None) 
    880         self.somWidget.setSOM(self.map) 
    881         self.somWidget.setComponentPlane(attr) 
    882         self.addItem(self.somWidget) 
    883          
    884     def setUMatrix(self): 
    885         self.clear() 
    886          
    887         self.somWidget = SOMGraphicsUMatrix(None) 
    888         self.somWidget.setSOM(self.map) 
    889          
    890         self.addItem(self.somWidget) 
     933        if schema is not self.histogramColorSchema: 
     934            self.histogramColorSchema = schema 
     935            for item in self.somWidgets(): 
     936                item.setHistogramColorSchema(schema) 
     937             
     938    def setComponentColorSchema(self, schema): 
     939        if schema is not self.componentColorSchema: 
     940            self.componentColorSchema = schema 
     941            for item in self.somWidgets(): 
     942                item.setComponentColorSchema(schema) 
    891943         
    892944    def setNodePen(self, pen): 
     
    906958        if event.buttons() & Qt.LeftButton: 
    907959            self.selectionManager.update(event) 
    908             self.selectionRectItem.setRect(self.selectionManager.lastSelectionRect()) 
     960            if self.selectionRectItem: 
     961                self.selectionRectItem.setRect(self.selectionManager.lastSelectionRect()) 
    909962     
    910963    def mouseReleaseEvent(self, event): 
     
    9711024         
    9721025        self.loadSettings() 
    973 #        call = lambda:self.scene.redrawSom() 
    9741026 
    9751027        histTab = mainTab = self.controlArea 
     
    10361088        if not self.somMap: 
    10371089            return 
    1038         if self.drawMode in [0 ,2]: 
    1039             self.scene.setComponentPlane(self.component if self.drawMode == 2 else None) 
     1090        self.error(0) 
     1091        if self.drawMode == 0: 
     1092            self.scene.setComponentPlane(None) 
     1093        elif self.drawMode == 2: 
     1094            self.scene.setComponentPlane(self.component) 
    10401095        elif self.drawMode == 1: 
    10411096            self.scene.setUMatrix() 
     
    10561111         
    10571112    def onHistogramAttrSelection(self): 
     1113        if not self.somMap: 
     1114            return  
    10581115        if self.somMap.examples.domain.variables[self.attribute].varType == orange.VarTypes.Discrete: 
    10591116            self.coloringStackedLayout.setCurrentWidget(self.discTab) 
     
    10671124            if self.inputSet and self.examples is not None and self.examples.domain == self.somMap.examples.domain: 
    10681125                self.scene.setHistogramData(self.examples) 
     1126                attr = self.examples.domain.variables[self.attribute] 
    10691127            else: 
    10701128                self.scene.setHistogramData(self.somMap.examples) 
     1129                attr = self.somMap.examples.domain.variables[self.attribute] 
    10711130                 
    1072             attr = self.somMap.examples.domain.variables[self.attribute] 
    10731131            if attr.varType == orange.VarTypes.Discrete: 
    10741132                hist = [PieChart, MajorityChart, MajorityProbChart] 
    10751133                hist = hist[self.discHistMode] 
    1076                 visible, schema = True, None  
     1134                visible, schema = True, None 
    10771135            else: 
    10781136                hist = [ContChart, AverageValue] 
    10791137                hist = hist[self.contHistMode] 
    10801138                visible = self.contHistMode == 1 
    1081                 schema = ColorPalette([(255, 0, 0), (0, 255, 0)]) if self.contHistMode == 1 else None 
     1139                schema = ColorPalette([(0, 255, 0), (255, 0, 0)]) if self.contHistMode == 1 else None 
    10821140                 
    10831141            def partial__init__(self, *args, **kwargs): 
     
    11311189         
    11321190        self.targetValue = 0 
    1133         self.scene.component = 0 
    11341191        self.attribute = 0 
     1192        self.component = 0 
    11351193        for v in somMap.examples.domain.attributes: 
    11361194            self.componentCombo.addItem(v.name) 
     
    11391197 
    11401198        self.openContext("", somMap.examples) 
     1199        self.component = min(self.component, len(somMap.examples.domain.attributes) - 1) 
    11411200        self.setDiscCont() 
    11421201        self.scene.setSom(somMap) 
     
    11651224         
    11661225    def invertSelection(self): 
    1167         for widget in self.scene.somWidgets(): 
    1168             for node in widget.somItem.nodes(): 
    1169                 node.setSelected(not node.isSelected()) 
     1226        self._invertingSelection = True 
     1227        try: 
     1228            for widget in self.scene.somWidgets(): 
     1229                for node in widget.somItem.nodes(): 
     1230                    node.setSelected(not node.isSelected()) 
     1231        finally: 
     1232            del self._invertingSelection 
     1233            self.commitIf() 
    11701234     
    11711235    def updateSelection(self, nodeList): 
     
    11741238         
    11751239    def commitIf(self): 
    1176         if self.commitOnChange: 
     1240        if self.commitOnChange and not getattr(self, "_invertingSelection", False): 
    11771241            self.commit() 
    11781242        else: 
     
    11831247            return 
    11841248        ex = orange.ExampleTable(self.somMap.examples.domain) 
    1185 #        for n in self.selectionList: 
    1186 #            if self.inputSet == 0 and n.examples: 
    1187 #                ex.extend(n.examples) 
    1188 #            elif self.inputSet == 1 and getattr(n, "mappedExamples", False): 
    1189 #                ex.extend(n.mappedExamples) 
     1249         
    11901250        for n in self.scene.selectedItems(): 
    11911251            if isinstance(n, GraphicsSOMItem) and n.node and hasattr(n.node, "mappedExamples"): 
     
    12041264if __name__=="__main__": 
    12051265    ap = QApplication(sys.argv) 
    1206     data = orange.ExampleTable("../../doc/datasets/iris.tab") 
     1266    data = orange.ExampleTable("../../doc/datasets/housing.tab") 
    12071267#    l=orngSOM.SOMLearner(batch_train=False) 
    12081268    l = orngSOM.SOMLearner(batch_train=True, initialize=orngSOM.InitializeLinear) 
Note: See TracChangeset for help on using the changeset viewer.