Changeset 8633:10440469d497 in orange


Ignore:
Timestamp:
08/09/11 11:28:13 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
fbdf2b1b1c3a2a20d4d1cbca2fc20289e6ccf34d
Message:

Add a MultiCurve that can have points with different properties. Use this curve in ScatterPlot, so that there is only one curve on the plot.

Files:
3 added
17 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Prototypes/OWScatterPlotGraphQt.py

    r8612 r8633  
    8686        if sizeShapeAttr != "" and sizeShapeAttr != "(Same size)": 
    8787            sizeIndex = self.attributeNameIndex[sizeShapeAttr] 
     88             
     89        labelIndex = -1 
     90        if labelAttr != "" and labelAttr != "(Same label)": 
     91            labelIndex = self.attributeNameIndex[labelAttr] 
    8892 
    8993        showContinuousColorLegend = self.showLegend and colorIndex != -1 and self.dataDomain[colorIndex].varType == orange.VarTypes.Continuous 
     
    159163            else: 
    160164                self.potentialsClassifier = None 
    161              
     165         
     166        """ 
     167            Create a single curve with different points 
     168        """ 
     169        self.singleCurve = True 
     170        if self.singleCurve:                 
     171            if colorIndex != -1: 
     172                if self.dataDomain[colorIndex].varType == orange.VarTypes.Continuous: 
     173                    colorData = [QColor(*self.contPalette.getRGB(i)) for i in self.noJitteringScaledData[colorIndex]] 
     174                else: 
     175                    colorData = [QColor(*self.discPalette.getRGB(i)) for i in self.originalData[colorIndex]] 
     176            else: colorData = [(0,0,0)] 
     177 
     178            if sizeIndex != -1: 
     179                sizeData = [MIN_SHAPE_SIZE + round(i * self.pointWidth) for i in self.noJitteringScaledData[sizeIndex]] 
     180            else: 
     181                sizeData = [self.pointWidth] 
     182                 
     183            if shapeIndex != -1 and self.dataDomain[shapeIndex].varType == orange.VarTypes.Discrete: 
     184                shapeData = [self.curveSymbols[int(i)] for i in self.originalData[shapeIndex]] 
     185            else: 
     186                shapeData = [self.curveSymbols[0]] 
     187                 
     188            if labelAttr and labelAttr in [self.rawData.domain.getmeta(mykey).name for mykey in self.rawData.domain.getmetas().keys()] + [var.name for var in self.rawData.domain]: 
     189                if self.dataDomain[0][labelAttr].varType == orange.VarTypes.Continuous: 
     190                    labelData = ["%4.1f" % orange.Value(i[labelAttr]) if not i[labelAttr].isSpecial() else "" for i in self.rawData] 
     191                else: 
     192                    labelData = [str(i[labelAttr].value) if not i[labelAttr].isSpecial() else "" for i in self.rawData] 
     193            else: 
     194                labelData = [""] 
     195 
     196            self.set_main_curve_data(xData, yData, colorData, labelData, sizeData, shapeData) 
     197 
    162198        # ############################################################## 
    163199        # if we have insideColors defined 
    164         if self.insideColors and self.dataHasDiscreteClass and self.haveData: 
     200        elif self.insideColors and self.dataHasDiscreteClass and self.haveData: 
    165201            # variables and domain for the table 
    166202            classData = self.originalData[self.dataClassIndex] 
  • orange/OrangeWidgets/Prototypes/OWScatterPlotQt.py

    r8606 r8633  
    100100 
    101101        # zooming / selection 
    102         self.zoomSelectToolbar = g.zoom_select_toolbar(self.GeneralTab) 
     102        self.zoomSelectToolbar = g.zoom_select_toolbar(self.GeneralTab, buttons = g.default_zoom_select_buttons + [g.Spacing, g.ShufflePoints]) 
    103103        self.zoomSelectToolbar.buttons[g.SendSelection].clicked.connect(self.sendSelections) 
    104104 
  • orange/OrangeWidgets/plot/owplot.py

    r8631 r8633  
    324324        self.activate_zooming() 
    325325        self.selection_behavior = self.AddSelection 
     326         
     327        self.main_curve = None 
     328         
    326329        self.replot() 
    327330         
     
    609612         
    610613        return self.add_custom_curve(c, enableLegend) 
     614                 
     615    def set_main_curve_data(self, x_data, y_data, color_data, label_data, size_data, shape_data, x_axis_key=xBottom, y_axis_key=yLeft): 
     616        """ 
     617            Creates a single curve that can have points of different colors, shapes and sizes.  
     618        """ 
     619        if not self.main_curve: 
     620            self.main_curve = orangeplot.MultiCurve([], []) 
     621 
     622        c = self.main_curve 
     623        c.set_data(x_data, y_data) 
     624        c.set_axes(x_axis_key, y_axis_key) 
     625        c.set_point_colors(color_data) 
     626        c.set_point_labels(label_data) 
     627        c.set_point_sizes(size_data) 
     628        c.set_point_symbols(shape_data) 
     629        c.name = 'Main Curve' 
     630        return self.add_custom_curve(c) 
    611631         
    612632    def remove_curve(self, item): 
     
    14091429        elif small_rect.top() < big_rect.top(): 
    14101430            small_rect.moveTop(big_rect.top()) 
     1431             
     1432    def shuffle_points(self): 
     1433        if self.main_curve: 
     1434            self.main_curve.shuffle_points() 
  • orange/OrangeWidgets/plot/owplotgui.py

    r8626 r8633  
    247247    SendSelection = 31 
    248248    ClearSelection = 32 
     249    ShufflePoints = 33 
    249250     
    250251    StateButtonsBegin = 35 
     
    279280        SelectionOne : ('Replace selection', 'selection_behavior', SELECTION_REPLACE, None, ''), 
    280281        SendSelection : ('Send selection', None, None, 'send_selection', 'Dlg_send'), 
    281         ClearSelection : ('Clear selection', None, None, 'clear_selection', 'Dlg_clear') 
     282        ClearSelection : ('Clear selection', None, None, 'clear_selection', 'Dlg_clear'), 
     283        ShufflePoints : ('ShufflePoints', None, None, 'shuffle_points', 'Dlg_sort') 
    282284    } 
    283285    ''' 
  • source/orangeplot/CMakeLists.txt

    r8627 r8633  
    2020    unconnectedlinescurve.cpp  
    2121    networkcurve.cpp 
     22    multicurve.cpp 
    2223    plot.cpp  
    2324) 
  • source/orangeplot/curve.cpp

    r8627 r8633  
    4141void Curve::updateNumberOfItems() 
    4242{ 
     43    qDebug() << "Updating number of items" << m_continuous; 
    4344  cancelAllUpdates(); 
    4445  if (m_continuous || (m_data.size() == m_pointItems.size())) 
     
    381382} 
    382383 
    383  
    384  
     384void Curve::set_points(const QList< Point* >& points) 
     385{ 
     386    m_pointItems = points; 
     387    register_points(); 
     388} 
     389 
     390QList< Point* > Curve::points() 
     391{ 
     392    return m_pointItems; 
     393} 
     394 
     395 
     396 
     397 
     398 
  • source/orangeplot/curve.h

    r8627 r8633  
    178178   
    179179  template <class Sequence, class Updater> 
    180   void update_items(Sequence& sequence, Updater updater, Curve::UpdateFlag flag); 
     180  void update_items(const Sequence& sequence, Updater updater, Curve::UpdateFlag flag); 
     181   
     182  void set_points(const QList<Point*>& points); 
     183  QList<Point*> points(); 
    181184   
    182185protected: 
     
    186189  void cancelAllUpdates(); 
    187190   
    188 private: 
    189191  void checkForUpdate(); 
    190192  void updateNumberOfItems(); 
    191193  void changeContinuous(); 
    192194   
     195private: 
    193196  QColor m_color; 
    194197  int m_pointSize; 
     
    211214 
    212215template <class Sequence, class Updater> 
    213 void Curve::update_items(Sequence& sequence, Updater updater, Curve::UpdateFlag flag) 
    214 { 
     216void Curve::update_items(const Sequence& sequence, Updater updater, Curve::UpdateFlag flag) 
     217{ 
     218    qDebug() << "Updating" << sequence.size() << "point"; 
    215219    if (m_currentUpdate.contains(flag) && m_currentUpdate[flag].isRunning()) 
    216220    { 
  • source/orangeplot/networkcurve.cpp

    r8627 r8633  
    9494{ 
    9595    return m_y; 
    96 } 
    97  
    98 void NodeItem::set_label(const QString& label) 
    99 { 
    100     m_label = label; 
    101 } 
    102  
    103 QString NodeItem::label() const 
    104 { 
    105     return m_label; 
    10696} 
    10797 
  • source/orangeplot/networkcurve.h

    r8627 r8633  
    8383    void set_index(int index); 
    8484    int index() const; 
    85      
    86     void set_label(const QString& label); 
    87     QString label() const; 
    8885 
    8986    void set_tooltip(const QString& tooltip); 
  • source/orangeplot/networkcurve.sip

    r8624 r8633  
    2424    void set_index(int index); 
    2525    int index() const; 
    26      
    27     void set_label(const QString& label); 
    28     QString label() const; 
    29      
     26 
    3027    void set_tooltip(const QString& tooltip); 
    3128     
  • source/orangeplot/orangeplot.sip

    r8470 r8633  
    1010%Include unconnectedlinescurve.sip 
    1111%Include networkcurve.sip 
     12%Include multicurve.sip 
  • source/orangeplot/plotitem.cpp

    r8630 r8633  
    22#include "plot.h" 
    33 
    4 #include <QtCore/QVariantAnimation> 
     4#include <QtCore/QPropertyAnimation> 
    55 
    66// Copied from OrangeWidgets/plot/owconstants.py 
    77const int xBottom = 2; 
    88const int yLeft = 0; 
    9  
    10 class MoveAnimation : public QVariantAnimation 
    11 { 
    12 public: 
    13     MoveAnimation(QGraphicsItem* item, const QPointF& pos, int duration); 
    14     virtual void updateCurrentValue(const QVariant& value); 
    15 private: 
    16     QGraphicsItem* m_item; 
    17 }; 
    18  
    19 MoveAnimation::MoveAnimation(QGraphicsItem* item, const QPointF& pos, int duration): QVariantAnimation() 
    20 { 
    21     m_item = item; 
    22     setStartValue(item->pos()); 
    23     setEndValue(pos); 
    24     setDuration(duration); 
    25 } 
    26  
    27 void MoveAnimation::updateCurrentValue(const QVariant& value) 
    28 { 
    29     m_item->setPos(value.toPointF()); 
    30 } 
    31  
    329 
    3310PlotItem::PlotItem(QGraphicsItem* parent, QGraphicsScene* scene): QGraphicsItem(parent, scene),  
     
    136113} 
    137114 
    138 void PlotItem::move_item(QGraphicsItem* item, const QPointF& pos, int duration) 
     115void PlotItem::move_item(QGraphicsObject* item, const QPointF& pos, int duration) 
    139116{ 
    140     MoveAnimation* m = new MoveAnimation(item, pos, duration); 
    141     m->start(QAbstractAnimation::DeleteWhenStopped); 
     117    QPropertyAnimation* a = new QPropertyAnimation(); 
     118    a->setTargetObject(item); 
     119    a->setPropertyName("pos"); 
     120    a->setStartValue(item->pos()); 
     121    a->setEndValue(pos); 
     122    a->setDuration(duration); 
     123    a->start(QAbstractAnimation::DeleteWhenStopped); 
    142124} 
    143125 
  • source/orangeplot/plotitem.h

    r8630 r8633  
    3333     
    3434    static QRectF rect_from_data(const QList<double>& x_data, const QList<double>& y_data); 
    35     static void move_item(QGraphicsItem* item, const QPointF& pos, int duration = 250); 
     35    static void move_item(QGraphicsObject* item, const QPointF& pos, int duration = 250); 
    3636     
    3737    bool is_auto_scale() const; 
  • source/orangeplot/plotitem.sip

    r8630 r8633  
    3333     
    3434    static QRectF rect_from_data(const QList<double>& x_data, const QList<double>& y_data); 
    35     static void move_item(QGraphicsItem* item, const QPointF& pos, int duration = 250); 
     35    static void move_item(QGraphicsObject* item, const QPointF& pos, int duration = 250); 
    3636     
    3737    bool is_auto_scale() const; 
  • source/orangeplot/point.cpp

    r8613 r8633  
    347347    pixmap_cache.clear(); 
    348348} 
     349 
     350 
     351void Point::set_label(const QString& label) 
     352{ 
     353    m_label = label; 
     354} 
     355 
     356QString Point::label() const 
     357{ 
     358    return m_label; 
     359} 
     360 
  • source/orangeplot/point.h

    r8627 r8633  
    114114    void set_coordinates(const DataPoint& data_point); 
    115115     
     116    void set_label(const QString& label); 
     117    QString label() const; 
     118     
    116119    /** 
    117120    * Creates a path from a symbol and a size 
     
    143146     
    144147    DataPoint m_coordinates; 
     148    QString m_label; 
    145149}; 
    146150 
  • source/orangeplot/point.sip

    r8613 r8633  
    102102     
    103103    DataPoint coordinates() const; 
    104     void set_coordinates(const DataPoint& data_point); 
     104    void set_coordinates(const DataPoint& data_point);     
    105105 
     106    void set_label(const QString& label); 
     107    QString label() const; 
     108     
    106109    /** 
    107110    * Creates a path from a symbol and a size 
Note: See TracChangeset for help on using the changeset viewer.