source: orange/orange/OrangeWidgets/Visualize/OWSurveyPlotGraph.py @ 6538:a5f65d7f0b2c

Revision 6538:a5f65d7f0b2c, 5.6 KB checked in by Mitar <Mitar@…>, 4 years ago (diff)

Made XPM version of the icon 32x32.

Line 
1from OWGraph import *
2from orngScaleData import *
3
4DONT_SHOW_TOOLTIPS = 0
5VISIBLE_ATTRIBUTES = 1
6ALL_ATTRIBUTES = 2
7
8
9class OWSurveyPlotGraph(OWGraph, orngScaleData):
10    def __init__(self, parent = None, name = None):
11        "Constructs the graph"
12        OWGraph.__init__(self, parent, name)
13        orngScaleData.__init__(self)
14        self.selectedRectangle = None
15        self.exampleTracking = 1
16        self.length = 0 # number of shown attributes - we need it also in mouse movement
17        self.enabledLegend = 0
18        self.tooltipKind = 1
19        self.attrLabels = []
20
21    def setData(self, data, **args):
22        OWGraph.setData(self, data)
23        orngScaleData.setData(self, data, **args)
24
25    #
26    # update shown data. Set labels, coloring by className ....
27    def updateData(self, labels):
28        self.clear()
29        self.selectedRectangle = None
30        self.tips.removeAll()
31
32        self.attrLabels = labels
33        self.length = len(labels)
34        indices = [self.attributeNameIndex[label] for label in labels]
35
36        if self.noJitteringScaledData == None or len(self.noJitteringScaledData) == 0 or len(labels) == 0:
37            self.setAxisScaleDraw(QwtPlot.xBottom, DiscreteAxisScaleDraw(labels))
38            self.setAxisScale(QwtPlot.yLeft, 0, 1, 1)
39            return
40
41        validData = self.getValidList(indices)
42        totalValid = sum(validData)
43
44        self.setAxisScale(QwtPlot.yLeft, 0, totalValid, totalValid)
45        self.setAxisScale(QwtPlot.xBottom, -0.5, len(labels)-0.5, 1)
46        self.setAxisScaleDraw(QwtPlot.xBottom, DiscreteAxisScaleDraw(labels))
47        self.axisScaleDraw(QwtPlot.xBottom).enableComponent(QwtScaleDraw.Backbone, 0)
48        self.axisScaleDraw(QwtPlot.xBottom).enableComponent(QwtScaleDraw.Ticks, 0)
49
50        # draw vertical lines that represent attributes
51        for i in range(len(labels)):
52            self.addCurve("", style = QwtPlotCurve.Lines, symbol = QwtSymbol.NoSymbol, xData = [i,i], yData = [0, 1])
53
54        xRectsToAdd = {}
55        yRectsToAdd = {}
56        classNameIndex = -1
57        if self.rawData.domain.classVar:
58            classNameIndex = self.attributeNameIndex[self.rawData.domain.classVar.name]
59            if self.rawData.domain.classVar.varType == orange.VarTypes.Discrete:
60                classValDict = getVariableValueIndices(self.dataDomain.classVar)
61                #self.discPalette.setNumberOfColors(len(classValDict.keys()))
62
63        y = 0
64        for i in range(len(self.rawData)):
65            if validData[i] == 0: continue
66            if classNameIndex == -1: newColor = (0,0,0)
67            elif self.rawData.domain.classVar.varType == orange.VarTypes.Discrete: newColor = self.discPalette.getRGB(classValDict[self.rawData[i].getclass().value])
68            else: newColor = self.contPalette.getRGB(self.noJitteringScaledData[classNameIndex][i])
69
70            for j in range(self.length):
71                width = self.noJitteringScaledData[indices[j]][i] * 0.45
72                if not xRectsToAdd.has_key(newColor):
73                    xRectsToAdd[newColor] = []
74                    yRectsToAdd[newColor] = []
75                xRectsToAdd[newColor].extend([j-width, j+width, j+width, j-width])
76                yRectsToAdd[newColor].extend([y, y, y+1, y+1])
77            y += 1
78
79        for key in xRectsToAdd.keys():
80            RectangleCurve(QPen(QColor(*key)), QBrush(QColor(*key)), xRectsToAdd[key], yRectsToAdd[key]).attach(self)
81
82        if self.enabledLegend and self.rawData.domain.classVar and self.rawData.domain.classVar.varType == orange.VarTypes.Discrete:
83            classValues = getVariableValuesSorted(self.dataDomain.classVar)
84            self.addCurve("<b>" + self.rawData.domain.classVar.name + ":</b>", QColor(0,0,0), QColor(0,0,0), 0, symbol = QwtSymbol.NoSymbol, enableLegend = 1)
85            for ind in range(len(classValues)):
86                self.addCurve(classValues[ind], self.discPalette[ind], self.discPalette[ind], 15, symbol = QwtSymbol.Rect, enableLegend = 1)
87        self.replot()
88
89
90    # show rectangle with example shown under mouse cursor
91    def mouseMoveEvent(self, e):
92        if self.selectedRectangle:
93            self.selectedRectangle.detach()
94            self.selectedRectangle = None
95
96        if self.mouseCurrentlyPressed:
97            OWGraph.mouseMoveEvent(self, e)
98        elif not self.rawData:
99            return
100        else:
101            canvasPos = self.canvas().mapFrom(self, e.pos())
102            yFloat = math.floor(self.invTransform(QwtPlot.yLeft, canvasPos.y()))
103            if self.exampleTracking:
104                width = 0.49
105                xData = [-width, self.length+width-1, self.length+width-1, -width, -width]
106                yData = [yFloat, yFloat, yFloat+1, yFloat+1, yFloat]
107                self.selectedRectangle = self.addCurve("", style=QwtPlotCurve.Lines, symbol=QwtSymbol.NoSymbol, xData=xData, yData=yData)
108                self.replot()
109            else:
110                OWGraph.mouseMoveEvent(self, e)
111
112            if (self.tooltipKind == VISIBLE_ATTRIBUTES and self.attrLabels != []) or self.tooltipKind == ALL_ATTRIBUTES:
113                if int(yFloat) >= len(self.rawData): return
114                if self.tooltipKind == VISIBLE_ATTRIBUTES:      text = self.getExampleTooltipText(self.rawData[int(yFloat)], self.attrLabels)
115                else:                                           text = self.getExampleTooltipText(self.rawData[int(yFloat)], [])
116                OWGraph.mouseMoveEvent(self, e)
117                self.showTip(e.x(), e.y(), text)
118
119if __name__== "__main__":
120    #Draw a simple graph
121    a = QApplication(sys.argv)
122    c = OWSurveyPlotGraph()
123
124    a.setMainWidget(c)
125    c.show()
126    a.exec_()
Note: See TracBrowser for help on using the repository browser.