title: Midpoint of Color Palette
body: <p>For my current project I need a heat map. The heat map needs a scalable color palette, because the values are interesting only in a small range. That means, even if I have values from 0 to 1, interesting is only the part between 0.6 and 0.9; so I would like to scale the heat map colors accordingly, plus show the scale next to the chart. </p>
  
  <p>In Matplotlib I had no way of setting the mid point of a color palette except for overloading the original class, like <a href="https://matplotlib.org/users/colormapnorms.html#custom-normalization-two-linear-ranges" rel="nofollow noreferrer">shown here in the matplotlib guide</a>.</p>
  
  <p>This is exactly what I need, but without the disadvantages of the unclean data structure in Matplotlib. </p>
  
  <p>So I tried Bokeh.
  In five minutes I achieved more than with Matplotlib in an hour, however, I got stuck when I wanted to show the color scale next to the heatmap and when I wanted to change the scale of the color palette.</p>
  
  <p>So, here are my questions:</p>
  
  <p>How can I scale the color palette in Bokeh or Matplotlib?</p>
  
  <p>Is there a way to display the annotated color bar next to the heatmap?</p>
  
  <pre><code>import pandas
  scores_df = pd.DataFrame(myScores, index=c_range, columns=gamma_range)
  
  import bkcharts
  from bokeh.palettes import Inferno256
  hm = bkcharts.HeatMap(scores_df, palette=Inferno256)
  # here: how to insert a color bar?
  # here: how to correctly scale the inferno256 palette?
  hm.ylabel = "C"
  hm.xlabel = "gamma"
  bkcharts.output_file('heatmap.html')
  </code></pre>
  
  <p>Following Aarons tips, i now implemented it as follows:</p>
  
  <pre><code>import matplotlib.pyplot as plt
  import matplotlib.colors as colors
  from bokeh.palettes import Inferno256
  
  
  def print_scores(scores, gamma_range, C_range):
      # load a color map
      # find other colormaps here
      # https://docs.bokeh.org/en/latest/docs/reference/palettes.html
      cmap = colors.ListedColormap(Inferno256, len(Inferno256))
      fig, ax = plt.subplots(1, 1, figsize=(6, 5))
  
      # adjust lower, midlle and upper bound of the colormap
      cmin = np.percentile(scores, 10)
      cmid = np.percentile(scores, 75)
      cmax = np.percentile(scores, 99)
      bounds = np.append(np.linspace(cmin, cmid), np.linspace(cmid, cmax))
      norm = colors.BoundaryNorm(boundaries=bounds, ncolors=len(Inferno256))
  
      pcm = ax.pcolormesh(np.log10(gamma_range),
                      np.log10(C_range),
                      scores,
                      norm=norm,
                      cmap=cmap)
      fig.colorbar(pcm, ax=ax, extend='both', orientation='vertical')
      plt.show()
  </code></pre>