📄 owmosaicdisplay.py
字号:
"""
<name>Mosaic Display</name>
<description>Shows a mosaic display.</description>
<contact>Gregor Leban (gregor.leban@fri.uni-lj.si)</contact>
<icon>icons/MosaicDisplay.png</icon>
<priority>4100</priority>
"""
# OWMosaicDisplay.py
#
from OWWidget import *
from qtcanvas import *
import OWGUI
from OWMosaicOptimization import *
from math import sqrt, floor, ceil, pow
import operator
from orngScaleData import getVariableValuesSorted, getVariableValueIndices
from OWQCanvasFuncts import *
from OWGraphTools import *
import OWDlgs
from orngVisFuncts import permutations
from copy import copy
PEARSON = 0
CLASS_DISTRIBUTION = 1
BOTTOM = 0
LEFT = 1
TOP = 2
RIGHT = 3
class SelectionRectangle(QCanvasRectangle):
def rtti(self):
return 123
class MosaicCanvasView(QCanvasView):
def __init__(self, widget, *args):
apply(QCanvasView.__init__,(self,) + args)
self.widget = widget
self.bMouseDown = False
self.mouseDownPosition = QPoint(0,0)
self.tempRect = None
# mouse button was pressed
def contentsMousePressEvent(self, ev):
self.mouseDownPosition = QPoint(ev.pos().x(), ev.pos().y())
self.bMouseDown = True
self.contentsMouseMoveEvent(ev)
# mouse button was pressed and mouse is moving ######################
def contentsMouseMoveEvent(self, ev):
if ev.button() == Qt.RightButton:
return
if self.tempRect:
self.tempRect.setCanvas(None)
self.tempRect = None
if self.bMouseDown:
rect = QRect(min(self.mouseDownPosition.x(), ev.pos().x()), min (self.mouseDownPosition.y(), ev.pos().y()), abs(self.mouseDownPosition.x() - ev.pos().x()), abs(self.mouseDownPosition.y() - ev.pos().y()))
self.tempRect = SelectionRectangle(rect, self.canvas())
self.tempRect.show()
self.canvas().update()
# mouse button was released #########################################
def contentsMouseReleaseEvent(self, ev):
self.bMouseDown = False
if ev.button() == Qt.RightButton:
self.widget.removeLastSelection()
return
if self.tempRect:
self.widget.addSelection(self.tempRect.rect())
self.tempRect.hide()
self.tempRect.setCanvas(None)
self.tempRect = None
self.canvas().update()
class OWMosaicDisplay(OWWidget):
settingsList = ["horizontalDistribution", "showAprioriDistributionLines", "showAprioriDistributionBoxes",
"horizontalDistribution", "useBoxes", "interiorColoring", "boxSize", "colorSettings", "cellspace",
"showSubsetDataBoxes"]
contextHandlers = {"": DomainContextHandler("", ["manualAttributeValuesDict"], loadImperfect = 0)}
def __init__(self,parent=None, signalManager = None):
OWWidget.__init__(self, parent, signalManager, "Mosaic display", TRUE, TRUE)
#set default settings
self.data = None
self.subsetData = None
self.tooltips = []
self.names = [] # class values
self.inputs = [("Examples", ExampleTable, self.cdata, Default), ("Example Subset", ExampleTable, self.subsetdataHander)]
self.outputs = [("Selected Examples", ExampleTableWithClass), ("Learner", orange.Learner)]
#load settings
self.colorSettings = None
self.interiorColoring = 0
self.showAprioriDistributionLines = 1
self.showAprioriDistributionBoxes = 1
self.useBoxes = 1
self.showSubsetDataBoxes = 1
self.horizontalDistribution = 1
self.boxSize = 5
self.attr1 = ""
self.attr2 = ""
self.attr3 = ""
self.attr4 = ""
self.cellspace = 4
self.attributeNameOffset = 30
self.attributeValueOffset = 15
self.residuals = [] # residual values if the residuals are visualized
self.aprioriDistributions = []
self.colorPalette = None
self.permutationDict = {}
self.manualAttributeValuesDict = {}
self.conditionalDict = None
self.conditionalSubsetDict = None
self.updateSelectedData = 0 # do we need to update selected data?
self.activeRule = None
self.selectionRectangle = None
self.selectionConditionsArray = []
self.selectionConditionsDict = {}
self.selectedData = None
#self.blueColors = [QColor(255, 255, 255), QColor(117, 149, 255), QColor(38, 43, 232), QColor(1,5,173)]
self.blueColors = [QColor(255, 255, 255), QColor(210, 210, 255), QColor(110, 110, 255), QColor(0,0,255)]
self.redColors = [QColor(255, 255, 255), QColor(255, 200, 200), QColor(255, 100, 100), QColor(255, 0, 0)]
self.loadSettings()
self.tabs = QTabWidget(self.controlArea, 'tabWidget')
self.GeneralTab = QVGroupBox(self)
self.SettingsTab = QVGroupBox(self)
self.tabs.insertTab(self.GeneralTab, "General")
self.tabs.insertTab(self.SettingsTab, "Settings")
self.box = QVBoxLayout(self.mainArea)
self.canvas = QCanvas(2000, 2000)
self.canvasView = MosaicCanvasView(self, self.canvas, self.mainArea)
self.box.addWidget(self.canvasView)
self.canvasView.show()
self.canvas.resize(self.canvasView.size().width()-5, self.canvasView.size().height()-5)
#GUI
#add controls to self.controlArea widget
self.controlArea.setMinimumWidth(235)
texts = [" 1st Attribute ", " 2nd Attribute ", " 3rd Attribute ", " 4th Attribute "]
for i in range(1,5):
box = OWGUI.widgetBox(self.GeneralTab, texts[i-1], orientation = "horizontal")
box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum , QSizePolicy.Fixed ))
combo = OWGUI.comboBox(box, self, "attr" + str(i), None, callback = self.updateGraphAndPermList, sendSelectedValue = 1, valueType = str)
butt = OWGUI.button(box, self, "", callback = self.orderAttributeValues, tooltip = "Change the order of attribute values", debuggingEnabled = 0)
butt.setMaximumWidth(26); butt.setMaximumHeight(26); butt.setMinimumWidth(24); butt.setMinimumHeight(26)
butt.setToggleButton(1)
butt.setPixmap(QPixmap(os.path.join(self.widgetDir, r"icons\Dlg_sort.png")))
setattr(self, "sort"+str(i), butt)
setattr(self, "attr" + str(i)+ "Combo", combo)
self.optimizationDlg = OWMosaicOptimization(self, self.signalManager)
optimizationButtons = OWGUI.widgetBox(self.GeneralTab, " Optimization Dialog ", orientation = "horizontal")
optimizationButtons.setSizePolicy(QSizePolicy(QSizePolicy.Minimum , QSizePolicy.Fixed ))
OWGUI.button(optimizationButtons, self, "VizRank", callback = self.optimizationDlg.reshow, debuggingEnabled = 0)
box5 = OWGUI.widgetBox(self.GeneralTab, " Colors in Cells Represent... ")
OWGUI.comboBox(box5, self, "interiorColoring", None, items = ["Standardized (Pearson) residuals", "Class distribution"], callback = self.changedInteriorColoring)
box5.setSizePolicy(QSizePolicy(QSizePolicy.Minimum , QSizePolicy.Fixed ))
self.box7 = OWGUI.widgetBox(self.GeneralTab, " Possible permutations ")
self.permButton = OWGUI.button(self.box7, self, "Explore Attribute Permutations", callback = self.permutationListToggle)
self.permButton.setToggleButton(1)
self.permutationList = QListBox(self.box7)
self.connect(self.permutationList, SIGNAL("selectionChanged()"), self.setSelectedPermutation)
self.permutationList.hide()
# ######################
# SETTINGS TAB
# ######################
OWGUI.comboBoxWithCaption(self.SettingsTab, self, "cellspace", "Minimum cell distance: ", box = " Cell Distance ", items = range(1,11), callback = self.updateGraph, sendSelectedValue = 1, valueType = int, tooltip = "What is the minimum distance between two rectangles in the plot?")
self.box6 = OWGUI.widgetBox(self.SettingsTab, " Cell Distribution Settings ")
OWGUI.comboBox(self.box6, self, 'horizontalDistribution', items = ["Show Distribution Vertically", "Show Distribution Horizontally"], tooltip = "Do you wish to see class distribution drawn horizontally or vertically?", callback = self.updateGraph)
OWGUI.checkBox(self.box6, self, 'showAprioriDistributionLines', 'Show Apriori Distribution with Lines', callback = self.updateGraph, tooltip = "Show the lines that represent the apriori class distribution")
self.box8 = OWGUI.widgetBox(self.SettingsTab, "Subboxes in Cells")
OWGUI.spin(self.box8, self, 'boxSize', 1, 15, 1, '', "Subbox Size (pixels): ", orientation = "horizontal", callback = self.updateGraph)
OWGUI.checkBox(self.box8, self, 'showSubsetDataBoxes', 'Show class distribution of subset data', callback = self.updateGraph, tooltip = "Show small boxes at right (or bottom) edge of cells to represent class distribution of examples from example subset input.")
OWGUI.checkBox(self.box8, self, 'useBoxes', 'Use subboxes on left to show...', callback = self.updateGraph, tooltip = "Show small boxes at left (or top) edge of cells to represent additional information.")
indBox = OWGUI.indentedBox(self.box8)
OWGUI.comboBox(indBox, self, 'showAprioriDistributionBoxes', items = ["Expected class distribution", "Apriori class distribution"], tooltip = "Show additional boxes for each mosaic cell representing:\n - expected class distribution (assuming independence between attributes)\n - apriori class distribution (based on all examples).", callback = self.updateGraph)
hbox = OWGUI.widgetBox(self.SettingsTab, "Colors", orientation = "horizontal")
OWGUI.button(hbox, self, "Set Colors", self.setColors, tooltip = "Set the color palette for coloring different class values", debuggingEnabled = 0)
box.setSizePolicy(QSizePolicy(QSizePolicy.Minimum , QSizePolicy.Fixed ))
self.box6.setSizePolicy(QSizePolicy(QSizePolicy.Minimum , QSizePolicy.Fixed ))
self.connect(self.graphButton, SIGNAL("clicked()"), self.saveToFileCanvas)
self.icons = self.createAttributeIconDict()
self.resize(750, 550)
self.activateLoadedSettings()
dlg = self.createColorDialog()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -