Changeset 8375:259ca2d36c64 in orange


Ignore:
Timestamp:
07/06/11 14:58:09 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
9f1b78bab58dd3877f935d6847974abb7e3dc3c2
Message:

ScatterPlot3D: various checkboxes, dropdowns

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/OWGraph3D.py

    r8360 r8375  
    140140        self.face_symbols = True 
    141141        self.filled_symbols = True 
     142        self.symbol_scale = 1 
     143        self.transparency = 255 
     144        self.grid = True 
    142145 
    143146    def __del__(self): 
     
    164167 
    165168            uniform bool face_symbols; 
     169            uniform float symbol_scale; 
     170            uniform float transparency; 
    166171 
    167172            varying vec4 var_color; 
     
    185190              invs[2][2] = gl_ModelViewMatrix[2][2]; 
    186191 
    187               vec3 offset_rotated; 
     192              vec3 offset_rotated = offset; 
     193              offset_rotated.x *= symbol_scale; 
     194              offset_rotated.y *= symbol_scale; 
     195 
    188196              if (face_symbols) 
    189                 offset_rotated = invs * offset; 
    190               else 
    191                 offset_rotated = offset; 
    192  
    193               gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(position+offset_rotated, 1); 
    194               var_color = color; 
     197                offset_rotated = invs * offset_rotated; 
     198 
     199              vec4 off_pos = vec4(position+offset_rotated, 1); 
     200 
     201              gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * off_pos; 
     202              var_color = vec4(color.rgb, transparency); 
    195203            } 
    196204            ''' 
     
    234242        glBindAttribLocation(self.color_shader, 2, 'color') 
    235243        glLinkProgram(self.color_shader) 
    236         self.color_shader_override_color = glGetUniformLocation(self.color_shader, 'override_color') 
    237         self.color_shader_overriden_color = glGetUniformLocation(self.color_shader, 'overriden_color') 
    238244        self.color_shader_face_symbols = glGetUniformLocation(self.color_shader, 'face_symbols') 
     245        self.color_shader_symbol_scale = glGetUniformLocation(self.color_shader, 'symbol_scale') 
     246        self.color_shader_transparency = glGetUniformLocation(self.color_shader, 'transparency') 
    239247        linked = c_int() 
    240248        glGetProgramiv(self.color_shader, GL_LINK_STATUS, byref(linked)) 
     
    272280        self.paint_axes() 
    273281 
    274         glEnable(GL_DEPTH_TEST) 
     282        glDisable(GL_DEPTH_TEST) 
    275283        glDisable(GL_CULL_FACE) 
     284        glEnable(GL_BLEND) 
     285        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
    276286 
    277287        for cmd, vao, vao_outline in self.commands: 
     
    279289                glUseProgram(self.color_shader) 
    280290                glUniform1i(self.color_shader_face_symbols, self.face_symbols) 
     291                glUniform1f(self.color_shader_symbol_scale, self.symbol_scale) 
     292                glUniform1f(self.color_shader_transparency, self.transparency) 
    281293                if self.filled_symbols: 
    282294                    glBindVertexArray(vao.value) 
     
    289301                glUseProgram(0) 
    290302 
     303        glDisable(GL_BLEND) 
    291304        if self.show_legend: 
    292305            self.draw_legend() 
     
    441454                  self.axis_plane_xy_back, self.axis_plane_yz_right] 
    442455        visible_planes = map(plane_visible, planes) 
    443         draw_axis_plane(self.axis_plane_xz) 
    444         for visible, plane in zip(visible_planes, planes): 
    445             if not visible: 
    446                 draw_axis_plane(plane) 
     456        if self.grid: 
     457            draw_axis_plane(self.axis_plane_xz) 
     458            for visible, plane in zip(visible_planes, planes): 
     459                if not visible: 
     460                    draw_axis_plane(plane) 
    447461 
    448462        glEnable(GL_DEPTH_TEST) 
  • orange/OrangeWidgets/Prototypes/OWScatterPlot3D.py

    r8360 r8375  
    1111 
    1212class OWScatterPlot3D(OWWidget): 
     13    settingsList = ['graph.show_legend'] 
    1314    contextHandlers = {"": DomainContextHandler("", ["xAttr", "yAttr", "zAttr"])} 
    1415  
     
    2526        self.color_attr = None 
    2627        self.size_attr = None 
     28        self.shape_attr = None 
    2729        self.label_attr = None 
    2830 
    29         self.point_size = 5 
     31        self.symbol_scale = 5 
    3032        self.alpha_value = 255 
    3133 
    3234        self.tabs = OWGUI.tabWidget(self.controlArea) 
    33         self.general_tab = OWGUI.createTabPage(self.tabs, 'General') 
    34         self.settings_tab = OWGUI.createTabPage(self.tabs, 'Settings') 
    35  
    36         self.x_attr_cb = OWGUI.comboBox(self.general_tab, self, "xAttr", box="X-axis Attribute", 
     35        self.main_tab = OWGUI.createTabPage(self.tabs, 'Main') 
     36        self.settings_tab = OWGUI.createTabPage(self.tabs, 'Settings', canScroll=True) 
     37 
     38        self.x_attr_cb = OWGUI.comboBox(self.main_tab, self, "x_attr", box="X-axis attribute", 
    3739            tooltip="Attribute to plot on X axis.", 
    38             callback=self.onAxisChange 
    39             ) 
    40  
    41         self.y_attr_cb = OWGUI.comboBox(self.general_tab, self, "yAttr", box="Y-axis Attribute", 
     40            callback=self.on_axis_change 
     41            ) 
     42 
     43        self.y_attr_cb = OWGUI.comboBox(self.main_tab, self, "y_attr", box="Y-axis attribute", 
    4244            tooltip="Attribute to plot on Y axis.", 
    43             callback=self.onAxisChange 
    44             ) 
    45  
    46         self.z_attr_cb = OWGUI.comboBox(self.general_tab, self, "zAttr", box="Z-axis Attribute", 
     45            callback=self.on_axis_change 
     46            ) 
     47 
     48        self.z_attr_cb = OWGUI.comboBox(self.main_tab, self, "z_attr", box="Z-axis attribute", 
    4749            tooltip="Attribute to plot on Z axis.", 
    48             callback=self.onAxisChange 
    49             ) 
    50  
    51         self.color_attr_cb = OWGUI.comboBox(self.general_tab, self, "colorAttr", box="Point color", 
     50            callback=self.on_axis_change 
     51            ) 
     52 
     53        self.color_attr_cb = OWGUI.comboBox(self.main_tab, self, "color_attr", box="Point color", 
    5254            tooltip="Attribute to use for point color", 
    53             callback=self.onAxisChange) 
     55            callback=self.on_axis_change) 
    5456 
    5557        # Additional point properties (labels, size, shape). 
    56         additional_box = OWGUI.widgetBox(self.general_tab, 'Additional Point Properties') 
    57         self.size_attr_cb = OWGUI.comboBox(additional_box, self, "sizeAttr", box="Point Size:", 
     58        additional_box = OWGUI.widgetBox(self.main_tab, 'Additional Point Properties') 
     59        self.size_attr_cb = OWGUI.comboBox(additional_box, self, "size_attr", label="Point size:", 
    5860            tooltip="Attribute to use for pointSize", 
    59             callback=self.onAxisChange, 
     61            callback=self.on_axis_change, 
    6062            indent = 10, 
    6163            emptyString = '(Same size)', 
    62             valueType = str 
    63             ) 
    64  
    65         self.shape_attr_cb = OWGUI.comboBox(additional_box, self, "shapeAttr", box="Point Shape:", 
     64            ) 
     65 
     66        self.shape_attr_cb = OWGUI.comboBox(additional_box, self, "shape_attr", label="Point shape:", 
    6667            tooltip="Attribute to use for pointShape", 
    67             callback=self.onAxisChange, 
    68             ) 
    69  
    70         self.label_attr_cb = OWGUI.comboBox(additional_box, self, "labelAttr", box="Point Label:", 
     68            callback=self.on_axis_change, 
     69            indent = 10, 
     70            emptyString = '(Same shape)' 
     71            ) 
     72 
     73        self.label_attr_cb = OWGUI.comboBox(additional_box, self, "label_attr", label="Point label:", 
    7174            tooltip="Attribute to use for pointLabel", 
    72             callback=self.onAxisChange, 
    73             ) 
    74  
    75  
    76         OWGUI.hSlider(self.settings_tab, self, "point_size", box="Max. point size", 
     75            callback=self.on_axis_change, 
     76            indent = 10, 
     77            emptyString = '(No labels)' 
     78            ) 
     79 
     80        self.graph = OWGraph3D(self) 
     81 
     82        box = OWGUI.widgetBox(self.settings_tab, 'Point properties') 
     83        OWGUI.hSlider(box, self, "graph.symbol_scale", label="Symbol scale", 
    7784            minValue=1, maxValue=10, 
    78             tooltip="Maximum point size", 
    79             callback=self.onAxisChange 
    80             ) 
    81  
    82         OWGUI.hSlider(self.settings_tab, self, "alpha_value", box="Transparency", 
     85            tooltip="Scale symbol size", 
     86            callback=self.on_checkbox_update 
     87            ) 
     88 
     89        OWGUI.hSlider(box, self, "graph.transparency", label="Transparency", 
    8390            minValue=10, maxValue=255, 
    8491            tooltip="Point transparency value", 
    85             callback=self.onAxisChange) 
    86  
    87         # TODO: jittering options 
    88         # TODO: find out what's with the TODO above 
    89         # TODO: add ortho/perspective checkbox (or perhaps not?) 
    90         # TODO: add grid enable/disable options 
    91  
    92         OWGUI.rubber(self.general_tab) 
    93  
    94         self.graph = OWGraph3D(self) 
     92            callback=self.on_checkbox_update) 
     93        OWGUI.rubber(box) 
     94 
     95        box = OWGUI.widgetBox(self.settings_tab, 'General settings') 
     96        OWGUI.checkBox(box, self, 'graph.show_x_axis_title',   'X axis title',   callback=self.on_checkbox_update) 
     97        OWGUI.checkBox(box, self, 'graph.show_y_axis_title',   'Y axis title',   callback=self.on_checkbox_update) 
     98        OWGUI.checkBox(box, self, 'graph.show_z_axis_title',   'Z axis title',   callback=self.on_checkbox_update) 
     99        OWGUI.checkBox(box, self, 'graph.show_legend',         'Show legend',    callback=self.on_checkbox_update) 
     100        OWGUI.checkBox(box, self, 'graph.ortho',               'Use ortho',      callback=self.on_checkbox_update) 
     101        OWGUI.checkBox(box, self, 'graph.filled_symbols',      'Filled symbols', callback=self.on_checkbox_update) 
     102        OWGUI.checkBox(box, self, 'graph.face_symbols',        'Face symbols',   callback=self.on_checkbox_update) 
     103        OWGUI.checkBox(box, self, 'graph.grid',                'Show grid',      callback=self.on_checkbox_update) 
     104        OWGUI.rubber(box) 
     105 
     106        self.main_tab.layout().addStretch(100) 
     107        self.settings_tab.layout().addStretch(100) 
     108 
    95109        self.mainArea.layout().addWidget(self.graph) 
    96110 
    97111        self.data = None 
    98112        self.subsetData = None 
    99         self.resize(800, 600) 
     113        self.resize(1000, 600) 
    100114 
    101115    def setData(self, data=None): 
    102       self.closeContext("") 
    103       self.data = data 
    104       self.x_attr_cb.clear() 
    105       self.y_attr_cb.clear() 
    106       self.z_attr_cb.clear() 
    107       self.color_attr_cb.clear() 
    108       self.size_attr_cb.clear() 
    109       self.shape_attr_cb.clear() 
    110       if self.data is not None: 
    111         self.allAttrs = data.domain.variables + data.domain.getmetas().values() 
    112         self.axisCandidateAttrs = [attr for attr in self.allAttrs if attr.varType in [orange.VarTypes.Continuous, orange.VarTypes.Discrete]] 
    113  
    114         self.color_attr_cb.addItem("<None>") 
    115         self.size_attr_cb.addItem("<None>") 
    116         self.shape_attr_cb.addItem("<None>") 
    117         icons = OWGUI.getAttributeIcons()  
    118         for attr in self.axisCandidateAttrs: 
    119             self.x_attr_cb.addItem(icons[attr.varType], attr.name) 
    120             self.y_attr_cb.addItem(icons[attr.varType], attr.name) 
    121             self.z_attr_cb.addItem(icons[attr.varType], attr.name) 
    122             self.color_attr_cb.addItem(icons[attr.varType], attr.name) 
    123             self.size_attr_cb.addItem(icons[attr.varType], attr.name) 
    124  
    125         array, c, w = self.data.toNumpyMA() 
    126         if len(c): 
    127           array = numpy.hstack((array, c.reshape(-1,1))) 
    128         self.dataArray = array 
    129  
    130         self.x_attr, self.y_attr, self.z_attr = numpy.min([[0, 1, 2], [len(self.axisCandidateAttrs) - 1]*3], axis=0) 
    131         self.color_attr = max(len(self.axisCandidateAttrs) - 1, 0) 
    132  
    133         self.openContext("", data) 
     116        self.closeContext("") 
     117        self.data = data 
     118        self.x_attr_cb.clear() 
     119        self.y_attr_cb.clear() 
     120        self.z_attr_cb.clear() 
     121        self.color_attr_cb.clear() 
     122        self.size_attr_cb.clear() 
     123        self.shape_attr_cb.clear() 
     124        self.label_attr_cb.clear() 
     125 
     126        if self.data is not None: 
     127            self.all_attrs = data.domain.variables + data.domain.getmetas().values() 
     128            self.axis_candidate_attrs = [attr for attr in self.all_attrs 
     129                if attr.varType in [orange.VarTypes.Continuous, orange.VarTypes.Discrete]] 
     130 
     131            self.color_attr_cb.addItem('(Same color)') 
     132            self.size_attr_cb.addItem('(Same size)') 
     133            self.shape_attr_cb.addItem('(Same shape)') 
     134            self.label_attr_cb.addItem('(No labels)') 
     135            icons = OWGUI.getAttributeIcons()  
     136            for attr in self.axis_candidate_attrs: 
     137                self.x_attr_cb.addItem(icons[attr.varType], attr.name) 
     138                self.y_attr_cb.addItem(icons[attr.varType], attr.name) 
     139                self.z_attr_cb.addItem(icons[attr.varType], attr.name) 
     140                self.color_attr_cb.addItem(icons[attr.varType], attr.name) 
     141                self.size_attr_cb.addItem(icons[attr.varType], attr.name) 
     142                self.label_attr_cb.addItem(icons[attr.varType], attr.name) 
     143 
     144            array, c, w = self.data.toNumpyMA() 
     145            if len(c): 
     146              array = numpy.hstack((array, c.reshape(-1,1))) 
     147            self.data_array = array 
     148 
     149            self.x_attr, self.y_attr, self.z_attr = numpy.min([[0, 1, 2], [len(self.axis_candidate_attrs) - 1]*3], axis=0) 
     150            self.color_attr = max(len(self.axis_candidate_attrs) - 1, 0) 
     151 
     152            self.openContext("", data) 
    134153 
    135154    def setSubsetData(self, data=None): 
     
    137156 
    138157    def handleNewSignals(self): 
    139       self.updateGraph() 
    140  
    141     def onAxisChange(self): 
     158      self.update_graph() 
     159 
     160    def on_axis_change(self): 
    142161      if self.data is not None: 
    143         self.updateGraph() 
    144  
    145     def updateGraph(self): 
     162        self.update_graph() 
     163 
     164    def on_checkbox_update(self): 
     165        self.graph.updateGL() 
     166 
     167    def update_graph(self): 
    146168      if self.data is None: 
    147169        return 
     
    151173 
    152174      if self.color_attr > 0: 
    153         color_attr = self.axisCandidateAttrs[self.color_attr - 1] 
    154         C = self.dataArray[:, self.color_attr - 1] 
     175        color_attr = self.axis_candidate_attrs[self.color_attr - 1] 
     176        C = self.data_array[:, self.color_attr - 1] 
    155177        if color_attr.varType == orange.VarTypes.Discrete: 
    156178          palette = OWColorPalette.ColorPaletteHSV(len(color_attr.values)) 
     
    167189 
    168190      if self.size_attr > 0: 
    169         size_attr = self.axisCandidateAttrs[self.size_attr - 1] 
    170         S = self.dataArray[:, self.size_attr - 1] 
     191        size_attr = self.axis_candidate_attrs[self.size_attr - 1] 
     192        S = self.data_array[:, self.size_attr - 1] 
    171193        if size_attr.varType == orange.VarTypes.Discrete: 
    172           sizes = [(v + 1) * len(size_attr.values) / (11 - self.point_size) for v in S] 
     194          sizes = [(v + 1) * len(size_attr.values) / (11 - self.symbol_scale) for v in S] 
    173195        else: 
    174196          min, max = numpy.min(S), numpy.max(S) 
    175           sizes = [(v - min) * self.point_size / (max-min) for v in S] 
     197          sizes = [(v - min) * self.symbol_scale / (max-min) for v in S] 
    176198      else: 
    177199        sizes = 1 
     
    179201      self.graph.clear() 
    180202      self.graph.scatter(X, Y, Z, colors, sizes) 
    181       self.graph.set_x_axis_title(self.axisCandidateAttrs[self.x_attr].name) 
    182       self.graph.set_x_axis_title(self.axisCandidateAttrs[self.y_attr].name) 
    183       self.graph.set_x_axis_title(self.axisCandidateAttrs[self.z_attr].name) 
     203      self.graph.set_x_axis_title(self.axis_candidate_attrs[self.x_attr].name) 
     204      self.graph.set_x_axis_title(self.axis_candidate_attrs[self.y_attr].name) 
     205      self.graph.set_x_axis_title(self.axis_candidate_attrs[self.z_attr].name) 
    184206 
    185207    def getAxisData(self, xInd, yInd, zInd): 
    186       array = self.dataArray 
     208      array = self.data_array 
    187209      X, Y, Z = array[:, xInd], array[:, yInd], array[:, zInd] 
    188210      return X, Y, Z, None 
Note: See TracChangeset for help on using the changeset viewer.