def __init__(self, source_image: TiledImage, image_id: str = None, cmap_range: Tuple[float, float] = DEFAULT_COLOR_MAP_VALUE_RANGE, cmap_name: str = DEFAULT_COLOR_MAP_NAME, num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS, no_data_value: Union[int, float] = None, encode: bool = False, format: str = None, tile_cache: Cache = None, trace_perf: bool = False): super().__init__(source_image, image_id=image_id, format=format, mode='RGBA', tile_cache=tile_cache, trace_perf=trace_perf) self._cmap_range = cmap_range or DEFAULT_COLOR_MAP_VALUE_RANGE cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME, default_cmap_name=DEFAULT_COLOR_MAP_NAME, num_colors=num_colors or DEFAULT_COLOR_MAP_NUM_COLORS) self._cmap_name = cmap_name self._cmap = cmap self._no_data_value = no_data_value self._encode = encode
def get_color_mapping(self, ds_id: str, var_name: str) -> Tuple[str, Tuple[float, float]]: cmap_name = None cmap_vmin, cmap_vmax = None, None color_mappings = self.get_color_mappings(ds_id) if color_mappings: color_mapping = color_mappings.get(var_name) if color_mapping: cmap_vmin, cmap_vmax = color_mapping.get( 'ValueRange', (None, None)) if color_mapping.get('ColorFile') is not None: cmap_name = color_mapping.get('ColorFile', cmap_name) else: cmap_name = color_mapping.get('ColorBar', cmap_name) cmap_name, _ = get_cmap(cmap_name) cmap_range = cmap_vmin, cmap_vmax if cmap_name is not None and None not in cmap_range: # noinspection PyTypeChecker return cmap_name, cmap_range ds = self.get_dataset(ds_id, expected_var_names=[var_name]) var = ds[var_name] valid_range = get_var_valid_range(var) return get_var_cmap_params(var, cmap_name, cmap_range, valid_range)
def get_color_mapping(self, ds_id: str, var_name: str): cmap_name = None cmap_vmin, cmap_vmax = None, None dataset_descriptor = self.get_dataset_descriptor(ds_id) style_name = dataset_descriptor.get('Style', 'default') styles = self._config.get('Styles') if styles: style = None for s in styles: if style_name == s['Identifier']: style = s break if style: color_mappings = style.get('ColorMappings') if color_mappings: color_mapping = color_mappings.get(var_name) if color_mapping: cmap_vmin, cmap_vmax = color_mapping.get('ValueRange', (None, None)) if color_mapping.get('ColorFile') is not None: cmap_name = color_mapping.get('ColorFile', cmap_name) else: cmap_name = color_mapping.get('ColorBar', cmap_name) cmap_name, _ = get_cmap(cmap_name) cmap_params = cmap_name, cmap_vmin, cmap_vmax if None not in cmap_params: return cmap_params ds = self.get_dataset(ds_id, expected_var_names=[var_name]) var = ds[var_name] valid_range = get_var_valid_range(var) return get_var_cmap_params(var, cmap_name, cmap_vmin, cmap_vmax, valid_range)
def test_get_cmap(self): ensure_cmaps_loaded() cmap_name, cmap = get_cmap('plasma') self.assertEqual('plasma', cmap_name) self.assertIsInstance(cmap, Colormap) cmap_name, cmap = get_cmap('PLASMA') self.assertEqual('viridis', cmap_name) self.assertIsInstance(cmap, Colormap) cmap_name, cmap = get_cmap('PLASMA', default_cmap_name='magma') self.assertEqual('magma', cmap_name) self.assertIsInstance(cmap, Colormap) with self.assertRaises(ValueError): get_cmap('PLASMA', default_cmap_name='MAGMA')
def get_legend(ctx: ServiceContext, ds_id: str, var_name: str, params: RequestParams): cmap_name = params.get_query_argument('cbar', default=None) cmap_vmin = params.get_query_argument_float('vmin', default=None) cmap_vmax = params.get_query_argument_float('vmax', default=None) cmap_w = params.get_query_argument_int('width', default=None) cmap_h = params.get_query_argument_int('height', default=None) if cmap_name is None or cmap_vmin is None or cmap_vmax is None or cmap_w is None or cmap_h is None: default_cmap_cbar, (default_cmap_vmin, default_cmap_vmax) = ctx.get_color_mapping( ds_id, var_name) cmap_name = cmap_name or default_cmap_cbar cmap_vmin = cmap_vmin or default_cmap_vmin cmap_vmax = cmap_vmax or default_cmap_vmax cmap_w = cmap_w or DEFAULT_CMAP_WIDTH cmap_h = cmap_h or DEFAULT_CMAP_HEIGHT try: _, cmap = get_cmap(cmap_name) except ValueError: raise ServiceResourceNotFoundError( f"color bar {cmap_name!r} not found") fig = matplotlib.figure.Figure(figsize=(cmap_w, cmap_h)) ax1 = fig.add_subplot(1, 1, 1) if '.cpd' in cmap_name: norm, ticks = get_norm(cmap_name) else: norm = matplotlib.colors.Normalize(vmin=cmap_vmin, vmax=cmap_vmax) ticks = None image_legend = matplotlib.colorbar.ColorbarBase(ax1, format='%.1f', ticks=ticks, cmap=cmap, norm=norm, orientation='vertical') image_legend_label = ctx.get_legend_label(ds_id, var_name) if image_legend_label is not None: image_legend.set_label(image_legend_label) fig.patch.set_facecolor('white') fig.patch.set_alpha(0.0) fig.tight_layout() buffer = io.BytesIO() fig.savefig(buffer, format='png') return buffer.getvalue()
def __init__(self, source_image: TiledImage, image_id: str = None, cmap_name: str = DEFAULT_COLOR_MAP_NAME, num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS, encode: bool = False, format: str = None, tile_cache: Cache = None, trace_perf: bool = False): super().__init__(source_image, image_id=image_id, format=format, mode='RGBA', tile_cache=tile_cache, trace_perf=trace_perf) cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME, default_cmap_name=DEFAULT_COLOR_MAP_NAME, num_colors=num_colors or DEFAULT_COLOR_MAP_NUM_COLORS) self._cmap_name = cmap_name self._cmap = cmap self._encode = encode
def __init__(self, array: np.ndarray, tile_size: Size2D, image_id: str = None, cmap_range: Tuple[float, float] = DEFAULT_COLOR_MAP_VALUE_RANGE, cmap_name: str = DEFAULT_COLOR_MAP_NAME, num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS, no_data_value: Union[int, float] = None, encode: bool = False, format: str = None, tile_cache: Cache = None, flip_y: bool = False, valid_range: Tuple[Number, Number] = None, trace_perf: bool = False): width, height = array.shape[-1], array.shape[-2] tile_width, tile_height = tile_size num_tiles = (width + tile_width - 1) // tile_width, ( height + tile_height - 1) // tile_height super().__init__((width, height), tile_size=tile_size, num_tiles=num_tiles, image_id=image_id, format=format, mode='RGBA', tile_cache=tile_cache, trace_perf=trace_perf) valid_range = valid_range if valid_range is not None else (-np.inf, np.inf) valid_range = tuple(map(float, valid_range)) no_data_value = float( no_data_value) if no_data_value is not None else float(np.nan) cmap_range = cmap_range if cmap_range is not None else DEFAULT_COLOR_MAP_VALUE_RANGE cmap_range = tuple(map(float, cmap_range)) self._array = array self._valid_range = valid_range self._no_data_value = no_data_value self._encode = encode self._flip_y = flip_y self._cmap_range = cmap_range self._num_colors = num_colors or DEFAULT_COLOR_MAP_NUM_COLORS cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME, default_cmap_name=DEFAULT_COLOR_MAP_NAME) self._colors = cmap( np.linspace(0, 1, num_colors or DEFAULT_COLOR_MAP_NUM_COLORS))
def get_color_mapping(self, ds_id: str, var_name: str): cmap_cbar, cmap_vmin, cmap_vmax = DEFAULT_CMAP_CBAR, DEFAULT_CMAP_VMIN, DEFAULT_CMAP_VMAX dataset_descriptor = self.get_dataset_descriptor(ds_id) style_name = dataset_descriptor.get('Style', 'default') styles = self._config.get('Styles') if styles: style = None for s in styles: if style_name == s['Identifier']: style = s break # TODO: check color_mappings is not None if style: color_mappings = style.get('ColorMappings') if color_mappings: # TODO: check color_mappings is not None color_mapping = color_mappings.get(var_name) if color_mapping: cmap_vmin, cmap_vmax = color_mapping.get( 'ValueRange', (cmap_vmin, cmap_vmax)) if color_mapping.get('ColorFile') is not None: cmap_cbar = color_mapping.get( 'ColorFile', cmap_cbar) else: cmap_cbar = color_mapping.get( 'ColorBar', cmap_cbar) cmap_cbar, _ = get_cmap(cmap_cbar) return cmap_cbar, cmap_vmin, cmap_vmax else: ds = self.get_dataset(ds_id, expected_var_names=[var_name]) var = ds[var_name] cmap_cbar = var.attrs.get('color_bar_name', cmap_cbar) cmap_vmin = var.attrs.get('color_value_min', cmap_vmin) cmap_vmax = var.attrs.get('color_value_max', cmap_vmax) _LOG.warning( f'color mapping for variable {var_name!r} of dataset {ds_id!r} undefined: using defaults' ) return cmap_cbar, cmap_vmin, cmap_vmax