Ignore:
Timestamp:
11/19/13 13:38:00 (5 months ago)
Author:
astaric
Branch:
default
Message:

Fixed a bug in ParallelGraphQt.

When lines were shown without splines, an additional line was drawn,
connecting last value of one example with the first value of the next example.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/VisualizeQt/OWParallelGraphQt.py

    r11474 r11767  
    501501 
    502502 
    503  
    504503# #################################################################### 
    505504# a curve that is able to draw several series of lines 
    506505class ParallelCoordinatesCurve(OWCurve): 
    507     def __init__(self, attrCount, yData, color, name = ""): 
     506    def __init__(self, n_attributes, y_values, color, name=""): 
    508507        OWCurve.__init__(self, tooltip=name) 
    509     self._item = QGraphicsPathItem(self) 
     508        self._item = QGraphicsPathItem(self) 
     509        self.path = QPainterPath() 
    510510        self.fitted = False 
     511 
     512        self.n_attributes = n_attributes 
     513        self.n_rows = int(len(y_values) / n_attributes) 
     514 
    511515        self.set_style(OWCurve.Lines) 
    512  
    513         lineCount = len(yData) / attrCount 
    514         self.attrCount = attrCount 
    515  
    516         if type(color) == tuple: 
     516        if isinstance(color,  tuple): 
    517517            self.set_pen(QPen(QColor(*color))) 
    518518        else: 
    519519            self.set_pen(QPen(QColor(color))) 
    520              
    521     self.set_data(range(attrCount) * lineCount, yData) 
     520 
     521        x_values = list(range(n_attributes)) * self.n_rows 
     522        self.set_data(x_values, y_values) 
    522523 
    523524    def update_properties(self): 
    524     if self.fitted: 
    525         path = self.cubicPath() 
    526     else: 
    527         path = QPainterPath() 
    528         for x, y in self.data(): 
    529         path.lineTo(x, y) 
    530         self._item.setPath(self.graph_transform().map(path)) 
     525        self.redraw_path() 
     526 
     527    def redraw_path(self): 
     528        self.path = QPainterPath() 
     529        for segment in self.segment(self.data()): 
     530            if self.fitted: 
     531                self.draw_cubic_path(segment) 
     532            else: 
     533                self.draw_normal_path(segment) 
     534        self._item.setPath(self.graph_transform().map(self.path)) 
    531535        self._item.setPen(self.pen()) 
    532      
    533     def cubicPath(self): 
    534         path = QPainterPath() 
    535         data = self.data() 
    536         for i in range(len(data) / self.attrCount): 
    537             segment = data[i*self.attrCount: (i + 1)*self.attrCount] 
    538             for i, p in enumerate(segment[:-1]): 
    539                 x1, y1 = p 
    540                 x2, y2 = segment[i + 1] 
    541                 path.moveTo(x1, y1) 
    542                 path.cubicTo(QPointF(x1 + 0.5, y1), QPointF(x2 - 0.5, y2), QPointF(x2, y2)) 
    543         return path 
     536 
     537    def segment(self, data): 
     538        for i in range(self.n_rows): 
     539            yield data[i * self.n_attributes:(i + 1) * self.n_attributes] 
     540 
     541    def draw_cubic_path(self, segment): 
     542        for (x1, y1), (x2, y2) in zip(segment, segment[1:]): 
     543            self.path.moveTo(x1, y1) 
     544            self.path.cubicTo(QPointF(x1 + 0.5, y1), 
     545                              QPointF(x2 - 0.5, y2), QPointF(x2, y2)) 
     546 
     547    def draw_normal_path(self, segment): 
     548        if not segment: 
     549            return 
     550 
     551        x, y = segment[0] 
     552        self.path.moveTo(x, y) 
     553        for x, y in segment[1:]: 
     554            self.path.lineTo(x, y) 
Note: See TracChangeset for help on using the changeset viewer.