source: orange/Orange/OrangeWidgets/Visualize/OWAttributeStatistics.py @ 11096:cf7d2ae9d22b

Revision 11096:cf7d2ae9d22b, 25.5 KB checked in by Ales Erjavec <ales.erjavec@…>, 19 months ago (diff)

Added new svg icons for the widgets/categories.

Line 
1"""
2<name>Attribute Statistics</name>
3<description>Basic attribute statistics.</description>
4<contact>Jure Zabkar (jure.zabkar@fri.uni-lj.si)</contact>
5<icon>icons/AttributeStatistics.svg</icon>
6<priority>200</priority>
7"""
8#
9# OWAttributeStatistics.py
10#
11
12#import orange
13from OWWidget import *
14from OWGUI import *
15from OWDlgs import OWChooseImageSizeDlg
16import OWQCanvasFuncts
17from orngDataCaching import *
18import random
19
20class OWAttributeStatistics(OWWidget):
21    contextHandlers = {"": DomainContextHandler("", ["HighlightedAttribute"])}
22    settingsList = ["sorting"]
23
24    def __init__(self,parent=None, signalManager = None):
25        OWWidget.__init__(self, parent, signalManager, "AttributeStatistics", TRUE)
26
27#        self.callbackDeposit = []
28
29        #set default settings
30        self.cwbias = 250 # canvas_width = widget_width - 300 pixels
31        self.chbias = 30
32        self.sorting = 0
33
34        self.cw = self.width()-self.cwbias
35        self.ch = self.height()-self.chbias
36
37        #load settings
38        self.loadSettings()
39
40        self.dataset = None
41        self.canvas = None
42        self.HighlightedAttribute = None
43        #list inputs and outputs
44        self.inputs = [("Data", ExampleTable, self.setData, Default)]
45        self.outputs = [("Feature Statistics", ExampleTable)]
46
47        #GUI
48
49        AttsBox = OWGUI.widgetBox(self.controlArea, 'Attributes', addSpace=True)
50        self.attributes = OWGUI.listBox(AttsBox, self, selectionMode = QListWidget.SingleSelection, callback = self.attributeHighlighted)
51       
52        OWGUI.comboBox(self.controlArea, self, "sorting", "Value sorting", items = ["No sorting", "Descending", "Ascending"], callback = self.attributeHighlighted, sendSelectedValue = 0, tooltip = "Should the list of attribute values for discrete attributes be sorted?")
53        #self.attributes.setMinimumSize(150, 200)
54        #connect controls to appropriate functions
55
56        #OWGUI.separator(self.controlArea, 0,16)
57
58        #give mainArea a layout
59        self.canvas = DisplayStatistics(self)
60        self.canvas.canvasW, self.canvas.canvasH = self.cw, self.ch
61        self.canvasview = QGraphicsView(self.canvas, self.mainArea)
62        self.canvasview.setAlignment(Qt.AlignLeft | Qt.AlignTop)
63        self.canvasview.setFocusPolicy(Qt.WheelFocus)
64        self.mainArea.layout().addWidget( self.canvasview )
65
66        self.icons = self.createAttributeIconDict()
67        self.connect(self.graphButton, SIGNAL("clicked()"), self.saveToFileCanvas)
68        self.resize(700, 600)
69
70
71    def resizeEvent(self, event):
72        if self.canvas and self.dataset and self.HighlightedAttribute>=0 and len(self.dataset.domain) < self.HighlightedAttribute:
73            # canvas height should be a bit less than the height of the widget frame
74            self.ch = self.height()-20
75            self.canvas.canvasW, self.canvas.canvasH = self.cw, self.ch
76            #self.canvas = DisplayStatistics (self.cw, self.ch)
77            # the height of the bar should be 150 pixels smaller than the height of the canvas
78            self.canvas.bar_height_pixels = self.height()-150
79            #self.canvas.bar_height_pixels = 50
80            self.canvas.displayStat(self.dataset, self.HighlightedAttribute, self.dist)
81            #self.canvasview.setCanvas(self.canvas)
82            #self.canvas.update()
83
84    def attributeHighlighted(self):
85        if self.attributes.selectedItems() == []: return
86        self.HighlightedAttribute = self.attributes.row(self.attributes.selectedItems()[0])
87        self.ch = self.height()-self.chbias
88        #self.canvas = DisplayStatistics (self.cw, self.ch)
89        self.canvas.canvasW, self.canvas.canvasH = self.cw, self.ch
90        self.canvas.bar_height_pixels = self.height()-160
91        self.canvas.displayStat(self.dataset, self.HighlightedAttribute, self.dist)
92        #self.canvasview.setCanvas(self.canvas)
93        #self.canvas.update()
94
95
96    def setData(self, data):
97        self.closeContext()
98
99        self.attributes.clear()
100        if data==None:
101            self.dataset = self.dist = self.stat = None
102            self.canvasview.hide()
103            self.send("Feature Statistics", None)
104        else:
105            self.canvasview.show()
106
107            self.dataset = data
108            self.dist = getCached(self.dataset, orange.DomainDistributions, (self.dataset,))
109
110            for a in self.dataset.domain:
111                self.attributes.addItem(QListWidgetItem(self.icons[a.varType], a.name))
112
113            self.stat = orange.DomainDistributions(data)
114            dt = orange.Domain(data.domain.variables)
115            id=orange.newmetaid()
116            dt.addmeta(id, orange.StringVariable("statistics"))
117            ndata = orange.ExampleTable(dt)
118            ndata.append([a.average() if a and a.variable.varType == orange.Variable.Continuous else "" for a in self.stat])
119            ndata.append([a.dev() if a and a.variable.varType == orange.Variable.Continuous else "" for a in self.stat])
120            ndata.append([a.modus() if a and a.variable.varType == orange.Variable.Discrete else "" for a in self.stat])
121            ndata[0][id] = "average"
122            ndata[1][id] = "variance"
123            ndata[2][id] = "modus"
124            self.send("Feature Statistics", ndata)
125
126        self.HighlightedAttribute = 0
127        self.openContext("", data)
128        self.attributes.setCurrentItem(self.attributes.item(self.HighlightedAttribute))
129
130
131    def saveToFileCanvas(self):
132        sizeDlg = OWChooseImageSizeDlg(self.canvas, parent=self)
133        sizeDlg.exec_()
134
135    def sendReport(self):
136        if self.dataset:
137            self.startReport("%s [%s]" % (self.windowTitle(), self.canvas.attr.name))
138            self.reportImage(lambda *x: OWChooseImageSizeDlg(self.canvas).saveImage(*x))
139        else:
140            self.startReport(self.windowTitle())
141"""
142class DisplayStatistics
143constructs a canvas to display some statistics
144"""
145class DisplayStatistics (QGraphicsScene):
146    def __init__(self, parent = None):
147        QGraphicsScene.__init__(self, parent)
148        self.bar_height_pixels=None
149        self.bar_width_pixels=None
150        self.vbias, self.hbias = 60, 200
151        self.parent = parent
152
153    def displayStat(self, data, ind, dist):
154        if not data:
155            return
156        self.vbias, self.hbias = 60, 200
157        for item in self.items():
158            self.removeItem(item)
159
160        self.attr = attr = data.domain[ind]
161        attr_name = OWQCanvasFuncts.OWCanvasText(self, attr.name, 10, 10)
162        if not dist[ind] or not dist[ind].items():
163            if not dist[ind]:
164                attr_name.setPlainText("The widget cannot show distributions for attributes of this type.")
165            else:
166                attr_name.setPlainText("The attribute has no defined values.")
167            return
168       
169        title_str = "Category"
170        if attr.varType == orange.VarTypes.Continuous:
171            title_str = "Values"
172        category = OWQCanvasFuncts.OWCanvasText(self, title_str, self.hbias-20, 30, Qt.AlignRight)
173
174        if attr.varType == orange.VarTypes.Discrete:
175            totalvalues = OWQCanvasFuncts.OWCanvasText(self, "Total Values", self.hbias+30, 30)
176            rect_len = 100
177            rect_width = 20
178            attrDist = dist[ind]
179            if len(attrDist) > 0 and max(attrDist) > 0:
180                if self.parent.sorting == 0:
181                    keys = attrDist.keys()
182                else:
183                    d = [(val, key) for (key, val) in attrDist.items()]
184                    d.sort()
185                    keys = [item[1] for item in d]
186                    if self.parent.sorting == 1:
187                        keys.reverse()
188                             
189                f = rect_len/max(attrDist)
190                for key in keys:
191                    t = OWQCanvasFuncts.OWCanvasText(self, key, self.hbias-10, self.vbias, Qt.AlignRight)
192                    bar_len = attrDist[key]*f
193                    if int(bar_len)==0 and bar_len!=0:
194                        bar_len=1
195                    r = OWQCanvasFuncts.OWCanvasRectangle(self, self.hbias, self.vbias, bar_len, rect_width-2, pen = QPen(Qt.NoPen), brushColor = QColor(0,0,254))
196
197                    t1 = OWQCanvasFuncts.OWCanvasText(self, "%i   (%2.1f %%)" % (attrDist[key], 100*attrDist[key]/(len(data) or 1)), self.hbias+attrDist[key]*rect_len/max(attrDist)+10, self.vbias, Qt.AlignLeft)
198                    self.vbias+=rect_width
199                if self.vbias > self.canvasH:
200                    self.canvasH = self.vbias+50
201        if attr.varType == orange.VarTypes.Continuous:
202            quartiles_list = reduce(lambda x, y: x+y, [[x[0]]*int(x[1]) for x in dist[ind].items()])
203            qlen = len(quartiles_list)
204            if qlen%2 == 0:
205                self.median = (quartiles_list[qlen/2] + quartiles_list[qlen/2 -1])/2.0
206            else:
207                self.median = quartiles_list[qlen/2]
208            if qlen%4 == 0:
209                self.q1 = (quartiles_list[qlen/4] + quartiles_list[qlen/4 -1])/2.0
210                self.q3 = (quartiles_list[3*qlen/4] + quartiles_list[3*qlen/4 -1])/2.0
211            else:
212                self.q1 = quartiles_list[qlen/4]
213                self.q3 = quartiles_list[3*qlen/4]
214            if self.bar_height_pixels==None: self.bar_height_pixels = 300
215            if self.bar_width_pixels==None: self.bar_width_pixels = 40
216            self.mini = quartiles_list[0]
217            self.maxi = quartiles_list[-1]
218            self.total_values = len(quartiles_list)
219            self.distinct_values = len(dist[ind])
220            self.mean = dist[ind].average()
221            self.stddev = dist[ind].dev()
222            self.drawCStat(dist[ind])
223
224    def drawCStat(self, dist):
225        # draw the main rectangle
226        bar_height = self.maxi-self.mini
227        #all = QCanvasRectangle (self.hbias, self.vbias, self.bar_width_pixels, self.bar_height_pixels, self)
228        #all.show()
229        textoffset = 15
230        # draw a max line and text
231        maxi_txt = OWQCanvasFuncts.OWCanvasText(self, "max")
232        # assume equal fonts for all the text
233        self.textHeight = maxi_txt.boundingRect().height()
234        maxvTextPos = self.vbias - self.textHeight*0.5
235        maxi_txt.setPos (self.hbias+self.bar_width_pixels+15, maxvTextPos)
236
237        maxi_txtL = OWQCanvasFuncts.OWCanvasText(self, "%5.2f" % self.maxi, self.hbias-textoffset, maxvTextPos, Qt.AlignRight)
238
239        max_line = OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, self.vbias, self.hbias+self.bar_width_pixels+5, self.vbias, z = 1)
240
241        # draw a min line and text
242        mini_txt = OWQCanvasFuncts.OWCanvasText(self, "min")
243        minvTextPos = self.bar_height_pixels+self.vbias - self.textHeight*0.5
244        mini_txt.setPos(self.hbias+self.bar_width_pixels+textoffset, minvTextPos)
245
246        mini_txtL = OWQCanvasFuncts.OWCanvasText(self, "%5.2f" % self.mini, self.hbias-textoffset, minvTextPos, Qt.AlignRight)
247
248        min_line = OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, self.vbias+self.bar_height_pixels, self.hbias+self.bar_width_pixels+5, self.vbias+self.bar_height_pixels, z = 1)
249
250        # draw a rectangle from the 3rd quartile to max; add line and text
251        quartile3 =  int(self.bar_height_pixels*(self.maxi-self.q3)/(bar_height or 1))
252        crq3 = OWQCanvasFuncts.OWCanvasRectangle(self, self.hbias, self.vbias, self.bar_width_pixels, quartile3, pen = QPen(Qt.NoPen), brushColor = QColor(207, 255, 207))
253
254        q3line = self.vbias + quartile3
255        line2 = OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q3line, self.hbias+self.bar_width_pixels+5, q3line, z = 1)
256
257        q3vTextPos = q3line - self.textHeight*0.5
258        crq3tR = OWQCanvasFuncts.OWCanvasText(self, "75%", self.hbias+self.bar_width_pixels+textoffset, q3vTextPos)
259
260        crq3tL = OWQCanvasFuncts.OWCanvasText(self, "%5.2f" % self.q3, self.hbias-textoffset, q3vTextPos, Qt.AlignRight)
261
262        # draw a rectangle from the median to the 3rd quartile; add line and text
263        med = int(self.bar_height_pixels*(self.maxi-self.median)/(bar_height or 1))
264        crm = OWQCanvasFuncts.OWCanvasRectangle(self, self.hbias, self.vbias+quartile3, self.bar_width_pixels, med-quartile3, pen = QPen(Qt.NoPen), brushColor = QColor(164, 239, 164))
265
266        mline = self.vbias + med
267        line3 = OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, mline, self.hbias+self.bar_width_pixels+5, mline, z = 1)
268
269        medvTextPos = mline - self.textHeight*0.5
270        crmtR = OWQCanvasFuncts.OWCanvasText(self, "median", self.hbias+self.bar_width_pixels+textoffset, medvTextPos)
271
272        crmtL = OWQCanvasFuncts.OWCanvasText(self, "%5.2f" % self.median, self.hbias-textoffset, medvTextPos, Qt.AlignRight)
273
274        # draw a rectangle from the 1st quartile to the median; add line and text
275        quartile1 = int(self.bar_height_pixels*(self.maxi-self.q1)/(bar_height or 1))
276        crq1 = OWQCanvasFuncts.OWCanvasRectangle(self, self.hbias, self.vbias+med, self.bar_width_pixels, quartile1-med, pen = QPen(Qt.NoPen), brushColor = QColor(126,233,126))
277        q1line = self.vbias + quartile1
278        line4 = OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q1line, self.hbias+self.bar_width_pixels+5, q1line, z = 1)
279
280        q1vTextPos = q1line - self.textHeight*0.5
281        crq1tR = OWQCanvasFuncts.OWCanvasText(self, "25%", self.hbias+self.bar_width_pixels+textoffset, q1vTextPos)
282
283        crq1tL = OWQCanvasFuncts.OWCanvasText(self, "%5.2f" % self.q1, self.hbias-textoffset, q1vTextPos, Qt.AlignRight)
284
285        # draw a rectangle from min to the 1st quartile
286        cr = OWQCanvasFuncts.OWCanvasRectangle(self, self.hbias, self.vbias+quartile1, self.bar_width_pixels, self.bar_height_pixels-quartile1, pen = QPen(Qt.NoPen), brushColor = QColor(91,207,91))
287
288        # draw a horizontal mean line; add text
289        self.meanpos = int(self.bar_height_pixels*(self.maxi-self.mean)/(bar_height or 1))
290        self.stddev1 = int(self.bar_height_pixels*self.stddev/(bar_height or 1))
291        #print "stddev ",self.stddev1, self.bar_height_pixels, bar_height
292        mvbias = self.meanpos+self.vbias
293        line = OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels, mvbias, self.hbias+self.bar_width_pixels +70, mvbias, penColor = QColor(255, 0, 0), z = 1)
294
295        meanvTextPos = mvbias - self.textHeight*0.5
296        t = OWQCanvasFuncts.OWCanvasText(self, "mean", self.hbias+self.bar_width_pixels+110, meanvTextPos, Qt.AlignRight)
297        t.setDefaultTextColor(QColor(255, 0, 0))
298
299        t3 = OWQCanvasFuncts.OWCanvasText(self, "%5.2f +- %5.2f" % (self.mean, self.stddev), self.hbias-textoffset, meanvTextPos, Qt.AlignRight)
300        t3.setDefaultTextColor(QColor(255, 0, 0))
301
302
303        # draw the short bold mean line in the bar
304        bline = OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels*0.25, mvbias, self.hbias+self.bar_width_pixels*0.75, mvbias, penColor = QColor(255, 0, 0), penWidth = 3, z = 1)
305
306        # draw the std dev. line
307        vert = OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels*0.5, mvbias-self.stddev1, self.hbias+self.bar_width_pixels*0.5, mvbias+self.stddev1, penColor = QColor(255, 0, 0), z = 1)
308
309        # display the numbers of total and distinct values
310        t1 = OWQCanvasFuncts.OWCanvasText(self, "%d total values" % self.total_values, 10,self.vbias+self.bar_height_pixels+20)
311
312        t2 = OWQCanvasFuncts.OWCanvasText(self, "%d distinct values" % self.distinct_values, 10,self.vbias+self.bar_height_pixels+40)
313
314        vspace = self.textHeight  # +4 space for text plus 2 pixels above and below
315        #pos =['max':maxvTextPos, 'q3':q3vTextPos, 'mean':meanvTextPos, 'med':medvTextPos, 'q1':q1vTextPos, 'min':minvTextPos]
316        #positions = [maxvTextPos, q3vTextPos, meanvTextPos, medvTextPos, q1vTextPos, minvTextPos]
317        if meanvTextPos < medvTextPos:
318            positions = [(maxvTextPos,'max'), (q3vTextPos,'q3'), (meanvTextPos,'mean'), (medvTextPos,'med'), (q1vTextPos,'q1'), (minvTextPos,'min')]
319        elif meanvTextPos > medvTextPos:
320            positions = [(maxvTextPos,'max'), (q3vTextPos,'q3'), (medvTextPos,'med'), (meanvTextPos,'mean'), (q1vTextPos,'q1'), (minvTextPos,'min')]
321        else: # mean == median; put median below or above mean (where there's more space)
322            if meanvTextPos-maxvTextPos >= minvTextPos-meanvTextPos:
323                positions = [(maxvTextPos,'max'), (q3vTextPos,'q3'), (medvTextPos,'med'), (meanvTextPos,'mean'), (q1vTextPos,'q1'), (minvTextPos,'min')]
324            else:
325                positions = [(maxvTextPos,'max'), (q3vTextPos,'q3'), (meanvTextPos,'mean'), (medvTextPos,'med'), (q1vTextPos,'q1'), (minvTextPos,'min')]
326        lp = len(positions)
327        mean_index = -1
328        for i in range(len(positions)):
329            if positions[i][1]=='mean':
330                mean_index = i
331                break
332        if mean_index==-1:
333            print "ERROR in OWAttributeStatistics"
334        #above = [positions[i] for i in range(mean_index,-1,-1)]
335        #below = [positions[i] for i in range(mean_index, lp)]
336        above = [i for i in positions if i[0]<=meanvTextPos]
337        below = [i for i in positions if i[0]>=meanvTextPos]
338        above.sort()
339        above.reverse()
340        below.sort()
341        above_space = above[0][0] - above[-1][0] - (len(above)-2)*vspace
342        below_space = below[-1][0] - below[0][0] - (len(below)-2)*vspace
343        for i in range(1,len(above)):
344            dif = above[i-1][0] - above[i][0]
345            if dif < vspace:
346                #if i==len(above)-1:
347                #    above[i-1] = (above[i-1][0] + vspace - dif, above[i-1][1])
348                #    print "ABOVE 1", i
349                #    print
350                #else:
351                above[i] = (above[i][0] - vspace + dif, above[i][1])
352        for i in range(1,len(below)):
353            dif = below[i][0] - below[i-1][0]
354            if dif < vspace:
355                below[i] = (below[i][0] + vspace - dif, below[i][1])
356        # move the text to the new coordinates
357        for i in range(1,len(above)):
358            val, lab = above[i][0], above[i][1]
359            if lab == 'max':
360                if val != maxvTextPos:
361                    maxi_txt.setPos(self.hbias+self.bar_width_pixels+textoffset, val)
362                    maxi_txtL.setPos(self.hbias-textoffset, val)
363                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, self.vbias, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
364                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
365                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, self.vbias, self.hbias-10, val+self.textHeight*0.5)
366                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
367            elif lab == 'q3':
368                if val != q3vTextPos:
369                    crq3tR.setPos(self.hbias+self.bar_width_pixels+textoffset, val)
370                    crq3tL.setPos(self.hbias-textoffset, val)
371                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, q3line, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
372                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
373                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q3line, self.hbias-10, val+self.textHeight*0.5)
374                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
375            elif lab == 'med':
376                if val != medvTextPos:
377                    crmtR.setPos (self.hbias+self.bar_width_pixels+15, val)
378                    crmtL.setPos (self.hbias-15, val)
379                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, mline, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
380                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
381                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, mline, self.hbias-10, val+self.textHeight*0.5)
382                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
383            elif lab == 'q1':
384                if val != q1vTextPos:
385                    crq1tR.setPos (self.hbias+self.bar_width_pixels+textoffset, val)
386                    crq1tL.setPos (self.hbias-textoffset, val)
387                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, q1line, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
388                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
389                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q1line, self.hbias-10, val+self.textHeight*0.5)
390                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
391        for i in range(1,len(below)):
392            val, lab = below[i][0], below[i][1]
393            if lab == 'min':
394                if val != minvTextPos:
395                    mini_txt.setPos (self.hbias+self.bar_width_pixels+textoffset, val)
396                    mini_txtL.setPos (self.hbias-textoffset, val)
397                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, self.bar_height_pixels+self.vbias, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
398                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
399                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, self.bar_height_pixels+self.vbias, self.hbias-10, val+self.textHeight*0.5)
400                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
401            elif lab == 'q1':
402                if val != q1vTextPos:
403                    crq1tR.setPos (self.hbias+self.bar_width_pixels+textoffset, val)
404                    crq1tL.setPos (self.hbias-textoffset, val)
405                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, q1line, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
406                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
407                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q1line, self.hbias-10, val+self.textHeight*0.5)
408                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
409            elif lab == 'med':
410                if val != medvTextPos:
411                    crmtR.setPos (self.hbias+self.bar_width_pixels+textoffset, val)
412                    crmtL.setPos (self.hbias-textoffset, val)
413                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, mline, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
414                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
415                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, mline, self.hbias-10, val+self.textHeight*0.5)
416                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
417            elif lab == 'q3':
418                if val != q3vTextPos:
419                    crq3tR.setPos (self.hbias+self.bar_width_pixels+textoffset, val)
420                    crq3tL.setPos (self.hbias-textoffset, val)
421                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+5, q3line, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5)
422                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias+self.bar_width_pixels+10, val+self.textHeight*0.5, self.hbias+self.bar_width_pixels+12, val+self.textHeight*0.5)
423                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-5, q3line, self.hbias-10, val+self.textHeight*0.5)
424                    OWQCanvasFuncts.OWCanvasLine(self, self.hbias-10, val+self.textHeight*0.5, self.hbias-12, val+self.textHeight*0.5)
425            if dist.cases <= 1000:
426                pen = QPen(Qt.black)
427                pen.setWidth(2)
428                pen.setStyle(Qt.SolidLine)
429                maxs = max(dist.values())
430                cent = self.hbias + self.bar_width_pixels/2.
431                fact = self.bar_width_pixels * 0.8 / maxs
432                for val, occ in dist.items():
433                    val = self.vbias+int(self.bar_height_pixels*(self.maxi-val)/(bar_height or 1))
434                    if occ > self.bar_width_pixels:
435                        r = QGraphicsLineItem(cent-fact*occ, val, cent+fact*occ, val, None, self)
436                        r.setPen(pen)
437                        r.setZValue(1)
438                    else:
439                        hocc = (occ-1)/2.
440                        for e in range(int(occ)):
441                            x = cent + (e - hocc) * fact
442                            r = QGraphicsLineItem(x, val, x, val, None, self)
443                            r.setPen(pen)
444                            r.setZValue(1)
445        #print
446
447
448#test widget appearance
449if __name__=="__main__":
450    a=QApplication(sys.argv)
451    ow=OWAttributeStatistics()
452    #data = orange.ExampleTable('adult_sample')
453    #data = orange.ExampleTable('adult_sample_noclass')
454    data = orange.ExampleTable(r"E:\Development\Orange Datasets\UCI\iris.tab")
455    ow.data(data)
456    ow.show()
457    a.exec_()
458    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.