@@ -395,7 +395,36 @@ def cluster_labels(labels=None, xticks=None, majority=True):
395395 x = [np .mean (clusters_x [i ]) for i in clusters_x ]
396396 return labels , x
397397
398+ def adjust_cmap (cmap ,vmin ,vmax ,center = None ,na_col = 'white' ):
399+ # Choose default colormaps if not provided
400+ if isinstance (cmap , str ):
401+ try :
402+ cmap = get_colormap (cmap ).copy ()
403+ except :
404+ cmap = get_colormap (cmap )
405+
406+ cmap .set_bad (color = na_col ) # set the color for NaN values
407+ # Recenter a divergent colormap
408+ if center is not None :
409+ # bad = cmap(np.ma.masked_invalid([np.nan]))[0] # set the first color as the na_color
410+ under = cmap (- np .inf )
411+ over = cmap (np .inf )
412+ under_set = under != cmap (0 )
413+ over_set = over != cmap (cmap .N - 1 )
398414
415+ vrange = max (vmax - center , center - vmin )
416+ normlize = matplotlib .colors .Normalize (center - vrange , center + vrange )
417+ cmin , cmax = normlize ([vmin , vmax ])
418+ cc = np .linspace (cmin , cmax , 256 )
419+ cmap = matplotlib .colors .ListedColormap (cmap (cc ))
420+ # self.cmap.set_bad(bad)
421+ if under_set :
422+ cmap .set_under (
423+ under
424+ ) # set the color of -np.inf as the color for low out-of-range values.
425+ if over_set :
426+ cmap .set_over (over )
427+ return cmap
399428# =============================================================================
400429def plot_color_dict_legend (
401430 D = None , ax = None , title = None , color_text = True , label_side = "right" , kws = None
@@ -518,17 +547,19 @@ def plot_cmap_legend(
518547 vcenter = (vmax + vmin ) / 2
519548 center = cbar_kws .pop ("center" ,None )
520549 if center is None :
521- cbar_kws . setdefault ( "ticks" , [ vmin , vcenter , vmax ])
550+ center = vcenter
522551 m = plt .cm .ScalarMappable (
523552 norm = matplotlib .colors .Normalize (vmin = vmin , vmax = vmax ), cmap = cmap
524553 )
525554 else :
526555 m = plt .cm .ScalarMappable (
527- norm = matplotlib .colors .CenteredNorm ( vcenter = center ), cmap = cmap
556+ norm = matplotlib .colors .TwoSlopeNorm ( center , vmin = vmin , vmax = vmax ), cmap = cmap
528557 )
558+ cbar_kws .setdefault ("ticks" , [vmin , center , vmax ])
529559 cax .yaxis .set_label_position (label_side )
530560 cax .yaxis .set_ticks_position (label_side )
531561 cbar = ax .figure .colorbar (m , cax = cax , ** cbar_kws ) # use_gridspec=True
562+ # cbar.set_ticks([vmin,center,vmax])
532563 # cbar.outline.set_color('white')
533564 # cbar.outline.set_linewidth(2)
534565 # cbar.dividers.set_color('red')
0 commit comments