Changeset 4936:787935be4ca6 in orange
- Timestamp:
- 07/06/08 16:23:10 (5 years ago)
- Branch:
- default
- Convert:
- ed8fda1db7f1fcbdced6d031b42ce9794436d159
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
orange/OrangeWidgets/Evaluate/OWConfusionMatrix.py
r4795 r4936 13 13 from operator import add 14 14 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 = isBold23 24 def alignment(self):25 return QWidget.AlignCenter26 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 sze35 36 15 class OWConfusionMatrix(OWWidget): 37 16 settings = ["shownQuantity", "autoApply", "appendPredictions", "appendProbabilities"] … … 53 32 54 33 self.learnerList = OWGUI.listBox(self.controlArea, self, "selectedLearner", "learnerNames", box = "Learners", callback = self.learnerChanged) 55 self.learnerList.setMinimumHeight( 200)34 self.learnerList.setMinimumHeight(100) 56 35 OWGUI.separator(self.controlArea) 57 36 … … 68 47 applyButton = OWGUI.button(box, self, "Commit", callback = self.sendData) 69 48 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) 71 50 72 51 import sip 73 52 sip.delete(self.mainArea.layout()) 74 53 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) 85 57 self.table = OWGUI.table(self.mainArea, rows = 0, columns = 0, selectionMode = QTableWidget.MultiSelection, addToLayout = 0) 86 58 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 101 65 102 66 def setTestResults(self, res): … … 111 75 dim = len(res.classValues) 112 76 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 124 96 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] 129 99 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 133 102 134 103 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 135 112 cm = self.matrix[self.selectedLearner[0]] 136 113 114 self.isInteger = " %i " 137 115 for r in reduce(add, cm): 138 116 if int(r) != r: 139 117 self.isInteger = " %5.3f " 140 118 break 141 else:142 self.isInteger = " %i "143 119 144 120 self.reprint() … … 153 129 colSums = [sum([r[i] for r in cm]) for i in range(dim)] 154 130 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] 157 138 158 139 for ri, r in enumerate(cm): 159 140 for ci, c in enumerate(r): 160 item = self.table.item(ri +1, ci+1)141 item = self.table.item(ri, ci) 161 142 if self.shownQuantity == 0: 162 143 item.setText(self.isInteger % c) … … 164 145 item.setText((self.isInteger + "/ %5.3f ") % (c, total*rowPriors[ri]*colPriors[ci])) 165 146 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"+" ") 170 148 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() 187 157 188 158 … … 191 161 return 192 162 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 200 169 self.sendIf() 170 201 171 202 172 def selectWrong(self): … … 204 174 return 205 175 176 sa = self.autoApply 177 self.autoApply = False 206 178 self.table.clearSelection() 207 179 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 220 184 self.sendIf() 221 185 … … 223 187 def selectNone(self): 224 188 self.table.clearSelection() 225 # clearSelection for some reason calls the callback, while add doesn't226 189 227 190 … … 236 199 self.selectionDirty = False 237 200 201 selected = [(x.row(), x.column()) for x in self.table.selectedIndexes()] 238 202 res = self.res 239 if not res or not sel f.table.numSelections():203 if not res or not selected: 240 204 self.send("Selected Examples", None) 241 205 return 242 243 from sets import Set244 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))250 206 251 207 learnerI = self.selectedLearner[0] … … 275 231 ex[id] = p 276 232 277 # print predictionsId, probIds278 279 233 self.send("Selected Examples", data) 280 234
Note: See TracChangeset
for help on using the changeset viewer.
