Changeset 10705:cb0cb39cd12c in orange


Ignore:
Timestamp:
04/02/12 18:12:04 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixed scatterplot (and linear projection) point jittering (now remains the same through subset data changes), fixes #1170.

Location:
Orange
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Visualize/OWLinProjGraph.py

    r10476 r10705  
    221221            shownSubsetCount = 0 
    222222            subsetIdsToDraw = dict([(example.id,1) for example in self.rawSubsetData]) 
    223  
     223            subsetIdsAlreadyDrawn = set() 
    224224            # draw the rawData data set. examples that exist also in the subset data draw full, other empty 
    225225            for i in range(dataSize): 
    226                 if not validData[i]: continue 
     226                if not validData[i]: 
     227                    continue 
    227228                if subsetIdsToDraw.has_key(self.rawData[i].id): 
    228                     continue 
     229                    instance_filled = 1 
     230                    subsetIdsAlreadyDrawn.add(self.rawData[i].id) 
     231                else: 
     232                    instance_filled = 0 
    229233 
    230234                if self.dataHasDiscreteClass and self.useDifferentColors: 
     
    240244                    curveSymbol = self.curveSymbols[0] 
    241245 
    242                 if not xPointsToAdd.has_key((newColor, curveSymbol,0)): 
    243                     xPointsToAdd[(newColor, curveSymbol,0)] = [] 
    244                     yPointsToAdd[(newColor, curveSymbol,0)] = [] 
    245                 xPointsToAdd[(newColor, curveSymbol,0)].append(x_positions[i]) 
    246                 yPointsToAdd[(newColor, curveSymbol,0)].append(y_positions[i]) 
     246                if not xPointsToAdd.has_key((newColor, curveSymbol, instance_filled)): 
     247                    xPointsToAdd[(newColor, curveSymbol, instance_filled)] = [] 
     248                    yPointsToAdd[(newColor, curveSymbol, instance_filled)] = [] 
     249                xPointsToAdd[(newColor, curveSymbol, instance_filled)].append(x_positions[i]) 
     250                yPointsToAdd[(newColor, curveSymbol, instance_filled)].append(y_positions[i]) 
    247251                if self.showValueLines: 
    248252                    self.addValueLineCurve(x_positions[i], y_positions[i], newColor, i, indices) 
     
    260264 
    261265            for i in range(len(self.rawSubsetData)): 
    262                 if not validSubData[i]: continue    # check if has missing values 
     266                if not validSubData[i]: # check if has missing values 
     267                    continue 
     268                if self.rawSubsetData[i].id in subsetIdsAlreadyDrawn: 
     269                    continue 
    263270 
    264271                if not self.dataHasClass or self.rawSubsetData[i].getclass().isSpecial(): 
  • Orange/OrangeWidgets/Visualize/OWScatterPlotGraph.py

    r9671 r10705  
    228228            xPointsToAdd = {} 
    229229            yPointsToAdd = {} 
     230            subsetIdsAlreadyDrawn = set() 
    230231            for i in range(len(self.rawData)): 
    231232                if not validData[i]: continue 
    232233                if subsetIdsToDraw.has_key(self.rawData[i].id): 
    233                     continue 
     234                    instanceFilled = 1 
     235                    subsetIdsAlreadyDrawn.add(self.rawData[i].id) 
     236                else: 
     237                    instanceFilled = showFilled 
    234238 
    235239                if colorIndex != -1: 
     
    246250                if sizeIndex != -1: size = MIN_SHAPE_SIZE + round(self.noJitteringScaledData[sizeIndex][i] * self.pointWidth) 
    247251 
    248                 if not xPointsToAdd.has_key((newColor, size, Symbol, showFilled)): 
    249                     xPointsToAdd[(newColor, size, Symbol, showFilled)] = [] 
    250                     yPointsToAdd[(newColor, size, Symbol, showFilled)] = [] 
    251                 xPointsToAdd[(newColor, size, Symbol, showFilled)].append(xData[i]) 
    252                 yPointsToAdd[(newColor, size, Symbol, showFilled)].append(yData[i]) 
     252                if not xPointsToAdd.has_key((newColor, size, Symbol, instanceFilled)): 
     253                    xPointsToAdd[(newColor, size, Symbol, instanceFilled)] = [] 
     254                    yPointsToAdd[(newColor, size, Symbol, instanceFilled)] = [] 
     255                xPointsToAdd[(newColor, size, Symbol, instanceFilled)].append(xData[i]) 
     256                yPointsToAdd[(newColor, size, Symbol, instanceFilled)].append(yData[i]) 
    253257                self.tips.addToolTip(xData[i], yData[i], i)     # we add a tooltip for this point 
    254258 
     
    268272                xData, yData = self.getXYSubsetDataPositions(xAttr, yAttr) 
    269273                for i in range(len(self.rawSubsetData)): 
    270                     if not validSubData[i]: continue 
     274                    if not validSubData[i]: 
     275                        continue 
     276                    if self.rawSubsetData[i].id in subsetIdsAlreadyDrawn: 
     277                        continue 
    271278 
    272279                    if colorIndex != -1 and self.validSubsetDataArray[colorIndex][i]: 
  • Orange/data/preprocess/scaling.py

    r10651 r10705  
    195195        self.jitter_size = 10 
    196196        self.jitter_continuous = 0 
     197        self.jitter_seed = 0 
    197198 
    198199        self.attr_values = {} 
     
    269270 
    270271        len_data = data and len(data) or 0 
    271         numpy.random.seed(1)     # we always reset the random generator, so that if we receive the same data again we will add the same noise 
    272272 
    273273        self.attribute_names = [attr.name for attr in full_data.domain] 
     
    362362                                         self.no_jittering_scaled_subset_data], 
    363363                                         axis = 1) 
    364         for index in range(len(data.domain)): 
     364 
     365        # Random generators for jittering  
     366        random = numpy.random.RandomState(seed=self.jitter_seed) 
     367        rand_seeds = random.random_integers(0, sys.maxint - 1, size=len(data.domain)) 
     368        for index, rseed in zip(range(len(data.domain)), rand_seeds): 
     369            # Need to use a different seed for each feature 
     370            random = numpy.random.RandomState(seed=rseed) 
    365371            attr = data.domain[index] 
    366372            if attr.var_type == Orange.core.VarTypes.Discrete: 
    367373                scaled_data[index] += (self.jitter_size/(50.0*max(1,len(attr.values))))*\ 
    368                                       (numpy.random.random(len(full_data)) - 0.5) 
     374                                      (random.rand(len(full_data)) - 0.5) 
    369375                 
    370376            elif attr.var_type == Orange.core.VarTypes.Continuous and self.jitter_continuous: 
    371                 scaled_data[index] += self.jitter_size/50.0 * (0.5 - numpy.random.random(len(full_data))) 
     377                scaled_data[index] += self.jitter_size/50.0 * (0.5 - random.rand(len(full_data))) 
    372378                scaled_data[index] = numpy.absolute(scaled_data[index])       # fix values below zero 
    373379                ind = numpy.where(scaled_data[index] > 1.0, 1, 0)     # fix values above 1 
    374380                numpy.putmask(scaled_data[index], ind, 2.0 - numpy.compress(ind, scaled_data[index])) 
     381 
     382        if self.have_subset_data: 
     383            # Fix all subset instances which are also in the main data 
     384            # to have the same jittered values 
     385            ids_to_indices = dict((inst.id, i) \ 
     386                                  for i, inst in enumerate(self.raw_data)) 
     387 
     388            subset_ids_map = [[i, ids_to_indices[s.id]] \ 
     389                               for i, s in enumerate(self.raw_subset_data)\ 
     390                               if s.id in ids_to_indices] 
     391            if len(subset_ids_map): 
     392                subset_ids_map = numpy.array(subset_ids_map) 
     393                subset_ids_map[:, 0] += len_data 
     394                scaled_data[:, subset_ids_map[:, 0]] = \ 
     395                        scaled_data[:, subset_ids_map[:, 1]] 
     396 
    375397        self.scaled_data = scaled_data[:,:len_data]; self.scaled_subset_data = scaled_data[:,len_data:] 
    376398     
Note: See TracChangeset for help on using the changeset viewer.