Source code for lib5c.plotters.asymmetric_colormap

"""
Module providing a function to create shifted colormaps.
"""

import numpy as np
import matplotlib
import matplotlib.pyplot as plt


[docs]def shifted_colormap(cmap, start=0, midpoint=0.5, stop=1.0, name='shiftedcmap'): """ Function to offset the "center" of a colormap. Useful for data with a negative min and positive max and you want the middle of the colormap's dynamic range to be at zero Parameters ----- cmap : matplotlib colormap The matplotlib colormap to be altered start : Optional[float] Offset from lowest point in the colormap's range. Defaults to 0.0 (no lower ofset). Should be between 0.0 and ``midpoint``. midpoint : Optional[float] The new center of the colormap. Defaults to 0.5 (no shift). Should be between 0.0 and 1.0. In general, this should be ``1 - vmax/(vmax + abs(vmin))``. For example if your data range from -15.0 to +5.0 and you want the center of the colormap at 0.0, ``midpoint`` should be set to ``1 - 5/(5 + 15))`` or 0.75 stop : Optional[float] Offset from highest point in the colormap's range. Defaults to 1.0 (no upper ofset). Should be between ``midpoint`` and 1.0. name : Optional[str] The name under which to register the new colormap. """ cdict = { 'red' : [], 'green': [], 'blue' : [], 'alpha': [] } # regular index to compute the colors reg_index = np.linspace(start, stop, 257) # shifted index to match the data shift_index = np.hstack([ np.linspace(0.0, midpoint, 128, endpoint=False), np.linspace(midpoint, 1.0, 129, endpoint=True) ]) for ri, si in zip(reg_index, shift_index): r, g, b, a = cmap(ri) cdict['red'].append((si, r, r)) cdict['green'].append((si, g, g)) cdict['blue'].append((si, b, b)) cdict['alpha'].append((si, a, a)) newcmap = matplotlib.colors.LinearSegmentedColormap(name, cdict) plt.register_cmap(cmap=newcmap) return newcmap