Changeset 9066:56d5c357c567 in orange


Ignore:
Timestamp:
10/06/11 13:33:21 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
3fd611ca0a362a67abb99a9a124ea21b1518d324
Message:

MDS Qt can now show data subsets, stress by symbol size ...
Some bug fixes in both the old MDS and MDS Qt.
Fixes #975.

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

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

    r9053 r9066  
    3434                                                  ContextField("graph.NameAttr", DomainContextHandler.Optional), 
    3535                                                  ContextField("graph.ShowName", DomainContextHandler.Optional)])} 
    36     callbackDeposit=[] 
     36     
    3737    def __init__(self, parent=None, signalManager=None, name="Multi Dimensional Scaling"): 
    3838        OWWidget.__init__(self, parent, signalManager, name, wantGraph=True) 
     
    4141 
    4242        self.StressFunc=3 
    43         self.minStressDelta=1e-5 
     43        self.minStressDelta=5e-5 
    4444        self.maxIterations=5000 
    4545        self.maxImprovment=10 
     
    8282         
    8383        self.stopping=OWGUI.widgetBox(opt, "Stopping Conditions") 
    84         OWGUI.qwtHSlider(self.stopping, self, "minStressDelta", label="Min. stress change", minValue=0, maxValue=1e-2, step=1e-5, precision=6) 
    85         OWGUI.qwtHSlider(self.stopping, self, "maxIterations", label="Max. number of steps", minValue=10, maxValue=5000, step=10, precision=0) 
     84         
     85        OWGUI.hSlider(OWGUI.widgetBox(self.stopping, "Min. stress change", flat=True), 
     86                      self, "minStressDelta", minValue=5e-5, maxValue=1e-2, step=5e-5,  
     87                      labelFormat="%.5f", intOnly=0) 
     88        OWGUI.hSlider(OWGUI.widgetBox(self.stopping, "Max. number of steps", flat=True),  
     89                      self, "maxIterations", minValue=10, maxValue=5000, step=10,  
     90                      labelFormat="%i") 
    8691 
    8792        ##Graph Tab         
     
    99104        sl = OWGUI.hSlider(b2, self, "graph.proportionGraphed", minValue=0, maxValue=20, callback=self.graph.updateLinesRepaint, tooltip="Proportion of connected pairs (Maximum of 1000 lines will be drawn") 
    100105        OWGUI.checkBox(box, self, "graph.differentWidths", "Show distance by line width", callback = self.graph.updateLinesRepaint) 
    101         OWGUI.checkBox(box, self, "graph.stressByTransparency", "Show stress by transparency", callback = self.graph.updateLinesRepaint) 
     106        OWGUI.checkBox(box, self, "graph.stressByTransparency", "Show stress by transparency", callback = self.graph.updateData) 
    102107        OWGUI.checkBox(box, self, "graph.stressBySize", "Show stress by symbol size", callback = self.updateStressBySize) 
    103108        self.updateStressBySize(True) 
     
    304309        self.sizeCombo.setDisabled(self.graph.stressBySize) 
    305310        if not noRepaint: 
    306             self.graph.updateLinesRepaint() 
     311            self.graph.updateData() 
    307312         
    308313    def smacofStep(self): 
     
    356361        if not getattr(self, "mds", None): 
    357362            return 
    358         mi = numpy.argmin(self.mds.points,0) 
    359         ma = numpy.argmax(self.mds.points,0) 
    360         st = 0.01*(ma-mi) 
     363        mi = numpy.min(self.mds.points, axis=0) 
     364        ma = numpy.max(self.mds.points, axis=0) 
     365        st = 0.05 * (ma - mi) 
    361366        for i in range(self.mds.n): 
    362367            for j in range(2): 
    363                 self.mds.points[i][j] += st[j]*(random()-0.5) 
     368                self.mds.points[i][j] += st[j]*(random() - 0.5) 
    364369        if self.computeStress: 
    365370            self.mds.getStress(self.stressFunc[self.StressFunc][1]) 
     
    588593                                QwtSymbol.Cross, 
    589594                                QwtSymbol.XCross ] 
     595         
     596        self.axis_margin = 10 
    590597 
    591598    def setData(self, mds, colors, sizes, shapes, names, showFilled): 
  • orange/OrangeWidgets/Visualize Qt/OWMDSQt.py

    r9052 r9066  
    3535                                                  ContextField("graph.NameAttr", DomainContextHandler.Optional), 
    3636                                                  ContextField("graph.ShowName", DomainContextHandler.Optional)])} 
    37     callbackDeposit=[] 
     37     
    3838    def __init__(self, parent=None, signalManager=None, name="Multi Dimensional Scaling"): 
    3939        OWWidget.__init__(self, parent, signalManager, name, wantGraph=True) 
     
    4242 
    4343        self.StressFunc=3 
    44         self.minStressDelta=1e-5 
     44        self.minStressDelta=5e-5 
    4545        self.maxIterations=5000 
    4646        self.maxImprovment=10 
     
    8383         
    8484        self.stopping=OWGUI.widgetBox(opt, "Stopping Conditions") 
    85         OWGUI.qwtHSlider(self.stopping, self, "minStressDelta", label="Min. stress change", minValue=0, maxValue=1e-2, step=1e-5, precision=6) 
    86         OWGUI.qwtHSlider(self.stopping, self, "maxIterations", label="Max. number of steps", minValue=10, maxValue=5000, step=10, precision=0) 
     85        OWGUI.hSlider(OWGUI.widgetBox(self.stopping, "Min. stress change", flat=True), 
     86                      self, "minStressDelta", minValue=5e-5, maxValue=1e-2, step=5e-5,  
     87                      labelFormat="%.5f", intOnly=0) 
     88        OWGUI.hSlider(OWGUI.widgetBox(self.stopping, "Max. number of steps", flat=True),  
     89                      self, "maxIterations", minValue=10, maxValue=5000, step=10,  
     90                      labelFormat="%i") 
    8791 
    8892        ##Graph Tab         
     
    100104        sl = OWGUI.hSlider(b2, self, "graph.proportionGraphed", minValue=0, maxValue=20, callback=self.graph.updateLinesRepaint, tooltip="Proportion of connected pairs (Maximum of 1000 lines will be drawn") 
    101105        OWGUI.checkBox(box, self, "graph.differentWidths", "Show distance by line width", callback = self.graph.updateLinesRepaint) 
    102         OWGUI.checkBox(box, self, "graph.stressByTransparency", "Show stress by transparency", callback = self.graph.updateLinesRepaint) 
     106        OWGUI.checkBox(box, self, "graph.stressByTransparency", "Show stress by transparency", callback = self.graph.updateData) 
    103107        OWGUI.checkBox(box, self, "graph.stressBySize", "Show stress by symbol size", callback = self.updateStressBySize) 
    104108        self.updateStressBySize(True) 
     
    116120        graph.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) 
    117121        self.controlArea.setMinimumWidth(250) 
     122         
    118123        OWGUI.rubber(mds) 
     124        OWGUI.rubber(self.controlArea) 
     125         
    119126        infoBox=OWGUI.widgetBox(mds, "Info") 
    120127        self.infoA=OWGUI.widgetLabel(infoBox, "Avg. stress:") 
     
    160167 
    161168    def cselected(self, selected=[]): 
    162         self.selectedInputExamples=selected and selected or[] 
     169        self.selectedInputExamples=selected or [] 
    163170        if self.data and type(self.data)==orange.ExampleTable: 
    164171            self.setExampleTable(self.data) 
     
    199206        self.colors=[[Qt.black]*(len(attributes)+1) for i in range(len(data))] 
    200207        self.shapes=[[OWPoint.Ellipse]*(len(discAttributes)+1) for i in range(len(data))] 
    201         self.sizes=[[5]*(len(contAttributes)+1) for i in range(len(data))] 
     208        self.sizes=[[1.0]*(len(contAttributes)+1) for i in range(len(data))] 
    202209        self.names=[[""]*(len(attributes)+1) for i in range(len(data))] 
    203210        try: 
    204211            selectedInput=self.selectedInputExamples.select(data.domain) 
    205         except: 
     212        except Exception: 
    206213            selectedInput=[] 
    207         self.selectedInput=map(lambda d: selectedInput and (d in selectedInput) or not selectedInput, data) 
     214        self.selectedInput=map(lambda d: selectedInput and (d in selectedInput), data) 
    208215        contI=discI=attrI=1 
    209216        def check(ex, a): 
     
    231238                minVal=min(val or [0]) 
    232239                maxVal=max(val or [1]) 
     240                span = max(maxVal - minVal, 1e-6) 
    233241                for i in range(len(data)): 
    234                     self.colors[i][attrI]=check(data[i],attr) and c.getColor((data[i][attr]-minVal)/max(maxVal-minVal, 1e-6)) or Qt.black  
     242                    self.colors[i][attrI]=check(data[i],attr) and c.getColor((data[i][attr] - minVal)/span) or Qt.black  
    235243                    #self.shapes[i][discI]=self.graph.shapeList[0] 
    236244                    self.names[i][attrI]=check(data[i],attr) and " "+str(data[i][attr]) or "" 
    237                     self.sizes[i][contI]=check(data[i],attr) and int(self.data[i][attr]/maxVal*9)+1 or 5 
     245                    self.sizes[i][contI]=check(data[i],attr) and (float(self.data[i][attr]) - minVal) / span or 1.0 
    238246                contI+=1 
    239247                attrI+=1 
     
    263271        self.colors=[[Qt.black]*3 for i in range(len(data))] 
    264272        self.shapes=[[OWPoint.Ellipse] for i in range(len(data))] 
    265         self.sizes=[[5] for i in range(len(data))] 
     273        self.sizes=[[1.0] for i in range(len(data))] 
    266274        self.selectedInput=[False]*len(data) 
    267275 
     
    291299        self.colors=[[Qt.black]*3 for i in range(len(data))] 
    292300        self.shapes=[[OWPoint.Ellipse] for i in range(len(data))] 
    293         self.sizes=[[5] for i in range(len(data))] 
     301        self.sizes=[[1.0] for i in range(len(data))] 
    294302        self.names=[[""]*4 for i in range(len(data))] 
    295303        self.selectedInput=[False]*len(data) 
     
    305313        self.sizeCombo.setDisabled(self.graph.stressBySize) 
    306314        if not noRepaint: 
    307             self.graph.updateLinesRepaint() 
     315            self.graph.updateData() 
    308316         
    309317    def smacofStep(self): 
     
    357365        if not getattr(self, "mds", None): 
    358366            return 
    359         mi = numpy.argmin(self.mds.points,0) 
    360         ma = numpy.argmax(self.mds.points,0) 
    361         st = 0.01*(ma-mi) 
     367        mi = numpy.min(self.mds.points, axis=0) 
     368        ma = numpy.max(self.mds.points, axis=0) 
     369        st = 0.05 * (ma - mi) 
    362370        for i in range(self.mds.n): 
    363371            for j in range(2): 
    364                 self.mds.points[i][j] += st[j]*(random()-0.5) 
     372                self.mds.points[i][j] += st[j]*(random() - 0.5) 
    365373        if self.computeStress: 
    366374            self.mds.getStress(self.stressFunc[self.StressFunc][1]) 
     
    588596    def setData(self, mds, colors, sizes, shapes, names, showFilled): 
    589597        self.mds = mds 
    590         #self.data=data 
    591598        self.colors = colors 
    592599        self.sizes = sizes 
    593600        self.shapes = shapes 
    594601        self.names = names 
    595         self.showFilled = showFilled #map(lambda d: not d, showFilled) 
     602        self.showFilled = showFilled 
    596603        self.updateData() 
    597604 
     
    602609            self.updateDistanceLines() 
    603610        self.setPoints() 
    604 #        self.updateAxes() 
    605611        self.replot() 
    606612 
     
    667673        x_data = [p[0] for p in self.mds.points] 
    668674        y_data = [p[1] for p in self.mds.points] 
    669         if self.ShapeAttr != 0: 
    670             shapes = [s[self.ShapeAttr] for s in self.shapes] 
    671         else: 
    672             shapes = [self.shapeList[0]] 
     675         
     676        if self.stressBySize or self.stressByTransparency: 
     677            stresses = map(sum, self.mds.stress) 
     678             
     679            mins, maxs = min(stresses), max(stresses) 
     680            stress_scale = 1. / max(1e-7, maxs - mins) 
     681#            stress_scale = 1. / max(1e-7, maxs - mins) 
    673682             
    674683        if self.ColorAttr != 0: 
    675684            colors = [c[self.ColorAttr] for c in self.colors] 
    676685        else: 
    677             colors = [Qt.black] #QColor(Qt.black) 
     686            colors = [QColor(Qt.black) for _ in self.colors] #QColor(Qt.black) 
    678687             
    679         if self.SizeAttr != 0: 
    680             sizes = [s[self.SizeAttr] for s in self.sizes] 
    681         else: 
    682             sizes = [6] #6 
     688        if self.stressByTransparency: 
     689            for c, s in zip(colors, stresses): 
     690                c.setAlpha(math.floor((1.0 - ((s - mins) * stress_scale)) * 255)) 
     691             
     692        if self.stressBySize: 
     693            sizes = [(s - mins) * stress_scale * self.PointSize for s in stresses] 
     694        elif self.SizeAttr != 0: 
     695            sizes = [s[self.SizeAttr] * self.PointSize for s in self.sizes] 
     696        else: 
     697            sizes = [self.PointSize] 
     698             
     699        if self.ShapeAttr != 0: 
     700            shapes = [s[self.ShapeAttr] for s in self.shapes] 
     701        else: 
     702            shapes = [self.shapeList[0]] 
    683703         
    684704        if self.NameAttr != 0: 
     
    687707            labels = [] 
    688708             
    689         self.set_main_curve_data(x_data, y_data, colors, labels, sizes, shapes) 
     709        self.set_main_curve_data(x_data, y_data, colors, labels, sizes, shapes, self.showFilled) 
    690710         
    691711    def sendData(self, *args): 
     
    709729 
    710730    w.cmatrix(matrix) 
     731    w.cselected(orange.ExampleTable(data[:50])) 
    711732    app.exec_() 
    712  
     733    w.saveSettings() 
     734 
Note: See TracChangeset for help on using the changeset viewer.