Changeset 4936:787935be4ca6 in orange


Ignore:
Timestamp:
07/06/08 16:23:10 (6 years ago)
Author:
janezd <janez.demsar@…>
Branch:
default
Convert:
ed8fda1db7f1fcbdced6d031b42ce9794436d159
Message:
  • ported to Qt 4.0, added individual selections
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Evaluate/OWConfusionMatrix.py

    r4795 r4936  
    1313from operator import add 
    1414 
    15 class ConfusionTable(QTableWidget): 
    16     def paintEmptyArea(self, p, cx, cy, cw, ch): 
    17         pass#p.fillRect(cx, cy, cw, ch, QBrush(QColor(255, 0, 0))) 
    18  
    19 class ConfusionTableItem(QTableWidgetItem): 
    20     def __init__(self, isBold, *args): 
    21         QTableWidgetItem.__init__(self, *args) 
    22         self.isBold = isBold 
    23  
    24     def alignment(self): 
    25         return QWidget.AlignCenter 
    26  
    27     def paint(self, painter, cg, cr, selected): 
    28         painter.font().setBold(self.isBold) 
    29         QTableWidgetItem.paint(self, painter, cg, cr, selected) 
    30  
    31     def sizeHint(self): 
    32         sze = QTableWidgetItem.sizeHint(self) 
    33         sze.setWidth(sze.width()*1.15) 
    34         return sze 
    35  
    3615class OWConfusionMatrix(OWWidget): 
    3716    settings = ["shownQuantity", "autoApply", "appendPredictions", "appendProbabilities"] 
     
    5332 
    5433        self.learnerList = OWGUI.listBox(self.controlArea, self, "selectedLearner", "learnerNames", box = "Learners", callback = self.learnerChanged) 
    55         self.learnerList.setMinimumHeight(200) 
     34        self.learnerList.setMinimumHeight(100) 
    5635        OWGUI.separator(self.controlArea) 
    5736 
     
    6847        applyButton = OWGUI.button(box, self, "Commit", callback = self.sendData) 
    6948        autoApplyCB = OWGUI.checkBox(box, self, "autoApply", "Commit automatically") 
    70         OWGUI.setStopper(self, applyButton, autoApplyCB, "dataChanged", self.sendData) 
     49        OWGUI.setStopper(self, applyButton, autoApplyCB, "selectionDirty", self.sendData) 
    7150 
    7251        import sip 
    7352        sip.delete(self.mainArea.layout()) 
    7453        self.layout = QGridLayout(self.mainArea) 
    75         labpred = OWGUI.widgetLabel(self.mainArea, "Prediction") 
    76         self.layout.addWidget(labpred, 0, 1, Qt.AlignCenter) 
    77         self.layout.addWidget(OWGUI.separator(self.mainArea),1, 0) 
    78  
    79         labpred = OWGUI.widgetLabel(self.mainArea, "Correct Class  ") 
    80         self.layout.addWidget(labpred, 2, 0, Qt.AlignCenter) 
    81         #self.layout.addWidget(OWGUI.rubber(self.mainArea), 3, 3, 1, 1) 
    82         self.layout.setColumnStretch(3, 100) 
    83         self.layout.setRowStretch(3, 100) 
    84  
     54 
     55        self.layout.addWidget(OWGUI.widgetLabel(self.mainArea, "Prediction"), 0, 1, Qt.AlignCenter) 
     56        self.layout.addWidget(OWGUI.widgetLabel(self.mainArea, "Correct Class  "), 2, 0, Qt.AlignCenter) 
    8557        self.table = OWGUI.table(self.mainArea, rows = 0, columns = 0, selectionMode = QTableWidget.MultiSelection, addToLayout = 0) 
    8658        self.layout.addWidget(self.table, 2, 1) 
    87         #self.table.setLeftMargin(0) 
    88         #self.table.setTopMargin(0) 
    89         self.table.verticalHeader().hide() 
    90         self.table.horizontalHeader().hide() 
    91         self.table.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) 
    92  
    93         self.connect(self.table, SIGNAL("selectionChanged()"), self.sendIf) 
    94  
    95         self.resize(550,450) 
    96  
    97     def resizeEvent(self, *args): 
    98         if hasattr(self, "table"): 
    99             self.table.adjustSize() 
    100         OWWidget.resizeEvent(self, *args) 
     59        self.layout.setColumnStretch(1, 100) 
     60        self.layout.setRowStretch(2, 100) 
     61        self.connect(self.table, SIGNAL("itemSelectionChanged()"), self.sendIf) 
     62 
     63        self.resize(700,450) 
     64 
    10165 
    10266    def setTestResults(self, res): 
     
    11175        dim = len(res.classValues) 
    11276 
    113         self.table.setRowCount(dim+2) 
    114         self.table.setColumnCount(dim+2) 
    115  
    116         for ri in range(dim+2): 
    117             for ci in range(dim+2): 
    118                 self.table.setItem(ri, ci, ConfusionTableItem(not ri or not ci or ri==dim+1 or ci==dim+1, self.table, QTableWidgetItem.Never, "")) 
    119  
    120         for ri, cv in enumerate(res.classValues): 
    121             self.table.item(0, ri+1).setText(cv) 
    122             self.table.item(ri+1, 0).setText(cv) 
    123  
     77        self.table.setRowCount(dim+1) 
     78        self.table.setColumnCount(dim+1) 
     79 
     80        self.table.setHorizontalHeaderLabels(res.classValues+[""]) 
     81        self.table.setVerticalHeaderLabels(res.classValues+[""]) 
     82 
     83        for ri in range(dim+1): 
     84            for ci in range(dim+1): 
     85                it = QTableWidgetItem() 
     86                it.setFlags(Qt.ItemIsEnabled | (ri<dim and ci<dim and Qt.ItemIsSelectable or Qt.NoItemFlags)) 
     87                it.setTextAlignment(Qt.AlignRight) 
     88                self.table.setItem(ri, ci, it) 
     89 
     90        boldf = self.table.item(0, dim).font() 
     91        boldf.setBold(True) 
     92        for ri in range(dim+1): 
     93            self.table.item(ri, dim).setFont(boldf) 
     94            self.table.item(dim, ri).setFont(boldf) 
     95             
    12496        self.learnerNames = res.classifierNames[:] 
    125  
    126         # This also triggers a callback (learnerChanged) 
    127         # This USED TO trigger a callback! Not any more, though. 
    128         self.selectedLearner = [self.selectedLearner[0] < res.numberOfLearners and self.selectedLearner[0]] 
     97        if not self.selectedLearner and self.res.numberOfLearners: 
     98            self.selectedLearner = [0] 
    12999        self.learnerChanged() 
    130  
    131         self.table.clearSelection() 
    132         # if the above doesn't call sendIf, you should call it here 
     100        self.table.clearSelection() 
     101 
    133102 
    134103    def learnerChanged(self): 
     104        if not self.res.numberOfLearners: 
     105            return 
     106         
     107        if self.selectedLearner and self.selectedLearner[0] > self.res.numberOfLearners: 
     108            self.selectedLearner = [0] 
     109        if not self.selectedLearner: 
     110            return 
     111         
    135112        cm = self.matrix[self.selectedLearner[0]] 
    136113         
     114        self.isInteger = " %i " 
    137115        for r in reduce(add, cm): 
    138116            if int(r) != r: 
    139117                self.isInteger = " %5.3f " 
    140118                break 
    141         else: 
    142             self.isInteger = " %i " 
    143119 
    144120        self.reprint() 
     
    153129        colSums = [sum([r[i] for r in cm]) for i in range(dim)] 
    154130        total = sum(rowSums) 
    155         rowPriors = [r/total for r in rowSums] 
    156         colPriors = [r/total for r in colSums] 
     131        if self.shownQuantity == 1: 
     132            if total > 1e-5: 
     133                rowPriors = [r/total for r in rowSums] 
     134                colPriors = [r/total for r in colSums] 
     135            else: 
     136                rowPriors = [0 for r in rowSums] 
     137                colPriors = [0 for r in colSums] 
    157138 
    158139        for ri, r in enumerate(cm): 
    159140            for ci, c in enumerate(r): 
    160                 item = self.table.item(ri+1, ci+1) 
     141                item = self.table.item(ri, ci) 
    161142                if self.shownQuantity == 0: 
    162143                    item.setText(self.isInteger % c) 
     
    164145                    item.setText((self.isInteger + "/ %5.3f ") % (c, total*rowPriors[ri]*colPriors[ci])) 
    165146                elif self.shownQuantity == 2: 
    166                     if colSums[ci] > 1e-5: 
    167                         item.setText(" %2.1f %%  " % (100 * c / colSums[ci])) 
    168                     else: 
    169                         item.setText(" N/A ") 
     147                    item.setText(colSums[ci] > 1e-5 and (" %2.1f %%  " % (100 * c / colSums[ci])) or " "+"N/A"+" ") 
    170148                elif self.shownQuantity == 3: 
    171                     if rowSums[ri] > 1e-5: 
    172                         item.setText(" %2.1f %%  " % (100 * c / rowSums[ri])) 
    173                     else: 
    174                         item.setText(" N/A ") 
    175                 self.table.updateCell(ri, ci) 
    176  
    177         for ci in range(len(cm)): 
    178             self.table.setText(dim+1, ci+1, self.isInteger % colSums[ci]) 
    179             self.table.setText(ci+1, dim+1, self.isInteger % rowSums[ci]) 
    180         self.table.setText(dim+1, dim+1, self.isInteger % total) 
    181  
    182         for ci in range(len(cm)+2): 
    183             self.table.adjustColumn(ci) 
    184  
    185         self.table.adjustSize() 
    186  
     149                    item.setText(rowSums[ri] > 1e-5 and (" %2.1f %%  " % (100 * c / rowSums[ri])) or " "+"N/A"+" ") 
     150 
     151        for ci in range(dim): 
     152            self.table.item(dim, ci).setText(self.isInteger % colSums[ci]) 
     153            self.table.item(ci, dim).setText(self.isInteger % rowSums[ci]) 
     154        self.table.item(dim, dim).setText(self.isInteger % total) 
     155 
     156        self.table.resizeColumnsToContents() 
    187157 
    188158 
     
    191161            return 
    192162 
    193         self.table.clearSelection() 
    194         for i in range(1, 1+len(self.matrix[0])): 
    195             ts = QTableSelection() 
    196             ts.init(i, i) 
    197             ts.expandTo(i, i) 
    198             self.table.addSelection(ts) 
    199         self.table.setCurrentCell(0, 0) 
     163        sa = self.autoApply 
     164        self.autoApply = False 
     165        self.table.clearSelection() 
     166        for i in range(len(self.matrix[0])): 
     167            self.table.setRangeSelected(QTableWidgetSelectionRange(i, i, i, i), True) 
     168        self.autoApply = sa 
    200169        self.sendIf() 
     170 
    201171 
    202172    def selectWrong(self): 
     
    204174            return 
    205175 
     176        sa = self.autoApply 
     177        self.autoApply = False 
    206178        self.table.clearSelection() 
    207179        dim = len(self.matrix[0]) 
    208         for i in range(1, 1+dim): 
    209             if i!=1: 
    210                 ts = QTableSelection() 
    211                 ts.init(i, 1) 
    212                 ts.expandTo(i, i-1) 
    213                 self.table.addSelection(ts) 
    214             if i < dim: 
    215                 ts = QTableSelection() 
    216                 ts.init(i, i+1) 
    217                 ts.expandTo(i, dim) 
    218                 self.table.addSelection(ts) 
    219         self.table.setCurrentCell(0, 0) 
     180        self.table.setRangeSelected(QTableWidgetSelectionRange(0, 0, dim-1, dim-1), True) 
     181        for i in range(len(self.matrix[0])): 
     182            self.table.setRangeSelected(QTableWidgetSelectionRange(i, i, i, i), False) 
     183        self.autoApply = sa 
    220184        self.sendIf() 
    221185 
     
    223187    def selectNone(self): 
    224188        self.table.clearSelection() 
    225         # clearSelection for some reason calls the callback, while add doesn't 
    226189 
    227190 
     
    236199        self.selectionDirty = False 
    237200 
     201        selected = [(x.row(), x.column()) for x in self.table.selectedIndexes()] 
    238202        res = self.res 
    239         if not res or not self.table.numSelections(): 
     203        if not res or not selected: 
    240204            self.send("Selected Examples", None) 
    241205            return 
    242  
    243         from sets import Set 
    244         selected = Set() 
    245         for seli in range(self.table.numSelections()): 
    246             sel = self.table.selection(seli) 
    247             for ri in range(sel.topRow(), sel.bottomRow()+1): 
    248                 for ci in range(sel.leftCol(), sel.rightCol()+1): 
    249                     selected.add((ri-1, ci-1)) 
    250206 
    251207        learnerI = self.selectedLearner[0] 
     
    275231                        ex[id] = p 
    276232     
    277 #            print predictionsId, probIds 
    278  
    279233        self.send("Selected Examples", data) 
    280234 
Note: See TracChangeset for help on using the changeset viewer.