views:

834

answers:

1

I'd like to display a colorbar representing an image's raw values along side a matplotlib imshow subplot which displays that image, normalized.

I've been able to draw the image and a colorbar successfully like this, but the colorbar min and max values represent the normalized (0,1) image instead of the raw (0,99) image.

f = plt.figure()
# create toy image
im = np.ones((100,100))
for x in range(100):
    im[x] = x
# create imshow subplot
ax = f.add_subplot(111)
result = ax.imshow(im / im.max())

# Create the colorbar
axc, kw = matplotlib.colorbar.make_axes(ax)
cb = matplotlib.colorbar.Colorbar(axc, result)

# Set the colorbar
result.colorbar = cb

If someone has a better mastery of the colorbar API, I'd love to hear from you.

Thanks! Adam

+3  A: 

It looks like you passed the wrong object to the colorbar constructor.

This should work:

# make namespace explicit
from matplotlib import pyplot as PLT

cbar = fig.colorbar(result)

The snippet above is based on the code in your answer; here's a complete example:

import numpy as NP
from matplotlib import pyplot as PLT

A = NP.random.random_integers(0, 10, 100).reshape(10, 10)
fig = PLT.figure()
ax1 = fig.add_subplot(111)

cax = ax1.imshow(A, interpolation="nearest")
# set the tickmarks *if* you want cutom (ie, arbitrary) tick labels:
cbar = fig.colorbar(cax, ticks=[0, 5, 10])
# note: 'ax' is not the same as the 'axis' instance created by calling 'add_subplot'
# the latter instance i bound to the variable 'ax1' to avoid confusing the two
cbar.ax.set_yticklabels(["lo", "med", "hi"])
PLT.show()

As i suggested in the comment above, i would choose a cleaner namespace that what you have (e.g., 'from matplotlib import pyplot as PLT'--that doesn't get the entire matplotlib namespace, but what it doesn't include you can import separately.)

doug