📄 owparallelcoordinates.py
字号:
self.parallelWidget.setShownAttributeList(self.parallelWidget.data, attrList)
self.parallelWidget.graph.removeAllSelections()
self.parallelWidget.middleLabels = (self.optimizationMeasure == VIZRANK and "VizRank") or "Correlations"
self.parallelWidget.updateGraph()
def setAllAttributeRadio(self):
self.orderAllAttributes = 1
self.allAttributesRadio.setState(QButton.On)
self.subsetAttributeRadio.setState(QButton.Off)
self.subsetAttributeEdit.setEnabled(0)
def setSubsetAttributeRadio(self):
self.orderAllAttributes = 0
self.allAttributesRadio.setState(QButton.Off)
self.subsetAttributeRadio.setState(QButton.On)
self.subsetAttributeEdit.setEnabled(1)
# return list of selected attributes
def getSelectedAttributes(self):
if self.resultList.count() == 0: return None
return self.allResults[self.resultList.currentItem()][1]
def setData(self, data):
if hasattr(data, "name"):
self.datasetName = data.name
else: self.datasetName = ""
# called when optimization is in progress
def canContinueOptimization(self):
return self.canOptimize
def getWorstVal(self):
return self.worstVal
def stopOptimizationClick(self):
self.canOptimize = 0
def destroy(self, dw, dsw):
self.saveSettings()
# get vizrank value for attributes attr1 and attr2
def getVizRankVal(self, attr1, attr2):
if not self.projections: return None
for (val, [a1, a2]) in self.projections:
if (attr1 == a1 and attr2 == a2) or (attr1 == a2 and attr2 == a1): return val
return None
def changeProjectionFile(self):
for (short, long) in self.fileBuffer:
if short == self.fileName:
self.loadProjections(long)
return
# load projections from a file
def loadProjections(self, name = None):
self.projections = []
self.kNeighborsLabel.setText("Number of neighbors (k): " )
self.percentDataUsedLabel.setText("Percent of data used:" )
self.testingMethodLabel.setText("Testing method used:" )
self.qualityMeasureLabel.setText("Quality measure used:" )
if name == None:
name = str(QFileDialog.getOpenFileName( self.lastSaveDirName, "Interesting projections (*.proj)", self, "", "Open Projections"))
if name == "": return
dirName, shortFileName = os.path.split(name)
self.lastSaveDirName = dirName
file = open(name, "rt")
settings = eval(file.readline()[:-1])
if settings.has_key("parentName") and settings["parentName"].lower() != "scatterplot":
QMessageBox.critical( None, "Optimization Dialog", 'Unable to load projection file. Only projection file generated by scatterplot is compatible. \nThis file was created using %s method'%(settings["parentName"]), QMessageBox.Ok)
file.close()
return
if type(eval(file.readline()[:-1])) != list: # second line must contain a list of classes that we tried to separate
QMessageBox.critical(None,'Old version of projection file','This file was saved with an older version of k-NN Optimization Dialog. The new version of dialog offers \nsome additional functionality and therefore you have to compute the projection quality again.',QMessageBox.Ok)
file.close()
return
try:
line = file.readline()[:-1]; ind = 0 # first line is a settings line
(acc, other_results, lenTable, attrList, tryIndex, strList) = eval(line)
if len(attrList) != 2:
QMessageBox.information(self, "Incorrect file", "File should contain projections with 2 attributes!", QMessageBox.Ok)
file.close()
return
while (line != ""):
(acc, other_results, lenTable, attrList, tryIndex, strList) = eval(line)
self.projections += [(acc, attrList)]
line = file.readline()[:-1]
except:
self.projections = []
file.close()
QMessageBox.information(self, "Incorrect file", "Incorrect file format!", QMessageBox.Ok)
return
file.close()
if (shortFileName, name) in self.fileBuffer:
self.fileBuffer.remove((shortFileName, name))
self.fileBuffer.insert(0, (shortFileName, name))
if len(self.fileBuffer) > 10:
self.fileBuffer.remove(self.fileBuffer[-1])
self.vizrankFileCombo.clear()
for i in range(len(self.fileBuffer)):
self.vizrankFileCombo.insertItem(self.fileBuffer[i][0])
self.fileName = shortFileName
self.kNeighborsLabel.setText("Number of neighbors (k): %s" % (str(settings["kValue"])))
self.percentDataUsedLabel.setText("Percent of data used: %d %%" % (settings["percentDataUsed"]))
self.testingMethodLabel.setText("Testing method used: %s" % (self.testingMethod[settings["testingMethod"]]))
self.qualityMeasureLabel.setText("Quality measure used: %s" % (self.qualityMeasure[settings["qualityMeasure"]]))
def addProjection(self, val, attrList):
index = self.findTargetIndex(val, max)
self.allResults.insert(index, (val, attrList))
self.resultList.insertItem("%.3f - %s" % (val, str(attrList)), index)
def findTargetIndex(self, accuracy, funct):
# use bisection to find correct index
top = 0; bottom = len(self.allResults)
while (bottom-top) > 1:
mid = (bottom + top)/2
if funct(accuracy, self.allResults[mid][0]) == accuracy: bottom = mid
else: top = mid
if len(self.allResults) == 0: return 0
if funct(accuracy, self.allResults[top][0]) == accuracy:
return top
else:
return bottom
def startOptimization(self):
self.clearResults()
if self.parallelWidget.data == None: return
if self.optimizationMeasure == VIZRANK and self.fileName == "":
QMessageBox.information(self, "No projection file", "If you wish to optimize using VizRank you first have to load a projection file \ncreated by VizRank using Scatterplot widget.", QMessageBox.Ok)
return
if self.parallelWidget.data == None:
QMessageBox.information(self, "Missing data set", "A data set has to be loaded in order to perform optimization.", QMessageBox.Ok)
return
attrInfo = []
if self.optimizationMeasure == CORRELATION:
attrList = [attr.name for attr in self.parallelWidget.data.domain.attributes]
attrInfo = orngVisFuncts.computeCorrelationBetweenAttributes(self.parallelWidget.data, attrList)
#attrInfo = orngVisFuncts.computeCorrelationInsideClassesBetweenAttributes(self.parallelWidget.data, attrList)
elif self.optimizationMeasure == VIZRANK:
for (val, [a1, a2]) in self.projections:
attrInfo.append((val, a1, a2))
# check if all attributes in loaded projection file are actually present in this data set
attrs = [attr.name for attr in self.parallelWidget.data.domain.attributes]
for (v, a1, a2) in attrInfo:
if a1 not in attrs:
print "attribute " + a1 + " was not found in the data set. You probably loaded wrong file with VizRank projections."
return
if a2 not in attrs:
print "attribute " + a2 + " was not found in the data set. You probably loaded wrong file with VizRank projections."
return
if len(attrInfo) == 0:
print "len(attrInfo) == 0. No attribute pairs. Unable to optimize."; return
self.worstVal = -1
self.canOptimize = 1
self.startOptimizationButton.hide()
self.stopOptimizationButton.show()
qApp.processEvents() # allow processing of other events
if self.orderAllAttributes:
orngVisFuncts.optimizeAttributeOrder(attrInfo, len(self.parallelWidget.data.domain.attributes), self, qApp)
else:
orngVisFuncts.optimizeAttributeOrder(attrInfo, self.numberOfAttributes, self, qApp)
self.stopOptimizationButton.hide()
self.startOptimizationButton.show()
# ################################
# MANAGE RESULTS
def updateShownProjections(self, *args):
self.resultList.clear()
for i in range(len(self.allResults)):
self.resultList.insertItem("%.2f - %s" % (self.allResults[i][0], str(self.allResults[i][1])), i)
if self.resultList.count() > 0: self.resultList.setCurrentItem(0)
def clearResults(self):
self.allResults = []
self.resultList.clear()
def saveResults(self, filename = None):
if filename == None:
filename = ""
if self.datasetName != "":
filename = os.path.splitext(os.path.split(self.datasetName)[1])[0]
if self.optimizationMeasure == CORRELATION: filename += " - " + "correlation"
else: filename += " - " + "vizrank"
name = str(QFileDialog.getSaveFileName( os.path.join(self.lastSaveDirName, filename), "Parallel projections (*.papr)", self, "", "Save Parallel Projections"))
if name == "": return
else:
name = filename
# take care of extension
if os.path.splitext(name)[1] != ".papr": name += ".papr"
dirName, shortFileName = os.path.split(name)
self.lastSaveDirName = dirName
# open, write and save file
file = open(name, "wt")
for val in self.allResults:
file.write(str(val) + "\n")
file.close()
def loadResults(self):
self.clearResults()
name = str(QFileDialog.getOpenFileName( self.lastSaveDirName, "Parallel projections (*.papr)", self, "", "Open Parallel Projections"))
if name == "": return
dirName, shortFileName = os.path.split(name)
self.lastSaveDirName = dirName
file = open(name, "rt")
line = file.readline()[:-1]; ind = 0
while (line != ""):
(val, attrList) = eval(line)
self.allResults.insert(ind, (val, attrList))
self.resultList.insertItem("%.2f - %s" % (val, str(attrList)), ind)
line = file.readline()[:-1]
ind+=1
file.close()
#test widget appearance
if __name__=="__main__":
a=QApplication(sys.argv)
ow=OWParallelCoordinates()
a.setMainWidget(ow)
ow.show()
a.exec_loop()
#save settings
ow.saveSettings()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -