Changeset 700 for mds-and-trees


Ignore:
Timestamp:
09/19/17 15:45:07 (3 years ago)
Author:
konrad
Message:

Colors support matplotlib cmaps now. 'color' property in config file can take two more key values: 'cmap' and 'normalize_cmap'. Cmap is defined as in https://matplotlib.org/devdocs/api/_as_gen/matplotlib.colors.LinearSegmentedColormap.html but uses arrays instead of tuples. If 'normalize_cmap" == false, step values (first value in each tuple) must be normalized. Otherwise, if 'normalize_cmap" == true, step values can be raw property values (from the range of values in the data).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mds-and-trees/tree-genealogy.py

    r697 r700  
    3131                'color': {
    3232                    'meaning': 'Lifespan',
     33                    'normalize_cmap': False,
     34                    'cmap': {},
    3335                    'start': 'red',
    3436                    'end': 'green',
     
    5153                'color': {
    5254                    'meaning': 'adepth',
     55                    'normalize_cmap': False,
     56                    'cmap': {},
    5357                    'start': 'black',
    5458                    'end': 'red',
     
    7781                else:
    7882                    destination[key] = value
    79 
    8083            return destination
    8184
     
    8588            self.settings = merge(c, self.settings)
    8689            #print(json.dumps(self.settings, indent=4, sort_keys=True))
     90
     91        self.compile_cmaps()
     92
     93    def compile_cmaps(self):
     94
     95        # normalization of color breaking points
     96        for part in ['dots', 'lines']:
     97            if self.settings[part]['color']['cmap'] \
     98                    and self.settings[part]['color']['normalize_cmap']:
     99                cmap = self.settings[part]['color']['cmap']
     100                min = self.design.props[self.settings[part]['color']['meaning'] + "_min"]
     101                max = self.design.props[self.settings[part]['color']['meaning'] + "_max"]
     102                for key in cmap:
     103                    for arr in cmap[key]:
     104                        arr[0] = (arr[0] - min) / (max-min)
     105                    if cmap[key][0][0] != 0:
     106                        cmap[key].insert(0, cmap[key][0][:])
     107                        cmap[key][0][0] = 0
     108                    if cmap[key][-1][0] != 1:
     109                        cmap[key].append(cmap[key][-1][:])
     110                        cmap[key][-1][0] = 1
     111
     112
     113        for part in ['dots', 'lines']:
     114            if self.settings[part]['color']['cmap']:
     115                cmap = self.settings[part]['color']['cmap']
     116                for key in cmap:
     117                    new_arr = []
     118                    for arr in cmap[key]:
     119                        new_arr.append(tuple(arr))
     120                    cmap[key] = tuple(new_arr)
     121                #print(cmap)
     122                self.settings[part]['color']['cmap'] = colors.LinearSegmentedColormap('Custom', cmap)
    87123
    88124    def draw_dots(self, file, min_width, max_width, max_height):
     
    137173        bias = self.settings[part][prop]['bias']
    138174        if prop == "color":
    139             return self.compute_color(start, end, value, bias)
     175            if not self.settings[part][prop]['cmap']:
     176                return self.compute_color(start, end, value, bias)
     177            else:
     178                return self.compute_color_from_cmap(self.settings[part][prop]['cmap'], value, bias)
    140179        else:
    141180            return self.compute_value(start, end, value, bias)
     181
     182    def compute_color_from_cmap(self, cmap, value, bias=1):
     183        value = 1 - (1-value)**bias
     184        rgba = cmap(value)
     185        return (100*rgba[0], 100*rgba[1], 100*rgba[2])
     186
    142187
    143188    def compute_color(self, start, end, value, bias=1):
     
    220265        offset = (min(fx-w, tx-w), min(fy-w, ty-w))
    221266        size = (abs(fx-tx)+2*w, abs(fy-ty)+2*w)
     267        if size[0] == 0 or size[1] == 0:
     268            return
    222269
    223270        c = style['color']
Note: See TracChangeset for help on using the changeset viewer.