Changeset 8710:6a7be72c9bed in orange


Ignore:
Timestamp:
08/15/11 10:16:42 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
e417352a3f15f17a0d187ad698b032bec02009ec
Message:

Improve Distribution curve, axis labels display, and axis behavior with more than one Y axis.

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Visualize Qt/OWDistributionsQt.py

    r8687 r8710  
    2323 
    2424class distribErrorBarCurve(OWCurve): 
     25    DistributionCurve = OWCurve.UserCurve + 15 
    2526    def __init__(self, text = None): 
    26         self._items = [] 
    27         OWCurve.__init__(self,xData=[], yData=[]) 
     27        OWCurve.__init__(self) 
     28        self._item = QGraphicsPathItem(self) 
    2829        self._currently_updating = False 
     30        self.set_style(OWCurve.Lines) 
    2931         
    3032    def update_properties(self): 
    31         if self._currently_updating: 
    32             OWCurve.update_properties(self) 
    33             self._currently_updating = False 
    34             return 
    35              
    36         self._currently_updating = True 
    37         if self.style() != OWCurve.UserCurve: 
    38             resize_plot_item_list(self._items, 0, None, self) 
    39             self.items = [] 
    40             self.set_dirty() 
    41         else: 
    42             t = self.graph_transform() 
     33        if self.style() != OWCurve.NoCurve: 
     34            self.set_points([]) 
     35         
     36        self._item.setVisible(self.style() != OWCurve.NoCurve) 
     37         
     38        if self.style() == OWCurve.Lines: 
     39            self._item.setPath(self.continuous_path()) 
     40        elif self.style() == OWCurve.NoCurve: 
     41            self.update_number_of_points() 
     42            self.update_point_coordinates() 
     43        elif self.style() == self.DistributionCurve: 
    4344            d = self.data() 
    4445            n = len(d)/3 
    45             resize_plot_item_list(self._items, n, QGraphicsPathItem, self) 
     46            p = QPainterPath() 
    4647            for i in range(n): 
    47                 p = QPainterPath() 
    4848                px, py1 = d[3*i] 
    4949                _, py2 = d[3*i+1] 
     
    5757                p.moveTo(pxl, py3) 
    5858                p.lineTo(pxr, py3) 
    59                 self._items[i].setPath(t.map(p)) 
    60                 self._items[i].setPen(self.pen()) 
    61         self._currently_updating = False 
     59            self._item.setPath(self.graph_transform().map(p)) 
     60         
    6261 
    6362class OWDistributionGraphQt(OWPlot): 
     
    139138            labels = self.data.domain[self.attributeName].values.native() 
    140139            self.setXlabels(labels) 
    141             self.setAxisScale(xBottom, -0.5, len(labels) - 0.5, 1) 
    142  
     140             
    143141        self.calcHistogramAndProbGraph() 
    144142        self.refreshVisibleOutcomes() 
    145  
    146143 
    147144    def setNumberOfBars(self, n): 
     
    399396            else: 
    400397                if self.showConfidenceIntervals: 
    401                     self.probCurveKey.set_style(OWCurve.UserCurve) 
     398                    self.probCurveKey.set_style(distribErrorBarCurve.DistributionCurve) 
    402399                else: 
    403400                    self.probCurveKey.set_style(OWCurve.Dots) 
     
    406403            self.setShowYRaxisTitle(0) 
    407404         
    408  
    409         def enableIfExists(curve, en): 
    410             if curve: 
    411                 curve.setVisible(en) 
    412  
    413         enableIfExists(self.probCurveKey, self.showProbabilities) 
    414         enableIfExists(self.probCurveUpperCIKey, self.showConfidenceIntervals and self.showProbabilities) 
    415         enableIfExists(self.probCurveLowerCIKey, self.showConfidenceIntervals and self.showProbabilities) 
     405        self.probCurveKey.setVisible(self.showProbabilities) 
     406        self.probCurveUpperCIKey.setVisible(self.showConfidenceIntervals and self.showProbabilities) 
     407        self.probCurveLowerCIKey.setVisible(self.showConfidenceIntervals and self.showProbabilities) 
    416408        self.replot() 
    417409 
  • orange/OrangeWidgets/Visualize Qt/OWParallelCoordinatesQt.py

    r8687 r8710  
    2020class OWParallelCoordinatesQt(OWVisWidget): 
    2121    settingsList = ["graph.jitterSize", "graph.showDistributions", 
    22                     "graph.showAttrValues", "graph.useAntialiasing", 
     22                    "graph.showAttrValues", "graph.antialias_plot", 
    2323                    "graph.useSplines", "graph.alphaValue", "graph.alphaValue2", "graph.show_legend", "autoSendSelection", 
    2424                    "toolbarSelection", "graph.showStatistics", "colorSettings", "selectedSchemaIndex", "showAllAttributes"] 
     
    9292 
    9393        OWGUI.checkBox(box, self, 'graph.showAttrValues', 'Show attribute values', callback = self.updateGraph) 
    94         OWGUI.checkBox(box, self, 'graph.useAntialiasing', 'Use antialiasing', callback = self.updateGraph) 
    9594        OWGUI.checkBox(box, self, 'graph.useSplines', 'Show splines', callback = self.updateGraph, tooltip  = "Show lines using splines") 
    9695        OWGUI.checkBox(box, self, 'graph.show_legend', 'Show legend', callback = self.updateGraph) 
  • orange/OrangeWidgets/plot/owaxis.py

    r8642 r8710  
    4444 
    4545class OWAxis(QGraphicsItem): 
    46     def __init__(self, id, title = '', title_above = False, title_location = AxisMiddle, line = None, arrows = AxisEnd, parent=None, scene=None): 
    47         QGraphicsItem.__init__(self, parent, scene) 
     46    def __init__(self, id, title = '', title_above = False, title_location = AxisMiddle, line = None, arrows = AxisEnd, plot = None): 
     47        QGraphicsItem.__init__(self) 
    4848        self.setFlag(QGraphicsItem.ItemHasNoContents) 
    4949        self.setZValue(AxisZValue) 
     
    5252        self.title_location = title_location 
    5353        self.data_line = line 
     54        self.plot = plot 
    5455        self.graph_line = None 
    5556        self.size = None 
     
    7879        self.labels = None 
    7980        self.auto_range = None 
     81        self.auto_scale = True 
    8082         
    8183        self.zoomable = False 
     
    8991        major, medium, minor = self.tick_length 
    9092        if self.labels is not None: 
    91             for i in range(len(self.labels)): 
    92                 self._ticks.append( ( i, self.labels[i], medium ) ) 
     93            for i, text in enumerate(self.labels): 
     94                self._ticks.append( ( i, text, medium, 1 ) ) 
    9395        else: 
    9496            if self.scale: 
     
    117119            val = ceil(min/step) * step 
    118120            while val <= max: 
    119                 self._ticks.append( ( val, "%.4g" % val, medium ) ) 
     121                self._ticks.append( ( val, "%.4g" % val, medium, step ) ) 
    120122                val = val + step 
    121123                 
     
    185187        resize_plot_item_list(self.tick_items, n, QGraphicsLineItem, self) 
    186188         
    187         if self.scale: 
    188             _min, _max, step = self.scale 
    189         else: 
    190             step = 1 
    191         hs = 0.5 * step 
    192          
    193189        test_rect = QRectF(self.graph_line.p1(),  self.graph_line.p2()).normalized() 
    194190        test_rect.adjust(-1, -1, 1, 1) 
     
    202198        l_p = l_v.p2() - l_v.p1() 
    203199        for i in range(n): 
    204             pos, text, size = self._ticks[i] 
     200            pos, text, size, step = self._ticks[i] 
     201            hs = 0.5 * step 
    205202            tick_pos = self.map_to_graph( pos ) 
    206203            if not test_rect.contains(tick_pos): 
     
    258255        self.labels = labels 
    259256        self.graph_line = None 
     257        self.auto_scale = False 
    260258        self.update_ticks() 
    261259        self.update_graph() 
     
    264262        self.scale = (min, max, step_size) 
    265263        self.graph_line = None 
     264        self.auto_scale = False 
    266265        self.update_ticks() 
    267266        self.update_graph() 
     
    272271         
    273272    def map_to_graph(self, x): 
    274         if self.scale: 
    275             min, max, _step = self.scale 
    276         elif self.auto_range: 
    277             min, max = self.auto_range 
    278         else: 
    279             return QPointF() 
     273        min, max = self.plot.bounds_for_axis(self.id) 
    280274        if min == max: 
    281275            return QPointF() 
     
    306300            self.update_ticks() 
    307301        return self._ticks 
     302         
     303    def bounds(self): 
     304        if self.labels: 
     305            return -0.2, len(self.labels) -0.8 
     306        elif self.scale: 
     307            min, max, _step = self.scale 
     308            return min, max 
     309        elif self.auto_range: 
     310            return self.auto_range 
     311        else: 
     312            return 0, 1 
     313         
  • orange/OrangeWidgets/plot/owplot.py

    r8708 r8710  
    6161    "setAxisScale" : "set_axis_scale", 
    6262    "setAxisLabels" : "set_axis_labels",  
     63    "setAxisAutoScale" : "set_axis_autoscale", 
    6364    "setTickLength" : "set_axis_tick_length", 
    6465    "updateCurves" : "update_curves", 
     
    562563        elif xTop in self.axes: 
    563564            self.set_axis_labels(xTop, labels) 
     565             
     566    def set_axis_autoscale(self, axis_id): 
     567        if axis_id in self.axes: 
     568            self.axes[axis_id].auto_scale = True 
     569        elif axis_id in self.data_range: 
     570            del self.data_range[axis_id] 
    564571         
    565572    def set_axis_labels(self, axis_id, labels): 
     
    752759            Creates an :obj:`OrangeWidgets.plot.OWAxis` with the specified ``axis_id`` and ``title``.  
    753760        ''' 
    754         a = OWAxis(axis_id, title, title_above, title_location, line, arrows, scene=self.scene()) 
     761        a = OWAxis(axis_id, title, title_above, title_location, line, arrows, self) 
     762        self.scene().addItem(a) 
    755763        a.zoomable = zoomable 
    756764        a.update_callback = self.replot 
     
    12521260        """ 
    12531261        if x_axis in self.axes and y_axis in self.axes: 
    1254             x_min, x_max = self.bounds_for_axis(x_axis, try_auto_scale=False) 
    1255             y_min, y_max = self.bounds_for_axis(y_axis, try_auto_scale=False) 
    1256             if x_min and x_max and y_min and y_max: 
    1257                 return QRectF(x_min, y_min, x_max-x_min, y_max-y_min) 
     1262            x_min, x_max = self.bounds_for_axis(x_axis, try_auto_scale=True) 
     1263            y_min, y_max = self.bounds_for_axis(y_axis, try_auto_scale=True) 
     1264            if (x_min or x_max) and (y_min or y_max): 
     1265                r = QRectF(x_min, y_min, x_max-x_min, y_max-y_min) 
     1266                return r 
    12581267        r = orangeqt.Plot.data_rect_for_axes(self, x_axis, y_axis) 
    12591268        for id, axis in self.axes.iteritems(): 
     
    13171326         
    13181327    def bounds_for_axis(self, axis_id, try_auto_scale=True): 
    1319         if axis_id in self.axes: 
    1320             if self.axes[axis_id].scale: 
    1321                 m, M, t = self.axes[axis_id].scale 
    1322                 return m, M 
    1323             elif self.axes[axis_id].labels: 
    1324                 return -0.2, len(self.axes[axis_id].labels) - 0.8 
     1328        if axis_id in self.axes and not self.axes[axis_id].auto_scale: 
     1329            return self.axes[axis_id].bounds() 
    13251330        if try_auto_scale: 
    13261331            return orangeqt.Plot.bounds_for_axis(self, axis_id) 
  • orange/OrangeWidgets/plot/owtools.py

    r8696 r8710  
    494494        path = QPainterPath() 
    495495        if self._x_enabled and x_id in p.axes: 
    496             for pos, label, size in p.axes[x_id].ticks(): 
     496            for pos, label, size, _w in p.axes[x_id].ticks(): 
    497497                path.moveTo(pos, rect.bottom()) 
    498498                path.lineTo(pos, rect.top()) 
    499499        if self._y_enabled and y_id in p.axes: 
    500             for pos, label, size in p.axes[y_id].ticks(): 
     500            for pos, label, size, _w in p.axes[y_id].ticks(): 
    501501                path.moveTo(rect.left(), pos) 
    502502                path.lineTo(rect.right(), pos) 
  • source/orangeqt/curve.cpp

    r8699 r8710  
    9393    p.setWidthF(m_pen.widthF()/m_zoom_transform.determinant()); 
    9494    m_lineItem->setPen(p); 
    95     m_line = QPainterPath(); 
    96     if (!m_data.isEmpty()) 
    97     { 
    98       m_line.moveTo(QPointF(m_data[0].x, m_data[0].y) * m_graphTransform); 
    99       int n = m_data.size(); 
    100       QPointF p; 
    101       for (int i = 1; i < n; ++i) 
    102       { 
    103         p = QPointF(m_data[i].x, m_data[i].y); 
    104         m_line.lineTo(m_graphTransform.map(p)); 
    105       } 
    106     } 
    107     m_lineItem->setPath(m_line); 
     95    m_lineItem->setPath(continuous_path()); 
    10896    return; 
    10997  }  
     
    321309    } 
    322310  } else { 
    323     m_line = QPainterPath(); 
    324311    delete m_lineItem; 
    325312    m_lineItem = 0; 
     
    480467} 
    481468 
    482  
    483  
     469QPainterPath Curve::continuous_path() 
     470{ 
     471    QPainterPath path; 
     472    if (m_data.isEmpty()) 
     473    { 
     474        return path; 
     475    } 
     476    path.moveTo(m_data[0]); 
     477    int n = m_data.size(); 
     478    QPointF p; 
     479    for (int i = 1; i < n; ++i) 
     480    { 
     481        path.lineTo(m_data[i]); 
     482    } 
     483    return m_graphTransform.map(path); 
     484} 
    484485 
    485486#include "curve.moc" 
  • source/orangeqt/curve.h

    r8699 r8710  
    173173  virtual void set_zoom_transform(const QTransform& transform); 
    174174   
    175   double max_x_value() const; 
    176   double min_x_value() const; 
    177   double max_y_value() const; 
    178   double min_y_value() const; 
     175  QPainterPath continuous_path(); 
    179176 
    180177  enum UpdateFlag 
     
    242239  bool m_autoUpdate; 
    243240    QGraphicsPathItem* m_lineItem; 
    244     QPainterPath m_line; 
    245241     
    246242  QPen m_pen; 
  • source/orangeqt/curve.sip

    r8694 r8710  
    7777  bool auto_update() const; 
    7878  void set_auto_update(bool auto_update); 
     79 
     80  QPainterPath continuous_path(); 
    7981   
    8082  enum UpdateFlag 
Note: See TracChangeset for help on using the changeset viewer.