📄 owcn2rulesviewer.py
字号:
"""
<name>CN2 Rules Viewer</name>
<description>Viewer of classification rules.</description>
<icon>CN2RulesViewer.png</icon>
<contact>Ales Erjavec (ales.erjavec(@at@)fri.uni-lj.si)</contact>
<priority>2120</priority>
"""
import orange
import orngCN2
from OWWidget import *
import OWGUI
import OWGraphTools
import qt
from qtcanvas import *
import sys
import re
class MyCanvasView(QCanvasView):
def __init__(self, parent, *arg):
apply(QCanvasView.__init__,(self,)+arg)
self.parent=parent
self.buttonPressed=False
self.brush=QBrush(QColor("lightGray").light(112))
self.lastIndex=-1
self.flag=False
def contentsMouseMoveEvent(self,e):
self.flag=True
if self.buttonPressed:
obj=self.canvas().collisions(e.pos())
if obj and obj[-1].__class__==QCanvasRectangle and obj[-1].index!=self.lastIndex:
self.addSelection(obj[-1])
self.parent.select()
self.lastIndex=obj[-1].index
def contentsMousePressEvent(self,e):
self.buttonPressed=True
self.lastIndex=-1
if not self.parent.ctrlPressed:
self.parent.selRect=[]
for r in self.parent.rectObj:
r.setBrush(QBrush(Qt.NoBrush))
def contentsMouseReleaseEvent(self,e):
self.flag=False
obj=self.canvas().collisions(e.pos())
if obj and obj[-1].__class__==QCanvasRectangle and obj[-1].index!=self.lastIndex:
self.addSelection(obj[-1])
self.parent.select()
self.buttonPressed=False
def addSelection(self, rect):
index=rect.index
if (not self.buttonPressed and not self.flag) and not self.parent.ctrlPressed:
self.parent.selRect=[]
for r in self.parent.rectObj:
r.setBrush(QBrush(Qt.NoBrush))
if rect in self.parent.selRect:
self.parent.selRect.remove(rect)
rect.setBrush(QBrush(Qt.NoBrush))
else:
self.parent.selRect.append(rect)
rect.setBrush(self.brush)
self.parent.canvas.update()
class OWCN2RulesViewer(OWWidget):
settingsList=["RuleLen","RuleQ","Coverage","Commit","Rule","Sort","Dist","DistBar","Class"]
callbackDeposit=[]
def __init__(self, parent=None, signalManager=None):
OWWidget.__init__(self, parent, signalManager,"CN2 Rules Viewer")
self.inputs=[("Unordered CN2 Classifier", orngCN2.CN2UnorderedClassifier, self.data)]
self.outputs=[("Examples", ExampleTable), ("Classified Examples", ExampleTableWithClass), ("Attribute List", AttributeList)]
self.RuleLen=1
self.RuleQ=1
self.Coverage=1
self.Class=1
self.Dist=1
self.DistBar=1
self.Commit=1
self.SelectedAttrOnly=0
self.Rule=1
self.Sort=0
self.loadSettings()
layout=QVBoxLayout(self.mainArea, QVBoxLayout.TopToBottom,0)
self.canvas=QCanvas()
self.canvasView=MyCanvasView(self, self.canvas, self.mainArea)
self.canvasView.setCanvas(self.canvas)
self.canvasView.show()
self.headerCanvas=QCanvas()
self.headerView=QCanvasView(self.headerCanvas, self.mainArea)
self.headerView.setMaximumHeight(25)
self.headerView.setHScrollBarMode(QScrollView.AlwaysOff)
self.headerView.setVScrollBarMode(QScrollView.AlwaysOff)
layout.addWidget(self.headerView)
layout.addWidget(self.canvasView)
box=OWGUI.widgetBox(self.controlArea,"Show info")
box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
OWGUI.checkBox(box,self,"RuleLen","Rule length",callback=self.drawRules)
OWGUI.checkBox(box,self,"RuleQ","Rule quality",callback=self.drawRules)
OWGUI.checkBox(box,self,"Coverage","Coverage",callback=self.drawRules)
OWGUI.checkBox(box,self,"Class","Predicted class", callback=self.drawRules)
OWGUI.checkBox(box,self,"Dist","Distribution", callback=self.drawRules)
OWGUI.checkBox(box,self,"DistBar","Distribution(Bar)",callback=self.drawRules)
OWGUI.separator(self.controlArea)
box=OWGUI.widgetBox(self.controlArea,"Sorting")
box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
self.sortBox=OWGUI.comboBox(box, self, "Sort",
items=["No sorting", "Rule length", "Rule quality", "Coverage", "Predicted class",
"Distribution","Rule"]
,callback=self.drawRules)
OWGUI.separator(self.controlArea)
box=OWGUI.widgetBox(self.controlArea,"Output")
box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
OWGUI.checkBox(box,self,"Commit", "Commit on change")
OWGUI.checkBox(box,self,"SelectedAttrOnly","Selected attributes only")
OWGUI.button(box,self,"&Commit",callback=self.commit)
QVBox(self.controlArea)
OWGUI.button(self.controlArea,self,"&Save rules to file",callback=self.saveRules)
self.examples=None
self.obj=[]
self.selRect=[]
self.rectObj=[]
self.ctrlPressed=False
self.setFocusPolicy(QWidget.StrongFocus)
self.connect(self.canvasView.horizontalScrollBar(),SIGNAL("valueChanged(int)"),
self.headerView.horizontalScrollBar().setValue)
def clear(self):
for e in self.obj:
e.setCanvas(None)
self.obj=[]
self.selRect=[]
def showRules(self):
self.clear()
text=[]
items=[]
for i, r in enumerate(self.rules):
l=[i,str(int(float(r.complexity))), "%.3f" % r.quality, "%.1f"%r.classDistribution.abs, #str(len(self.classifier.examples.filterref(r.filter))),
str(r.classifier.defaultValue), self.distText(r), self.ruleText(r),r]
text.append(l)
self.distText(r)
self.text=text
#self.items=items
self.drawRules()
def drawRules(self):
self.oldSelection=[r.rule for r in self.selRect]
self.sort()
self.clear()
for r in self.rectObj:
r.setCanvas(None)
self.rectObj=[]
text=self.text
filter=[self.RuleLen, self.RuleQ, self.Coverage, self.Class, self.Dist or self.DistBar,self.Rule]
l=[]
#a=["Length","Quality","Coverage","Class","Distribution", "Distribution(Bar)", "Rule"]
a=["Length","Quality","Coverage","Class","Distribution", "Rule"]
for i, k in enumerate(a):
if filter[i]:
t=QCanvasText(self.headerCanvas)
t.setText(k)
l.append(t)
l.append(QCanvasText(self.canvas))
items=[]
items.append(l)
self.obj.extend(l)
for text in self.text:
l=[]
if self.RuleLen:
t=QCanvasText(self.canvas)
t.setText(text[1])
l.append(t)
if self.RuleQ:
t=QCanvasText(self.canvas)
t.setText(text[2])
l.append(t)
if self.Coverage:
t=QCanvasText(self.canvas)
t.setText(text[3])
l.append(t)
if self.Class:
t=QCanvasText(self.canvas)
t.setText(text[4])
l.append(t)
if self.Dist and not self.DistBar:
t=QCanvasText(self.canvas)
t.setText(text[5])
l.append(t)
if self.DistBar:
t=DistBar(text[5],self.Dist,self.canvas)
l.append(t)
if self.Rule:
t=QCanvasText(self.canvas)
t.setText(text[6])#self.ruleText(text[-1]))
l.append(t)
l.append(QCanvasText(self.canvas))
self.obj.extend(l)
items.append(l)
#print len(items)
textMapV=[10]+map(lambda s:max([t.boundingRect().height()+10 for t in s]), items[1:])
textMapH=[[s[i].boundingRect().width()+10 for s in items] for i in range(len(items[0]))]
textMapH=[10]+map(lambda s:max(s), textMapH)
#print len(textMapV)
for i in range(1,len(textMapV)):
textMapV[i]+=textMapV[i-1]
for i in range(1,len(textMapH)):
textMapH[i]+=textMapH[i-1]
self.ctrlPressed=True
for i in range(1,len(textMapV)):
for j in range(len(textMapH)-2):
if items[i][j].__class__==DistBar:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -