pythonmatplotlibgraphcolorbarcolormap

Set Colorbar Range


I have the following code:

import matplotlib.pyplot as plt

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}
 
cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)
 
plt.clf()
plt.pcolor(X, Y, v, cmap=cm)
plt.loglog()
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
 
plt.colorbar()
plt.show()

This produces a graph of the values v on the axes X vs Y, using the specified colormap. The X and Y axes are perfect, but the colormap spreads between the min and max of v. I would like to force the colormap to range between 0 and 1.

I thought of using:

plt.axis(...)

To set the ranges of the axes, but this only takes arguments for the min and max of X and Y, not the colormap.

Edit:

For clarity, let's say I have one graph whose values range (0 ... 0.3), and another graph whose values (0.2 ... 0.8).

In both graphs, I will want the range of the colorbar to be (0 ... 1). In both graphs, I want this range of colour to be identical using the full range of cdict above (so 0.25 in both graphs will be the same colour). In the first graph, all colours between 0.3 and 1.0 won't feature in the graph, but will in the colourbar key at the side. In the other, all colours between 0 and 0.2, and between 0.8 and 1 will not feature in the graph, but will in the colourbar at the side.


Solution

  • Using vmin and vmax forces the range for the colors. Here's an example:

    enter image description here

    import matplotlib as m
    import matplotlib.pyplot as plt
    import numpy as np
    
    cdict = {
      'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
      'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
      'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
    }
    
    cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)
    
    x = np.arange(0, 10, .1)
    y = np.arange(0, 10, .1)
    X, Y = np.meshgrid(x,y)
    
    data = 2*( np.sin(X) + np.sin(3*Y) )
    
    def do_plot(n, f, title):
        #plt.clf()
        plt.subplot(1, 3, n)
        plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4)
        plt.title(title)
        plt.colorbar()
    
    plt.figure()
    do_plot(1, lambda x:x, "all")
    do_plot(2, lambda x:np.clip(x, -4, 0), "<0")
    do_plot(3, lambda x:np.clip(x, 0, 4), ">0")
    plt.show()