colorbar bug or feature?

Hi,

I would like to know if that it is normal to have the colorbar bigger than the image when used with imshow. By bigger I means when the image is plotting with a label, the colorbar doesn't stop at the image but use the space where is the label.

mat = numarray.arange(100,shape=(10,10))
imshow(mat)
xlabel('toto')
colorbar()

Another question. Is it possible to gave a xlabel (or ylabel) to the colorbar and the image independantly? I tried to use xlabel (ylabel) after the colorbar but that does nothing.

Thank you,

N.

Humufr wrote:

Hi,

I would call it a limitation of the present simple design, not a bug or a feature.

I would like to know if that it is normal to have the colorbar bigger than the image when used with imshow. By bigger I means when the image is plotting with a label, the colorbar doesn't stop at the image but use the space where is the label.

mat = numarray.arange(100,shape=(10,10))
imshow(mat)
xlabel('toto')
colorbar()

The present colorbar uses a very simple method to set its size and position; I think it is essentially the same as what the Matlab colorbar does. If that doesn't yield what you want, then for now you need to manually adjust the size and shape of the axes object returned by the colorbar command, or make your own axes beforehand and give that as an argument to the colorbar method of the figure object.

As part of a reworking of the colorbar, I may be able to improve the automatic positioning and/or make manual adjustments easier. It is likely to be a while before I get to that point, however, and the need for at least occasional manual adjustment will never go away.

Another question. Is it possible to gave a xlabel (or ylabel) to the colorbar and the image independantly? I tried to use xlabel (ylabel) after the colorbar but that does nothing.

Yes, but you need to grab the axes object returned by colorbar(); otherwise pylab has no way of knowing which axes you are trying to label.

See contourf_demo.py for an example. A relevant fragment is this:

CS2 = contour(X, Y, Z, CS.levels,
                         colors = 'r',
                         origin=origin,
                         hold='on')

title('Nonsense')
xlabel('word length anomaly')
ylabel('sentence length anomaly')

# Make a colorbar for the ContourSet returned by the contourf call.
ax_cbar = colorbar(CS, tickfmt='%1.2f')
ax_cbar.set_ylabel('verbosity coefficient')

···

------------

If you want to change the size of the colorbar, shrinking it in the vertical, for example, you could do something like:

l,b,w,h = ax_cbar.get_position()
bb = b + 0.1 * h
hh = 0.8 * h
ax_cbar.set_position([l,bb,w,hh])

(If you are doing this interactively in ipython, you may need a call to draw_if_interactive() to force a redraw.)

(There is code in svn to make this sort of thing easier, but it is incomplete and not yet ready for general use.)

Eric