Eric Firing wrote:
On 06/03/2010 10:00 AM, Jim Vickroy wrote:
I want to generate a 2-d figure with a (fixed) color scale that  does
not vary with the range of the data being plotted.

How do I do this? Attempts to specify vimin and vmax appear to be ignored.

The following example:

#<code>
import numpy
data = numpy.zeros(shape=(240,240),dtype=int)
data[ 0: 80] = -1
data[ 80:160] = 0
data[160:] = 1

import matplotlib.pyplot as plot
figure = plot.figure()
ax = figure.add_subplot(111)
cax = ax.imshow(data, interpolation='bilinear')
ax.set_title('test data with fixed colorbar')

Adding to what JJ said, note that setting the ticks on the colorbar has no effect on the norm used in color mapping. The vmin and vmax kwargs to imshow get passed to the norm, so they do set the mapping range.

colorbar = figure.colorbar(cax, ticks=[-1, 0, 1])
colorbar.ax.set_yticklabels(['-1', '0', '1'])

Please avoid setting the ticklabels directly--it is almost always unnecessary, and it is too easy to shoot yourself in the foot. If the default tick label formatting is inadequate, you can use the format kwarg in colorbar.

 From the docstring:

         *ticks*       [ None | list of ticks | Locator object ]
                       If None, ticks are determined automatically from the
                       input.
         *format*      [ None | format string | Formatter object ]
                       If None, the
                       :class:`~matplotlib.ticker.ScalarFormatter` is used.
                       If a format string is given, e.g. '%.3f', that is
                       used. An alternative
                       :class:`~matplotlib.ticker.Formatter` object may be
                       given instead.


Eric

Thanks for this advice.

In my case, the data being plotted is in the range 0-255, but the color-bar labels are to be in the range 1-4095. So I have the following code snippet:

colorbar = figure.colorbar(image, cax, orientation='vertical', ticks=(0, 64, 128, 192, 254)) colorbar.ax.set_yticklabels(('1','8','64','512','4095')) # colorbar labels (which are to be in units of DN/sec on a log10 scale)

Is there a better way to do this?

-- jv



plot.show()
#</code>

produces a figure with 3 color bands (blue,green,red) and matching color
bar with labels (-1,0,1) as expected.

if the data[160:]=1 specification is deleted, in the above code, the
resulting figure has 2 color bands (blue,red) and the associated color
bar is identical to the original, but the labels are (-1,0).

What I want, in this second case, is a blue-green figure and a color bar
with labels identical to the original example.

-- jv



------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the
lucky parental unit.  See the prize list and enter to win:
http://p.sf.net/sfu/thinkgeek-promo



_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win: http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to