Jim,

I have modified your LogNorm, added it to colors.py, made some changes 
to colorbar.py, and added a stripped-down version of your pcolor_log.py 
to the examples directory.  If you update your mpl from svn, then I 
think you will find that pcolor_log now works the way you expected it to 
originally, with the colorbar automatically supporting the log color scale.

Eric

JIM MacDonald wrote:
> Hi Eric,
> 
> Thanks for your reply. It made me realise a few things....
>> > But when I add a colorbar it goes wrong. The colorbar is labelled with
>> > the log of the values, rather
>> > than values, and the colour only fills the top third of the colorbar.
>>
>> In the absence of additional kwargs, colorbar uses norm.vmin and
>> norm.vmax to determine the limits of the colorbar, and it uses a default
>> formatter.  It has no way of knowing that you have taken the log of your
>> original values.
> Yes of course there is in inconsistency in my LogNorm class. norm.vmax
> will return the log of the maximum, when logically it should return
> the max of the actual maximum. I've modified my example to take this
> into account. see attached (and updated version online).
> 
> 
>> Colorbar will need some kwargs, at the very least.  The "format" kwarg,
>> for example, can be used to pass in a Formatter instance so that a label
>> is 10^-3 instead of -3.
> Ah I'd not discovered Formatters yet. But this does give a good solution.
> If I instead do a pcolor of the log of my data, and then use a
> FormatStrFormatter as you surgested:
> 
> pcolor(X,Y,log10(Z1),shading='flat')
> colorbar(format=FormatStrFormatter('$10^{%d}$'))
> 
> I get exactly what I want :-) Its not the most intuitive way to do it,
> but it works and I can't see any major drawbacks.
> 
>> I am not sure why only the top is colored in your example--it might be a
>> bug or it might be an indication that additional kwargs are needed.  I
>> am reasonably sure there is a simple solution, but I can't look at it
>> any more right now--maybe I can get back to it this evening.
> 
> I'm pretty sure the reason only the top was coloured is to do in the
> inconsistency I described above. Once I fixed that the colorbar is
> fine except that it is not on a log scale. But of course it can't know
> that it is suppost to be on a log scale! I tried to do:
> 
> gca().axes[1].set_ylim((1e-5,1))
> gca().axes[1].set_yscale('log')
> 
> but that doesn't work. I get a load of errors :
> 
> exceptions.ValueError                                Traceback (most
> recent call last)
> 
> /usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtk.py in
> expose_event(self, widget, event)
>    282                 x, y, w, h = self.allocation
>    283                 self._pixmap_prepare (w, h)
> --> 284                 self._render_figure(self._pixmap, w, h)
>    285                 self._need_redraw = False
>    286
> 
> /usr/lib/python2.4/site-packages/matplotlib/backends/backend_gtkagg.py
> in _render_figure(self, pixmap, width, height)
>     71     def _render_figure(self, pixmap, width, height):
>     72         if DEBUG: print 'FigureCanvasGTKAgg.render_figure'
> ---> 73         FigureCanvasAgg.draw(self)
>     74         if DEBUG: print 'FigureCanvasGTKAgg.render_figure
> pixmap', pixmap
>     75         #agg_to_gtk_drawable(pixmap, self.renderer._renderer, None)
> 
> /usr/lib/python2.4/site-packages/matplotlib/backends/backend_agg.py in
> draw(self)
>    390
>    391         renderer = self.get_renderer()
> --> 392         self.figure.draw(renderer)
>    393
>    394     def get_renderer(self):
> 
> /usr/lib/python2.4/site-packages/matplotlib/figure.py in draw(self, 
> renderer)
>    542
>    543         # render the axes
> --> 544         for a in self.axes: a.draw(renderer)
>    545
>    546         # render the figure text
> 
> /usr/lib/python2.4/site-packages/matplotlib/axes.py in draw(self,
> renderer, inframe)
>   1061
>   1062         for zorder, i, a in dsu:
> -> 1063             a.draw(renderer)
>   1064
>   1065         self.transData.thaw()  # release the lazy objects
> 
> /usr/lib/python2.4/site-packages/matplotlib/patches.py in draw(self, 
> renderer)
>    163
>    164         verts = self.get_verts()
> --> 165         tverts = self._transform.seq_xy_tups(verts)
>    166
>    167         renderer.draw_polygon(gc, rgbFace, tverts)
> 
> ValueError: Domain error on nonlinear Transformation::seq_xy_tups
> operator()(thisx, thisy)
> 
> As for how to solve the problem properly. Matlab allows one to set to
> caxis scale to log. Maybe colorbar could detect that the norm instance
> was an instance of LogNorm and scale the yaxis logarithmicly. Or would
> it be better to put a scale={'log','linear'} kwarg into colorbar()?
> 
> Thanks again for your help.
> 
> cheers
> 
> JIM
> ---


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to