def bokeh_palette_to_palette(cmap, ncolors=None, categorical=False): from bokeh import palettes # Handle categorical colormaps to avoid interpolation categories = [ 'accent', 'category', 'dark', 'colorblind', 'pastel', 'set1', 'set2', 'set3', 'paired' ] cmap_categorical = any(cat in cmap.lower() for cat in categories) reverse = False if cmap.endswith('_r'): cmap = cmap[:-2] reverse = True # Some colormaps are inverted compared to matplotlib inverted = (not cmap_categorical and not cmap.capitalize() in palettes.mpl) if inverted: reverse = not reverse ncolors = ncolors or 256 # Alias mpl tab cmaps with bokeh Category cmaps if cmap.startswith('tab'): cmap = cmap.replace('tab', 'Category') # Process as bokeh palette palette = getattr(palettes, cmap, getattr(palettes, cmap.capitalize(), None)) if palette is None: raise ValueError("Supplied palette %s not found among bokeh palettes" % cmap) elif isinstance(palette, dict) and (cmap in palette or cmap.capitalize() in palette): # Some bokeh palettes are doubly nested palette = palette.get(cmap, palette.get(cmap.capitalize())) if isinstance(palette, dict): palette = palette[max(palette)] if not cmap_categorical: if len(palette) < ncolors: palette = polylinear_gradient(palette, ncolors) elif callable(palette): palette = palette(ncolors) if reverse: palette = palette[::-1] if len(palette) != ncolors: if categorical and cmap_categorical: palette = [palette[i % len(palette)] for i in range(ncolors)] else: lpad, rpad = -0.5, 0.49999999999 indexes = np.linspace(lpad, (len(palette) - 1) + rpad, ncolors) palette = [palette[int(np.round(v))] for v in indexes] return palette
def bokeh_palette_to_palette(cmap, ncolors=None, categorical=False): from bokeh import palettes # Handle categorical colormaps to avoid interpolation categories = ['accent', 'category', 'dark', 'colorblind', 'pastel', 'set1', 'set2', 'set3', 'paired'] cmap_categorical = any(cat in cmap.lower() for cat in categories) reverse = False if cmap.endswith('_r'): cmap = cmap[:-2] reverse = True # Some colormaps are inverted compared to matplotlib inverted = (not cmap_categorical and not cmap.capitalize() in palettes.mpl) if inverted: reverse=not reverse ncolors = ncolors or 256 # Alias mpl tab cmaps with bokeh Category cmaps if cmap.startswith('tab'): cmap = cmap.replace('tab', 'Category') # Process as bokeh palette palette = getattr(palettes, cmap, getattr(palettes, cmap.capitalize(), None)) if palette is None: raise ValueError("Supplied palette %s not found among bokeh palettes" % cmap) elif isinstance(palette, dict) and (cmap in palette or cmap.capitalize() in palette): # Some bokeh palettes are doubly nested palette = palette.get(cmap, palette.get(cmap.capitalize())) if isinstance(palette, dict): palette = palette[max(palette)] if not cmap_categorical: if len(palette) < ncolors: palette = polylinear_gradient(palette, ncolors) elif callable(palette): palette = palette(ncolors) if reverse: palette = palette[::-1] if len(palette) != ncolors: if categorical and cmap_categorical: palette = [palette[i%len(palette)] for i in range(ncolors)] else: lpad, rpad = -0.5, 0.49999999999 indexes = np.linspace(lpad, (len(palette)-1)+rpad, ncolors) palette = [palette[int(np.round(v))] for v in indexes] return palette