import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from matplotlib.colors import LinearSegmentedColormap from scipy.interpolate import griddata, SmoothBivariateSpline from scipy.stats import norm from scipy.optimize import curve_fit def shiftedColorMap(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 Input ----- cmap : The matplotlib colormap to be altered start : Offset from lowest point in the colormap's range. Defaults to 0.0 (no lower ofset). Should be between 0.0 and `midpoint`. midpoint : 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 : Offset from highets point in the colormap's range. Defaults to 1.0 (no upper ofset). Should be between `midpoint` and 1.0. """ 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 = LinearSegmentedColormap(name, cdict) plt.register_cmap(cmap=newcmap) return newcmap def plot_color_map(series, sort_order=[True, True], color_map=cm.RdYlGn, centered=True): """ 2D heat map - if x-axis is time translate to days instead Parameters ----- series: Series with multilevel index (x: first level, y: second level) sort_order: sorting in the x,y axis color_map: default Red-Yellow-Green centered: center yellow as 0 of the series. """ x = series.index.get_level_values(0) y = series.index.get_level_values(1) if x.dtype == "