source: orange/orange/OrangeWidgets/Visualize Qt/OWLinProjQt.py @ 9549:754ecbee6314

Revision 9549:754ecbee6314, 23.7 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Fixed some more signal names.

Line 
1"""
2<name>Linear Projection (Qt)</name>
3<description>Create a linear projection.</description>
4<contact>Gregor Leban (gregor.leban@fri.uni-lj.si)</contact>
5<icon>icons/LinearProjection.png</icon>
6<priority>140</priority>
7"""
8# LinProj.py
9#
10# Show a linear projection of the data
11#
12from OWVisWidget import *
13from OWLinProjGraphQt import *
14from OWkNNOptimization import OWVizRank
15from OWFreeVizOptimization import *
16import OWToolbars, OWGUI, orngTest
17import orngVisFuncts, OWColorPalette
18import orngVizRank
19from plot.owtheme import LinProjDarkTheme, LinProjLightTheme
20
21###########################################################################################
22##### WIDGET : Linear Projection
23###########################################################################################
24class OWLinProjQt(OWVisWidget):
25    settingsList = ["graph." + s for s in OWPlot.point_settings + OWPlot.appearance_settings] + [
26                    "graph.jitterSize", "graph.showFilledSymbols", "graph.scaleFactor",
27                    "graph.showLegend", "graph.useDifferentSymbols", "autoSendSelection", "graph.useDifferentColors", "graph.showValueLines",
28                    "graph.tooltipKind", "graph.tooltipValue", "toolbarSelection",
29                    "graph.showProbabilities", "graph.squareGranularity", "graph.spaceBetweenCells", "graph.useAntialiasing",
30                    "valueScalingType", "showAllAttributes", "colorSettings", "selectedSchemaIndex", "addProjectedPositions"]
31    jitterSizeNums = [0.0, 0.01, 0.1, 0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20]
32
33    contextHandlers = {"": DomainContextHandler("", [ContextField("shownAttributes", DomainContextHandler.RequiredList, selected="selectedShown", reservoir="hiddenAttributes")])}
34
35    def __init__(self,parent=None, signalManager = None, name = "Linear Projection (qt)", graphClass = None):
36        OWVisWidget.__init__(self, parent, signalManager, name, TRUE)
37
38        self.inputs = [("Data", ExampleTable, self.setData, Default),
39                       ("Data Subset", ExampleTable, self.setSubsetData),
40                       ("Features", AttributeList, self.setShownAttributes),
41                       ("Evaluation Results", orngTest.ExperimentResults, self.setTestResults),
42                       ("VizRank Learner", orange.Learner, self.setVizRankLearner),
43                       ("Distances", orange.SymMatrix, self.setDistances)]
44        self.outputs = [("Selected Data", ExampleTable), ("Other Data", ExampleTable), ("Features", AttributeList), ("FreeViz Learner", orange.Learner)]
45
46        name_lower = name.lower()
47        self._name_lower = name_lower
48
49        # local variables
50        self.showAllAttributes = 0
51        self.valueScalingType = 0
52        self.autoSendSelection = 1
53        self.data = None
54        self.subsetData = None
55        self.distances = None
56        self.toolbarSelection = 0
57        self.classificationResults = None
58        self.outlierValues = None
59        self.attributeSelectionList = None
60        self.colorSettings = None
61        self.selectedSchemaIndex = 0
62        self.addProjectedPositions = 0
63        self.resetAnchors = 0
64
65        #add a graph widget
66        if graphClass:
67            self.graph = graphClass(self, self.mainArea, name)
68        else:
69            self.graph = OWLinProjGraph(self, self.mainArea, name)
70        self.mainArea.layout().addWidget(self.graph)
71       
72        # graph variables
73        self.graph.manualPositioning = 0
74        self.graph.hideRadius = 0
75        self.graph.showAnchors = 1
76        self.graph.jitterContinuous = 0
77        self.graph.showProbabilities = 0
78        self.graph.useDifferentSymbols = 0
79        self.graph.useDifferentColors = 1
80        self.graph.tooltipKind = 0
81        self.graph.tooltipValue = 0
82        self.graph.scaleFactor = 1.0
83        self.graph.squareGranularity = 3
84        self.graph.spaceBetweenCells = 1
85        self.graph.showAxisScale = 0
86        self.graph.showValueLines = 0
87        self.graph.valueLineLength = 5
88        self.dark_theme = False
89
90        if "3d" in name_lower:
91            self.settingsList.append("graph.use_2d_symbols")
92            self.settingsList.append("graph.mouse_sensitivity")
93            self.settingsList.append("dark_theme")
94            if "sphereviz" in name_lower:
95                self.settingsList.append("graph.show_anchor_grid")
96
97        #load settings
98        self.loadSettings()
99
100##        # cluster dialog
101##        self.clusterDlg = ClusterOptimization(self, self.signalManager, self.graph, name)
102##        self.graph.clusterOptimization = self.clusterDlg
103
104        # optimization dialog
105        if "radviz" in name_lower:
106            self.vizrank = OWVizRank(self, self.signalManager, self.graph, orngVizRank.RADVIZ, name)
107            self.connect(self.graphButton, SIGNAL("clicked()"), self.saveToFile)
108        elif "polyviz" in name_lower:
109            self.vizrank = OWVizRank(self, self.signalManager, self.graph, orngVizRank.POLYVIZ, name)
110            self.connect(self.graphButton, SIGNAL("clicked()"), self.graph.saveToFile)
111        elif "sphereviz" in name_lower:
112            self.vizrank = OWVizRank(self, self.signalManager, self.graph, orngVizRank.SPHEREVIZ3D, name)
113            self.connect(self.graphButton, SIGNAL("clicked()"), self.graph.saveToFile)
114        elif "3d" in name_lower:
115            self.vizrank = OWVizRank(self, self.signalManager, self.graph, orngVizRank.LINEAR_PROJECTION3D, name)
116            self.connect(self.graphButton, SIGNAL("clicked()"), self.graph.saveToFile)
117        else:
118            self.vizrank = OWVizRank(self, self.signalManager, self.graph, orngVizRank.LINEAR_PROJECTION, name)
119            self.connect(self.graphButton, SIGNAL("clicked()"), self.saveToFile)
120
121        self.optimizationDlg = self.vizrank  # for backward compatibility
122
123        # ignore settings!! if we have radviz then normalize, otherwise not.
124        self.graph.normalizeExamples = ("radviz" in name_lower or "sphereviz" in name_lower)
125
126        #GUI
127        # add a settings dialog and initialize its values
128
129        self.tabs = OWGUI.tabWidget(self.controlArea)
130        self.GeneralTab = OWGUI.createTabPage(self.tabs, "Main")
131        self.SettingsTab = OWGUI.createTabPage(self.tabs, "Settings", canScroll = 1)
132        if not "3d" in name_lower:
133            self.PerformanceTab = OWGUI.createTabPage(self.tabs, "Performance")
134       
135        #add controls to self.controlArea widget
136        self.createShowHiddenLists(self.GeneralTab, callback = self.updateGraphAndAnchors)
137
138        self.optimizationButtons = OWGUI.widgetBox(self.GeneralTab, "Optimization Dialogs", orientation = "horizontal")
139        self.vizrankButton = OWGUI.button(self.optimizationButtons, self, "VizRank", callback = self.vizrank.reshow, tooltip = "Opens VizRank dialog, where you can search for interesting projections with different subsets of attributes.", debuggingEnabled = 0)
140        self.wdChildDialogs = [self.vizrank]    # used when running widget debugging
141
142        # freeviz dialog
143        if "radviz" in name_lower or "linear projection" in name_lower or "sphereviz" in name_lower:
144            self.freeVizDlg = FreeVizOptimization(self, self.signalManager, self.graph, name)
145            self.wdChildDialogs.append(self.freeVizDlg)
146            self.freeVizDlgButton = OWGUI.button(self.optimizationButtons, self, "FreeViz", callback = self.freeVizDlg.reshow, tooltip = "Opens FreeViz dialog, where the position of attribute anchors is optimized so that class separation is improved", debuggingEnabled = 0)
147            if "linear projection" in name_lower:
148                self.freeVizLearner = FreeVizLearner(self.freeVizDlg)
149                self.send("FreeViz Learner", self.freeVizLearner)
150            if "3d" in name_lower:
151                # Patch a method in Freeviz
152                get_shown_attribute_list = lambda: [anchor[3] for anchor in self.graph.anchorData]
153                self.freeVizDlg.get_shown_attribute_list = get_shown_attribute_list
154                self.freeVizDlg.getShownAttributeList = get_shown_attribute_list
155                self.freeVizDlg._use_3D = True
156
157##        self.clusterDetectionDlgButton = OWGUI.button(self.optimizationButtons, self, "Cluster", callback = self.clusterDlg.reshow, debuggingEnabled = 0)
158##        self.vizrankButton.setMaximumWidth(63)
159##        self.clusterDetectionDlgButton.setMaximumWidth(63)
160##        self.freeVizDlgButton.setMaximumWidth(63)
161##        self.connect(self.clusterDlg.startOptimizationButton , SIGNAL("clicked()"), self.optimizeClusters)
162##        self.connect(self.clusterDlg.resultList, SIGNAL("selectionChanged()"),self.showSelectedCluster)
163
164        gui = self.graph.gui
165
166        if "3d" in name_lower:
167            toolbar_buttons = [
168                gui.StateButtonsBegin,
169                    (gui.UserButton, 'Rotate', 'state', ROTATING, None, 'Dlg_undo'),
170                    gui.Select,
171                gui.StateButtonsEnd,
172                gui.Spacing,
173                gui.SendSelection,
174                gui.ClearSelection
175            ]
176
177            self.zoomSelectToolbar = gui.zoom_select_toolbar(self.GeneralTab, buttons = toolbar_buttons)
178            self.connect(self.zoomSelectToolbar.buttons[gui.SendSelection], SIGNAL("clicked()"), self.sendSelections)
179            self.graph.set_selection_behavior(OWPlot.ReplaceSelection)
180        else:
181            # zooming / selection
182            self.zoomSelectToolbar = gui.zoom_select_toolbar(self.GeneralTab, buttons = gui.default_zoom_select_buttons + [gui.Spacing, gui.ShufflePoints])
183            self.connect(self.zoomSelectToolbar.buttons[gui.SendSelection], SIGNAL("clicked()"), self.sendSelections)
184
185        # ####################################
186        # SETTINGS TAB
187        # #####
188        self.extraTopBox = OWGUI.widgetBox(self.SettingsTab, orientation = "vertical")
189        self.extraTopBox.hide()
190       
191        self.graph.gui.point_properties_box(self.SettingsTab)
192
193        box = OWGUI.widgetBox(self.SettingsTab, "Jittering Options")
194        OWGUI.comboBoxWithCaption(box, self, "graph.jitterSize", 'Jittering size (% of range):', callback = self.resetGraphData, items = self.jitterSizeNums, sendSelectedValue = 1, valueType = float)
195        OWGUI.checkBox(box, self, 'graph.jitterContinuous', 'Jitter continuous attributes', callback = self.resetGraphData, tooltip = "Does jittering apply also on continuous attributes?")
196
197        if not "3d" in name_lower:
198            box = OWGUI.widgetBox(self.SettingsTab, "Scaling Options")
199            OWGUI.qwtHSlider(box, self, "graph.scaleFactor", label = 'Inflate points by: ', minValue=1.0, maxValue= 10.0, step=0.1, callback = self.updateGraph, tooltip="If points lie too much together you can expand their position to improve perception", maxWidth = 90)
200
201        box = OWGUI.widgetBox(self.SettingsTab, "General Graph Settings")
202        #OWGUI.checkBox(box, self, 'graph.normalizeExamples', 'Normalize examples', callback = self.updateGraph)
203        self.graph.gui.show_legend_check_box(box)
204        bbox = OWGUI.widgetBox(box, orientation = "horizontal")
205        if "3d" in name_lower:
206            OWGUI.checkBox(bbox, self, 'graph.showValueLines', 'Show value lines  ', callback = self.graph.update)
207            OWGUI.qwtHSlider(bbox, self, 'graph.valueLineLength', minValue=1, maxValue=10, step=1, callback = self.graph.update, showValueLabel = 0)
208        else:
209            OWGUI.checkBox(bbox, self, 'graph.showValueLines', 'Show value lines  ', callback = self.updateGraph)
210            OWGUI.qwtHSlider(bbox, self, 'graph.valueLineLength', minValue=1, maxValue=10, step=1, callback = self.updateGraph, showValueLabel = 0)
211        OWGUI.checkBox(box, self, 'graph.useDifferentSymbols', 'Use different symbols', callback = self.updateGraph, tooltip = "Show different class values using different symbols")
212        OWGUI.checkBox(box, self, 'graph.useDifferentColors', 'Use different colors', callback = self.updateGraph, tooltip = "Show different class values using different colors")
213
214        if "3d" in name_lower:
215            OWGUI.checkBox(box, self, 'dark_theme', 'Dark theme', callback = self.on_theme_change)
216            OWGUI.checkBox(box, self, 'graph.use_2d_symbols', '2D symbols', callback = self.updateGraph, tooltip = "Use 2D symbols")
217            self.on_theme_change()
218            if "sphereviz" in name_lower:
219                OWGUI.checkBox(box, self, 'graph.show_anchor_grid', 'Anchor grid', callback = self.on_theme_change)
220                box = OWGUI.widgetBox(self.SettingsTab, 'Camery type', orientation = "horizontal")
221                c = OWGUI.comboBox(box, self, 'graph.camera_type', callback=self.graph.update_camera_type, sendSelectedValue=0)
222                c.addItem('Default')
223                c.addItem('Center')
224                c.addItem('Random attribute')
225                OWGUI.hSlider(box, self, 'graph.camera_angle', label='FOV', minValue=45, maxValue=180, step=1, callback = self.graph.update, tooltip='Field of view angle')
226            box = OWGUI.widgetBox(self.SettingsTab, 'Mouse', orientation = "horizontal")
227            OWGUI.hSlider(box, self, 'graph.mouse_sensitivity', label='Sensitivity', minValue=1, maxValue=10, step=1, callback = self.graph.update, tooltip='Change mouse sensitivity')
228        else:
229            self.graph.gui.filled_symbols_check_box(box)
230            wbox = OWGUI.widgetBox(box, orientation = "horizontal")
231            OWGUI.checkBox(wbox, self, 'graph.showProbabilities', 'Show probabilities'+'  ', callback = self.updateGraph, tooltip = "Show a background image with class probabilities")
232            smallWidget = OWGUI.SmallWidgetLabel(wbox, pixmap = 1, box = "Advanced settings", tooltip = "Show advanced settings")
233            OWGUI.rubber(wbox)
234
235            box = OWGUI.widgetBox(smallWidget.widget, orientation = "horizontal")
236            OWGUI.widgetLabel(box, "Granularity:  ")
237            OWGUI.hSlider(box, self, 'graph.squareGranularity', minValue=1, maxValue=10, step=1, callback = self.updateGraph)
238
239            box = OWGUI.widgetBox(smallWidget.widget, orientation = "horizontal")
240            OWGUI.checkBox(box, self, 'graph.spaceBetweenCells', 'Show space between cells', callback = self.updateGraph)
241
242        box = OWGUI.widgetBox(self.SettingsTab, "Colors", orientation = "horizontal")
243        OWGUI.button(box, self, "Colors", self.setColors, tooltip = "Set the canvas background color and color palette for coloring variables", debuggingEnabled = 0)
244
245        box = OWGUI.widgetBox(self.SettingsTab, "Tooltips Settings")
246        callback = self.graph.update if "3d" in name_lower else self.updateGraph
247        OWGUI.comboBox(box, self, "graph.tooltipKind", items = ["Show line tooltips", "Show visible attributes", "Show all attributes"], callback = callback)
248        OWGUI.comboBox(box, self, "graph.tooltipValue", items = ["Tooltips show data values", "Tooltips show spring values"], callback = callback, tooltip = "Do you wish that tooltips would show you original values of visualized attributes or the 'spring' values (values between 0 and 1). \nSpring values are scaled values that are used for determining the position of shown points. Observing these values will therefore enable you to \nunderstand why the points are placed where they are.")
249
250        box = OWGUI.widgetBox(self.SettingsTab, "Auto Send Selected Data When...")
251        OWGUI.checkBox(box, self, 'autoSendSelection', 'Adding/Removing selection areas', callback = self.selectionChanged, tooltip = "Send selected data whenever a selection area is added or removed")
252        OWGUI.checkBox(box, self, 'graph.sendSelectionOnUpdate', 'Moving/Resizing selection areas', tooltip = "Send selected data when a user moves or resizes an existing selection area")
253        OWGUI.comboBox(box, self, "addProjectedPositions", items = ["Do not modify the domain", "Append projection as attributes", "Append projection as meta attributes"], callback = self.sendSelections)
254        self.selectionChanged()
255
256        self.SettingsTab.layout().addStretch(100)
257       
258        if not "3d" in name_lower:
259            self.graph.gui.effects_box(self.PerformanceTab, )
260            self.PerformanceTab.layout().addStretch(100)
261
262        self.icons = self.createAttributeIconDict()
263        self.debugSettings = ["hiddenAttributes", "shownAttributes"]
264
265        dlg = self.createColorDialog()
266        self.graph.contPalette = dlg.getContinuousPalette("contPalette")
267        self.graph.discPalette = dlg.getDiscretePalette("discPalette")
268       
269        p = self.graph.palette()
270        p.setColor(OWPalette.Canvas, dlg.getColor("Canvas"))
271        self.graph.set_palette(p)
272
273        self.cbShowAllAttributes()      # update list boxes based on the check box value
274
275        self.resize(900, 700)
276
277    def saveToFile(self):
278        self.graph.saveToFile([("Save PicTex", self.graph.savePicTeX)])
279
280    # #########################
281    # KNN OPTIMIZATION BUTTON EVENTS
282    # #########################
283    def saveCurrentProjection(self):
284        qname = QFileDialog.getSaveFileName(self, "Save File",  os.path.realpath(".") + "/Linear_projection.tab", "Orange Example Table (*.tab)")
285        if qname.isEmpty(): return
286        name = str(qname)
287        if len(name) < 4 or name[-4] != ".":
288            name = name + ".tab"
289        self.graph.saveProjectionAsTabData(name, self.getShownAttributeList())
290
291
292    # send signals with selected and unselected examples as two datasets
293    def sendSelections(self):
294        if not self.data: return
295        (selected, unselected) = self.graph.getSelectionsAsExampleTables(self.getShownAttributeList(), addProjectedPositions = self.addProjectedPositions)
296
297        self.send("Selected Data", selected)
298        self.send("Other Data", unselected)
299
300    def sendShownAttributes(self):
301        self.send("Features", [a[0] for a in self.shownAttributes])
302
303    # show selected interesting projection
304    def showSelectedAttributes(self):
305        val = self.vizrank.getSelectedProjection()
306        if val:
307            (accuracy, other_results, tableLen, attrList, tryIndex, generalDict) = val
308            if "3d" in self._name_lower:
309                self.updateGraph(attrList, setAnchors= 1, XAnchors = generalDict.get("XAnchors"), YAnchors = generalDict.get("YAnchors"), ZAnchors = generalDict.get("ZAnchors"))
310            else:
311                self.updateGraph(attrList, setAnchors= 1, XAnchors = generalDict.get("XAnchors"), YAnchors = generalDict.get("YAnchors"))
312            self.graph.removeAllSelections()
313
314
315    def updateGraphAndAnchors(self):
316        self.updateGraph(setAnchors = 1)
317
318    def updateGraph(self, attrList = None, setAnchors = 0, insideColors = None, **args):
319        if not attrList:
320            attrList = self.getShownAttributeList()
321        else:
322            self.setShownAttributeList(attrList)
323
324        self.graph.showKNN = 0
325        if self.graph.dataHasDiscreteClass:
326            self.graph.showKNN = (self.vizrank.showKNNCorrectButton.isChecked() and 1) or (self.vizrank.showKNNCorrectButton.isChecked() and 2)
327
328        self.graph.insideColors = insideColors or self.classificationResults or self.outlierValues
329        self.graph.updateData(attrList, setAnchors, **args)
330
331
332    # ###############################################################################################################
333    # INPUT SIGNALS
334
335    # receive new data and update all fields
336    def setData(self, data):
337        if data is not None and (len(data) == 0 or len(data.domain) == 0):
338            data = None
339        if self.data and data and self.data.checksum() == data.checksum():
340            return    # check if the new data set is the same as the old one
341
342        self.closeContext()
343        sameDomain = self.data and data and data.domain.checksum() == self.data.domain.checksum() # preserve attribute choice if the domain is the same
344        self.resetAnchors = not sameDomain
345        self.data = data
346        self.classificationResults = None
347        self.outlierValues = None
348        self.vizrank.clearResults()
349        if hasattr(self, "freeVizDlg"):
350            self.freeVizDlg.clearData()
351##        self.clusterDlg.setData(data)
352        if not sameDomain:
353            self.setShownAttributeList(self.attributeSelectionList)
354        self.openContext("", self.data)
355        self.resetAttrManipulation()
356
357
358    def setSubsetData(self, subsetData):
359        self.subsetData = subsetData
360        self.vizrank.clearArguments()
361
362    def setDistances(self, distances):
363        self.distances = distances
364       
365    # attribute selection signal - info about which attributes to show
366    def setShownAttributes(self, attributeSelectionList):
367        self.attributeSelectionList = attributeSelectionList
368        self.resetAnchors = 1
369
370
371    # this is called by OWBaseWidget after setData and setSubsetData are called. this way the graph is updated only once
372    def handleNewSignals(self):
373        self.graph.setData(self.data, self.subsetData)
374        self.graph.clear()
375        self.vizrank.resetDialog()
376        if self.attributeSelectionList and 0 not in [self.graph.attributeNameIndex.has_key(attr) for attr in self.attributeSelectionList]:
377            self.setShownAttributeList(self.attributeSelectionList)
378        self.attributeSelectionList = None
379        self.updateGraph(setAnchors = self.resetAnchors)
380        self.sendSelections()
381        self.resetAnchors = 0
382
383
384    # visualize the results of the classification
385    def setTestResults(self, results):
386        self.classificationResults = None
387        if isinstance(results, orngTest.ExperimentResults) and len(results.results) > 0 and len(results.results[0].probabilities) > 0:
388            self.classificationResults = ([results.results[i].probabilities[0][results.results[i].actualClass] for i in range(len(results.results))], "Probability of correct classificatioin = %.2f%%")
389        self.resetAnchors += 1
390
391
392    # set the learning method to be used in VizRank
393    def setVizRankLearner(self, learner):
394        self.vizrank.externalLearner = learner
395
396    # EVENTS
397    def resetGraphData(self):
398        self.graph.rescaleData()
399        self.updateGraph()
400
401    def selectionChanged(self):
402        self.zoomSelectToolbar.buttons[OWPlotGUI.SendSelection].setEnabled(not self.autoSendSelection)
403        if self.autoSendSelection:
404            self.sendSelections()
405
406    def setColors(self):
407        dlg = self.createColorDialog()
408        if dlg.exec_():
409            self.colorSettings = dlg.getColorSchemas()
410            self.selectedSchemaIndex = dlg.selectedSchemaIndex
411            self.graph.contPalette = dlg.getContinuousPalette("contPalette")
412            self.graph.discPalette = dlg.getDiscretePalette("discPalette")
413            self.graph.setCanvasBackground(dlg.getColor("Canvas"))
414            self.updateGraph()
415
416    def createColorDialog(self):
417        c = OWColorPalette.ColorPaletteDlg(self, "Color palette")
418        c.createDiscretePalette("discPalette", "Discrete Palette")
419        c.createContinuousPalette("contPalette", "Continuous Palette")
420        box = c.createBox("otherColors", "Other Colors")
421        c.createColorButton(box, "Canvas", "Canvas color", self.graph.color(OWPalette.Canvas))
422        c.setColorSchemas(self.colorSettings, self.selectedSchemaIndex)
423        return c
424
425    def saveSettings(self):
426        OWWidget.saveSettings(self)
427        self.vizrank.saveSettings()
428        if hasattr(self, "freeVizDlg"):
429            self.freeVizDlg.saveSettings()
430
431    def hideEvent(self, ev):
432        self.vizrank.hide()
433        if hasattr(self, "freeVizDlg"):
434            self.freeVizDlg.hide()
435        OWVisWidget.hideEvent(self, ev)
436       
437    def sendReport(self):
438        self.reportImage(self.graph.saveToFileDirect, QSize(500, 500))
439
440    def on_theme_change(self):
441        if self.dark_theme:
442            self.graph.theme = LinProjDarkTheme()
443        else:
444            self.graph.theme = LinProjLightTheme()
445
446       
447#test widget appearance
448if __name__=="__main__":
449    a=QApplication(sys.argv)
450    ow=OWLinProj()
451    ow.show()
452    #ow.setData(orange.ExampleTable("..\\..\\doc\\datasets\\wine.tab"))
453    data = orange.ExampleTable(r"e:\Development\Orange Datasets\brown\brown-selected.tab")
454    ow.setData(data)
455    ow.handleNewSignals()
456    a.exec_()
457
Note: See TracBrowser for help on using the repository browser.