📄 owcorranalysis.py
字号:
"""
<name>Correspondence Analysis</name>
<description>Takes a ExampleTable and makes correspondence analysis</description>
<icon>icons/CorrespondenceAnalysis.png</icon>
<priority>3300</priority>
"""
from qt import *
from qttable import *
from OWWidget import *
#from OWScatterPlotGraph import *
from OWCorrAnalysisGraph import *
import OWGUI, OWToolbars, OWDlgs
import orngCA
from numpy import *
from OWToolbars import ZoomSelectToolbar
from orngTextCorpus import CategoryDocument, checkFromText
import os
class OWCorrAnalysis(OWWidget):
settingsList = ['graph.pointWidth', "graph.showXaxisTitle", "graph.showYLaxisTitle", "showGridlines", "graph.showAxisScale",
"graph.showLegend", 'autoSendSelection', "graph.showFilledSymbols", 'toolbarSelection',
"colorSettings", "percRadius"]
contextHandlers = {"": DomainContextHandler("", ["attrRow", "attrCol"])}
def __init__(self, parent=None, signalManager=None):
OWWidget.__init__(self, parent, signalManager, 'CorrAnalysis')
self.inputs = [("Data", ExampleTable, self.dataset)]
self.outputs = []
self.data = None
self.CA = None
self.colors = ColorPaletteHSV(2)
#Locals
self.showGridlines = 0
self.autoSendSelection = 0
self.toolbarSelection = 0
self.percRadius = 5
self.colorSettings = None
# GUI
self.tabs = QTabWidget(self.controlArea, 'tabWidget')
self.GeneralTab = QVGroupBox(self)
self.SettingsTab = QVGroupBox(self, "Settings")
self.tabs.insertTab(self.GeneralTab, "General")
self.tabs.insertTab(self.SettingsTab, "Settings")
layout = QVBoxLayout(self.mainArea)
self.tabsMain = QTabWidget(self.mainArea, 'tabWidgetMain')
layout.addWidget(self.tabsMain)
# ScatterPlot
self.graph = OWCorrAnalysisGraph(None, "ScatterPlot")
self.tabsMain.insertTab(self.graph, "Scatter Plot")
self.icons = self.createAttributeIconDict()
self.textData = False
OWGUI.checkBox(self.GeneralTab, self, 'textData', 'Textual data', callback = self.initAttrValues)
#col attribute
self.attrCol = ""
self.attrColCombo = OWGUI.comboBox(self.GeneralTab, self, "attrCol", " Column Table Attribute ", callback = self.updateTables, sendSelectedValue = 1, valueType = str)
# row attribute
self.attrRow = ""
self.attrRowCombo = OWGUI.comboBox(self.GeneralTab, self, "attrRow", "Row Table Attribute ", callback = self.updateTables, sendSelectedValue = 1, valueType = str)
#x principal axis
self.attrX = 0
self.attrXCombo = OWGUI.comboBox(self.GeneralTab, self, "attrX", " Principal axis X ", callback = self.contributionBox, sendSelectedValue = 1, valueType = str)
#y principal axis
self.attrY = 0
self.attrYCombo = OWGUI.comboBox(self.GeneralTab, self, "attrY", " Principal axis Y ", callback = self.contributionBox, sendSelectedValue = 1, valueType = str)
contribution = QVGroupBox('Contribution to inertia', self.GeneralTab)
self.firstAxis = OWGUI.widgetLabel(contribution, 'Axis 1: 10%')
self.secondAxis = OWGUI.widgetLabel(contribution, 'Axis 2: 10%')
sliders = QVGroupBox('Percentage of points', self.GeneralTab)
OWGUI.widgetLabel(sliders, 'Row points')
self.percRow = 100
self.rowSlider = OWGUI.hSlider(sliders, self, 'percRow', minValue=1, maxValue=100, step=10, callback = self.updateGraph)
OWGUI.widgetLabel(sliders, 'Column points')
self.percCol = 100
self.colSlider = OWGUI.hSlider(sliders, self, 'percCol', minValue=1, maxValue=100, step=10, callback = self.updateGraph)
#zooming
self.zoomSelectToolbar = ZoomBrowseSelectToolbar(self, self.GeneralTab, self.graph, self.autoSendSelection)
self.connect(self.zoomSelectToolbar.buttonSendSelections, SIGNAL("clicked()"), self.sendSelections)
self.apply = False
OWGUI.button(self.GeneralTab, self, 'Update Graph', self.buttonUpdate)
# ####################################
# SETTINGS TAB
# point width
OWGUI.hSlider(self.SettingsTab, self, 'graph.pointWidth', box=' Point Size ', minValue=1, maxValue=20, step=1, callback = self.replotCurves)
# general graph settings
box4 = OWGUI.widgetBox(self.SettingsTab, " General Graph Settings ")
OWGUI.checkBox(box4, self, 'graph.showXaxisTitle', 'X axis title', callback = self.updateGraph)
OWGUI.checkBox(box4, self, 'graph.showYLaxisTitle', 'Y axis title', callback = self.updateGraph)
## OWGUI.checkBox(box4, self, 'graph.showAxisScale', 'Show axis scale', callback = self.updateGraph)
OWGUI.checkBox(box4, self, 'graph.showLegend', 'Show legend', callback = self.updateGraph)
OWGUI.checkBox(box4, self, 'graph.showFilledSymbols', 'Show filled symbols', callback = self.updateGraph)
OWGUI.checkBox(box4, self, 'showGridlines', 'Show gridlines', callback = self.setShowGridlines)
## OWGUI.checkBox(box4, self, 'graph.showClusters', 'Show clusters', callback = self.updateGraph, tooltip = "Show a line boundary around a significant cluster")
self.colorButtonsBox = OWGUI.widgetBox(self.SettingsTab, " Colors ", orientation = "horizontal")
OWGUI.button(self.colorButtonsBox, self, "Set Colors", self.setColors, tooltip = "Set the canvas background color, grid color and color palette for coloring continuous variables", debuggingEnabled = 0)
#browsing radius
OWGUI.hSlider(self.SettingsTab, self, 'percRadius', box=' Browsing Curve Size ', minValue = 0, maxValue=100, step=5, callback = self.calcRadius)
self.activateLoadedSettings()
self.resize(700, 800)
def activateLoadedSettings(self):
dlg = self.createColorDialog()
self.graph.contPalette = dlg.getContinuousPalette("contPalette")
self.graph.discPalette = dlg.getDiscretePalette()
self.graph.setCanvasBackground(dlg.getColor("Canvas"))
self.graph.setGridPen(QPen(dlg.getColor("Grid")))
self.graph.enableGridXB(self.showGridlines)
self.graph.enableGridYL(self.showGridlines)
apply([self.zoomSelectToolbar.actionZooming, self.zoomSelectToolbar.actionRectangleSelection, self.zoomSelectToolbar.actionPolygonSelection, self.zoomSelectToolbar.actionBrowse, self.zoomSelectToolbar.actionBrowseCircle][self.toolbarSelection], [])
def dataset(self, dataset):
self.closeContext()
if dataset:
self.data = dataset
self.textData = checkFromText(self.data)
self.initAttrValues()
else:
self.data = None
self.initAttrValues()
self.openContext("", dataset)
self.buttonUpdate()
def initAttrValues(self):
self.attrRowCombo.clear()
self.attrColCombo.clear()
if self.data == None: return
if self.textData:
self.attrRowCombo.insertItem('document')
self.attrRowCombo.insertItem('category')
self.attrColCombo.insertItem('words')
else:
for attr in self.data.domain:
if attr.varType == orange.VarTypes.Discrete: self.attrRowCombo.insertItem(self.icons[attr.varType], attr.name)
if attr.varType == orange.VarTypes.Discrete: self.attrColCombo.insertItem(self.icons[attr.varType], attr.name)
self.attrRow = str(self.attrRowCombo.text(0))
if self.attrColCombo.count() > 1:
self.attrCol = str(self.attrColCombo.text(1))
else:
self.attrCol = str(self.attrColCombo.text(0))
self.updateTables()
def updateTables(self):
if self.textData:
data = (self.attrRow == 'document' and [self.data] or [CategoryDocument(self.data).dataCD])[0]
metas = data.domain.getmetas()
lenMetas = len(metas)
caList = []
for ex in data:
cur = [0] * lenMetas
for i, m in zip(range(lenMetas), metas.keys()):
try:
cur[i] = ex[m].native()
except:
cur[i] = 0
caList.append(cur)
self.CA = orngCA.CA(caList)
try:
self.tipsR = [ex['meta'].native() for ex in data]
except:
self.tipsR = [ex.name for ex in data]
self.tipsC = [a.name for a in data.domain.getmetas().values()]
else:
ca = orange.ContingencyAttrAttr(self.attrRow, self.attrCol, self.data)
caList = [[col for col in row] for row in ca]
self.CA = orngCA.CA(caList)
self.tipsR = [s for s, v in ca.outerDistribution.items()]
self.tipsC = [s for s, v in ca.innerDistribution.items()]
del ca
self.rowSlider.setMinValue(1)
self.rowSlider.setMaxValue(len(self.tipsR))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -