Changeset 8290:04f5dfd293b7 in orange


Ignore:
Timestamp:
06/01/11 15:39:22 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
b8b7b274a4519256d2ad17f17a643fa034273cc6
Message:

Work on graph axes

Location:
orange/OrangeWidgets
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Graph/axis.py

    r8289 r8290  
    1010        The string to be displayed alongside the axis 
    1111         
     12    .. attribute:: title_above 
     13        A boolean which specifies whether the title should be placed above or below the axis 
     14        Normally the title would be above for top and left axes.  
     15         
     16    .. attribute:: arrows 
     17        A bitfield containing ArrowEnd if an arrow should be drawn at the line's end (line.p2())  
     18        and ArrowStart if there should be an arrows at the first point.  
     19         
     20        By default, there's an arrow at the end of the line 
     21         
    1222    .. method:: make_title 
    1323        Makes a pretty title, with the quantity title in italics and the unit in normal text 
    14          
     24                 
    1525    .. method:: label_pos 
    1626        Controls where the axis title and tick marks are placed relative to the axis 
    1727""" 
    1828 
    19 from PyQt4.QtGui import QGraphicsItemGroup, QGraphicsLineItem, QGraphicsTextItem 
     29from PyQt4.QtGui import QGraphicsItemGroup, QGraphicsLineItem, QGraphicsTextItem, QPainterPath, QGraphicsPathItem, QGraphicsScene 
    2030from PyQt4.QtCore import QLineF 
    2131 
    2232from palette import * 
    2333 
    24 LabelBelow = 0 
    25 LabelAbove = 1 
    26 LabelLeft = 2 
    27 LabelRight = 3 
     34TitleBelow = 0 
     35TitleAbove = 1 
     36 
     37ArrowEnd = 1 
     38ArrowStart = 2 
    2839 
    2940class Axis(QGraphicsItemGroup): 
    30     def __init__(self, parent=None): 
     41    def __init__(self, title_above, arrows = ArrowEnd, parent=None): 
    3142        QGraphicsItemGroup.__init__(self, parent) 
    3243        self.title = None 
    3344        self.line = None 
    3445        self.size = None 
     46        self.scale = None 
     47        self.arrows = arrows 
     48        self.title_above = title_above 
    3549        self.style = shared_palette().axis_style 
    3650        self.line_item = QGraphicsLineItem(self) 
    3751        self.title_item = QGraphicsTextItem(self) 
    38      
    39     def __init__(self, size, title, line, style=None, parent=None): 
    40         QGraphicsItemGroup.__init__(self, parent) 
    41         self.size = size 
    42         self.line = line 
    43         self.title = title 
    44         if style: 
    45             self.style = style 
    46         else: 
    47             self.style = shared_palette().axis_style 
    48         self.line_item = QGraphicsLineItem(self) 
    49         self.title_item = QGraphicsTextItem(self) 
    50         self.update() 
     52        self.end_arrow_item = None 
     53        self.start_arrow_item = None 
     54        self.show_title = True 
     55        self.scale = (0, 100, 1) 
     56        path = QPainterPath() 
     57        path.setFillRule(Qt.WindingFill) 
     58        path.lineTo(-20, 10) 
     59        path.lineTo(-10, 0) 
     60        path.lineTo(-20, -10) 
     61        path.lineTo(0, 0) 
     62        self.arrow_path = path 
    5163 
    5264    def update(self): 
    53         if not self.line or not self.title: 
    54             return; 
     65        if not self.line or not self.title or not self.scene(): 
     66            return 
    5567        if not self.style: 
    5668            self.style = shared_palette().axis_style 
     
    5971        self.title_item.setHtml(self.title) 
    6072        title_pos = (self.line.p1() + self.line.p2())/2 
     73        if self.title_above: 
     74            v = self.line.normalVector().unitVector() 
     75            title_pos = title_pos + (v.p2() - v.p1())*30 
    6176        ## TODO: Move it according to self.label_pos 
    6277        self.title_item.setVisible(self.show_title) 
    6378        self.title_item.setPos(title_pos) 
    64         self.title_item.setRotation(self.line.angle()) 
     79        self.title_item.setRotation(-self.line.angle()) 
     80         
     81        ## Arrows 
     82        if self.start_arrow_item: 
     83            self.scene().removeItem(self.start_arrow_item) 
     84            self.start_arrow_item = None 
     85        if self.end_arrow_item: 
     86            self.scene().removeItem(self.end_arrow_item) 
     87            self.end_arrow_item = None 
     88             
     89        if self.arrows & ArrowStart: 
     90            self.start_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
     91            self.start_arrow_item.setPos(self.line.p1()) 
     92            self.start_arrow_item.setRotation(self.line.angle()) 
     93            self.start_arrow_item.setBrush(self.style.brush()) 
     94        if self.arrows & ArrowEnd: 
     95            self.end_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
     96            self.end_arrow_item.setPos(self.line.p2()) 
     97            self.end_arrow_item.setRotation(-self.line.angle()) 
     98            self.end_arrow_item.setBrush(self.style.brush()) 
    6599         
    66100    @staticmethod 
  • orange/OrangeWidgets/Graph/legend.py

    r8272 r8290  
    1111        QGraphicsItemGroup.__init__(self, None, scene) 
    1212        self.items = [] 
     13         
     14    def clear(self): 
     15        self.items = [] 
  • orange/OrangeWidgets/QtGraph.py

    r8288 r8290  
    6262        self.parent_name = name 
    6363        self.show_legend = show_legend 
    64         self.legend = None 
     64        self._legend = None 
    6565        self.title_item = None 
    6666         
     
    6868        self.setScene(self.canvas) 
    6969         
    70         self.shown_axes = [xBottom, yLeft] 
    7170        self.axes = dict() 
    7271        self.axis_margin = 150 
     
    8281        self.setCanvasBackground = self.setCanvasColor 
    8382         
     83        # OWScatterPlot needs these: 
     84        self.alphaValue = 1 
     85        self.useAntialiasing = False 
     86         
    8487        self.palette = palette.shared_palette() 
    8588        self.curveSymbols = self.palette.curve_symbols 
     
    8992        self.curves = [] 
    9093        self.data_range = {xBottom : (0, 1), yLeft : (0, 1)} 
     94        self.addAxis(xBottom, False) 
     95        self.addAxis(yLeft, True) 
    9196         
    9297        self.map_to_graph = self.map_to_graph_cart 
     
    103108         
    104109    def update(self): 
    105         if self.show_legend and not self.legend: 
    106             self.legend = legend.Legend(self.canvas) 
    107             self.legend.show() 
    108         if not self.show_legend and self.legend: 
    109             self.legend.hide() 
    110             self.legend = None 
     110        if self.show_legend and not self._legend: 
     111            self._legend = legend.Legend(self.canvas) 
     112            self._legend.show() 
     113        if not self.show_legend and self._legend: 
     114            self._legend.hide() 
     115            self._legend = None 
    111116        self.replot() 
    112117             
     
    126131        if not axes: 
    127132            axes = [xBottom, yLeft] 
    128         min_x, max_x = self.data_range[axes[0]] 
    129         min_y, max_y = self.data_range[axes[1]] 
     133        min_x, max_x, t = self.axes[axes[0]].scale 
     134        min_y, max_y, t = self.axes[axes[1]].scale 
    130135        rect = self.graph_area 
    131136        rx = (px - min_x) * rect.width() / (max_x - min_x) 
     
    175180         
    176181    def setXaxisTitle(self, title): 
    177         self.setAxisTitle(xBottom, b) 
     182        self.setAxisTitle(xBottom, title) 
    178183 
    179184    def setShowYLaxisTitle(self, b = -1): 
     
    223228    def setAxisScale(self, axis_id, min, max, step_size=0): 
    224229        self.axes[axis_id].set_scale(min, max, step_size) 
    225         pass 
    226230         
    227231    def setAxisTitle(self, axis_id, title): 
     
    246250                 symbol = palette.EllipseShape, enableLegend = 0, xData = [], yData = [], showFilledSymbols = None, 
    247251                 lineWidth = 1, pen = None, autoScale = 0, antiAlias = None, penAlpha = 255, brushAlpha = 255): 
    248         self.data_range[xBottom] = ( min(xData), max(xData) ) 
    249         self.data_range[yLeft] = ( min(yData), max(yData) ) 
    250252        data = [] 
    251253        for i in range(len(xData)): 
     
    259261        return c 
    260262         
    261     def addAxis(self, axis_id): 
    262         self.axes[id] = Axis() 
    263         pass         
     263    def addAxis(self, axis_id, title_above = False): 
     264        self.axes[axis_id] = axis.Axis(title_above) 
    264265     
    265266    def removeAllSelections(self): 
     
    298299            axis_rects[xTop] = top_rect 
    299300            graph_rect.setTop(graph_rect.top() + margin) 
    300         if yLeft in self.shown_axes and self.axes[yLeft].isVisible(): 
     301        if yLeft in self.axes and self.axes[yLeft].isVisible(): 
    301302            left_rect = QRectF(graph_rect) 
    302303            left = graph_rect.left() + margin 
     
    308309            if xTop in axis_rects: 
    309310                axis_rects[xTop].setLeft(left) 
    310         if yRight in self.shown_axes and self.axes[yRight].isVisible(): 
     311        if yRight in self.axes and self.axes[yRight].isVisible(): 
    311312            right_rect = QRectF(graph_rect) 
    312313            right = graph_rect.right() - margin 
     
    330331                line = QLineF(rect.bottomLeft(), rect.bottomRight()) 
    331332            elif id is yLeft: 
    332                 line = QLineF(rect.topRight(), rect.bottomRight()) 
     333                line = QLineF(rect.bottomRight(), rect.topRight()) 
    333334            elif id is yRight: 
    334                 line = QLineF(rect.topLeft(), rect.bottomLeft()) 
     335                line = QLineF(rect.bottomLeft(), rect.topLeft()) 
    335336            line.translate(-rect.topLeft()) 
    336337            a = self.axes[id] 
    337             a.setSize(rect.size()) 
    338             a.setLine(line) 
     338            a.set_size(rect.size()) 
     339            a.set_line(line) 
    339340            a.setPos(rect.topLeft()) 
    340341            self.canvas.addItem(a) 
     342            a.update() 
    341343            a.show() 
    342344             
     
    344346            c.update() 
    345347        self.setSceneRect(self.canvas.itemsBoundingRect()) 
     348         
     349    def legend(self): 
     350        return self._legend 
  • orange/OrangeWidgets/Visualize/OWScatterPlotGraph.py

    r8274 r8290  
    119119            labels = None 
    120120        self.setXlabels(labels) 
    121        # self.setAxisScale(xBottom, xmin, xmax + showContinuousColorLegend * xVar * 0.07, discreteX) 
     121        self.setAxisScale(xBottom, xmin, xmax, discreteX) 
    122122 
    123123        # set axis for y attribute 
Note: See TracChangeset for help on using the changeset viewer.