Changeset 8568:6b5800186402 in orange


Ignore:
Timestamp:
08/02/11 10:22:23 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
4aff0a4cff4df8ea30a0d8c8e735b3614386c895
Message:

Improved legend

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

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

    r8567 r8568  
    417417        X, Y, Z, mask = self.get_axis_data(self.x_attr, self.y_attr, self.z_attr) 
    418418 
    419         color_legend_items = [] 
     419        color_discrete = shape_discrete = size_discrete = False 
     420 
    420421        if self.color_attr > 0: 
    421422            color_attr = self.candidate_attrs[self.color_attr - 1] 
    422423            C = self.data_array[:, self.color_attr - 1] 
    423424            if color_attr.varType == Discrete: 
     425                color_discrete = True 
    424426                palette = OWColorPalette.ColorPaletteHSV(len(color_attr.values)) 
    425427                colors = [palette[int(value)] for value in C.ravel()] 
    426428                colors = [[c.red()/255., c.green()/255., c.blue()/255., self.alpha_value/255.] for c in colors] 
    427429                palette_colors = [palette[i] for i in range(len(color_attr.values))] 
    428                 color_legend_items = [[0, [c.red()/255., c.green()/255., c.blue()/255., 1], 1, title] 
    429                     for c, title in zip(palette_colors, color_attr.values)] 
    430430            else: 
    431431                palette = OWColorPalette.ColorPaletteBW() 
     
    441441            S = self.data_array[:, self.size_attr - 1] 
    442442            if size_attr.varType == Discrete: 
     443                size_discrete = True 
    443444                sizes = [v+1. for v in S] 
    444445            else: 
     
    452453            i, shape_attr = self.discrete_attrs[self.shape_attr] 
    453454            if shape_attr.varType == Discrete: 
    454                 # Map discrete attribute to [0...num shapes-1] 
     455                shape_discrete = True 
    455456                shapes = self.data_array[:, i] 
    456                 num_shapes = 0 
    457                 unique_shapes = {} 
    458                 for shape in shapes: 
    459                     if shape not in unique_shapes: 
    460                         unique_shapes[shape] = num_shapes 
    461                         num_shapes += 1 
    462                 shapes = [unique_shapes[value] for value in shapes] 
    463457 
    464458        labels = None 
     
    472466        self.plot.clear() 
    473467 
    474         num_symbols = len(Symbol) 
    475         if self.shape_attr > 0: 
    476             _, shape_attr = self.discrete_attrs[self.shape_attr] 
    477             titles = list(shape_attr.values) 
    478             for i, title in enumerate(titles): 
    479                 if i == num_symbols-1: 
    480                     title = ', '.join(titles[i:]) 
    481                 if color_legend_items: 
    482                     self.plot.legend.add_item(i, color_legend_items[i][1], 1, '{0}={1}'.format(shape_attr.name, title)) 
     468        if self.plot.show_legend: 
     469            legend_keys = {} 
     470            color_attr = color_attr if self.color_attr > 0 and color_discrete else None 
     471            size_attr = size_attr if self.size_attr > 0 and size_discrete else None 
     472            shape_attr = shape_attr if self.shape_attr > 0 and shape_discrete else None 
     473 
     474            single_legend = [color_attr, size_attr, shape_attr].count(None) == 2 
     475            if single_legend: 
     476                legend_join = lambda name, val: val 
     477            else: 
     478                legend_join = lambda name, val: name + '=' + val  
     479 
     480            if color_attr != None: 
     481                num = len(color_attr.values) 
     482                val = [[], [], [1.]*num, [Symbol.RECT]*num] 
     483                var_values = getVariableValuesSorted(self.data.domain[self.attr_name_index[color_attr.name]]) 
     484                for i in range(num): 
     485                    val[0].append(legend_join(color_attr.name, var_values[i])) 
     486                    c = palette_colors[i] 
     487                    val[1].append([c.red()/255., c.green()/255., c.blue()/255., 1.]) 
     488                legend_keys[color_attr] = val 
     489 
     490            if shape_attr != None: 
     491                num = len(shape_attr.values) 
     492                if legend_keys.has_key(shape_attr): 
     493                    val = legend_keys[shape_attr] 
    483494                else: 
    484                     self.plot.legend.add_item(i, (0,0,0,1), 1, '{0}={1}'.format(shape_attr.name, title)) 
    485                 if i == num_symbols-1: 
    486                     break 
    487  
    488         if color_legend_items and not self.shape_attr > 0: 
    489             for item in color_legend_items: 
    490                 self.plot.legend.add_item(*item) 
     495                    val = [[], [(0, 0, 0, 1)]*num, [1.]*num, []] 
     496                var_values = getVariableValuesSorted(self.data.domain[self.attr_name_index[shape_attr.name]]) 
     497                val[3] = [] 
     498                val[0] = [] 
     499                for i in range(num): 
     500                    val[3].append(i) 
     501                    val[0].append(legend_join(shape_attr.name, var_values[i])) 
     502                legend_keys[shape_attr] = val 
     503 
     504            if size_attr != None: 
     505                num = len(size_attr.values) 
     506                if legend_keys.has_key(size_attr): 
     507                    val = legend_keys[size_attr] 
     508                else: 
     509                    val = [[], [(0, 0, 0, 1)]*num, [], [Symbol.RECT]*num] 
     510                val[2] = [] 
     511                val[0] = [] 
     512                var_values = getVariableValuesSorted(self.data.domain[self.attr_name_index[size_attr.name]]) 
     513                for i in range(num): 
     514                    val[0].append(legend_join(size_attr.name, var_values[i])) 
     515                    val[2].append(0.1 + float(i) / len(var_values)) 
     516                legend_keys[size_attr] = val 
     517        else: 
     518            legend_keys = {} 
     519 
     520        for val in legend_keys.values(): 
     521            for i in range(len(val[1])): 
     522                self.plot.legend.add_item(val[3][i], val[1][i], val[2][i], val[0][i]) 
    491523 
    492524        self.plot.scatter(X, Y, Z, colors, sizes, shapes, labels) 
  • orange/OrangeWidgets/plot/owplot3d.py

    r8566 r8568  
    213213            glBegin(GL_TRIANGLES) 
    214214            for v0, v1, v2, _, _, _ in triangles: 
    215                 glVertex2f(x+v0[0]*self.symbol_scale+10, item_pos_y+v0[1]*self.symbol_scale-5) 
    216                 glVertex2f(x+v1[0]*self.symbol_scale+10, item_pos_y+v1[1]*self.symbol_scale-5) 
    217                 glVertex2f(x+v2[0]*self.symbol_scale+10, item_pos_y+v2[1]*self.symbol_scale-5) 
     215                glVertex2f(x+v0[0]*self.symbol_scale*size+10, item_pos_y+v0[1]*self.symbol_scale*size-5) 
     216                glVertex2f(x+v1[0]*self.symbol_scale*size+10, item_pos_y+v1[1]*self.symbol_scale*size-5) 
     217                glVertex2f(x+v2[0]*self.symbol_scale*size+10, item_pos_y+v2[1]*self.symbol_scale*size-5) 
    218218            glEnd() 
    219219            self.plot.renderText(x+t+30, item_pos_y, text, font=self.font) 
Note: See TracChangeset for help on using the changeset viewer.