SourceForge logo
SourceForge logo
Menu

matplotlib-devel

From: JIM M. <ji...@ji...> - 2006年11月28日 09:47:47
Hi,
I'm trying to do a pcolor plot with a log normalised colour scale.
Following advice from past posts
to this list I specialised the matplotlib.colors.normalize class, and
passed an instance of that to
pcolor using the norm kwarg.
This works fine :-)
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.
Am I doing something wrong, or is this a problem with the colorbar?
Any help would be much
appreciated. I realise that as a work around I could do a pcolor of
the log of my data and manually
relabel the colorbar, but it would be nice to do it properly.
I've attached an png of the output and the code. Just in case the
attachments get stripped they are
also available to download from:
http://jimmacdonald.co.uk/pcolor_log.png
http://jimmacdonald.co.uk/pcolor_log.py
I'm running the svn version (r2898--- lastest as of yesterday) with
numpy-1.0_rc1 on gentoo.
Keep up the good work!
Cheers,
JIM
---
From: Eric F. <ef...@ha...> - 2006年11月28日 19:04:12
JIM MacDonald wrote:
> Hi,
> 
> I'm trying to do a pcolor plot with a log normalised colour scale.
> Following advice from past posts
> to this list I specialised the matplotlib.colors.normalize class, and
> passed an instance of that to
> pcolor using the norm kwarg.
> 
> This works fine :-)
> 
> 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.
> 
> Am I doing something wrong, or is this a problem with the colorbar?
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.
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.
Eric
> Any help would be much
> appreciated. I realise that as a work around I could do a pcolor of
> the log of my data and manually
> relabel the colorbar, but it would be nice to do it properly.
> 
> I've attached an png of the output and the code. Just in case the
> attachments get stripped they are
> also available to download from:
> http://jimmacdonald.co.uk/pcolor_log.png
> http://jimmacdonald.co.uk/pcolor_log.py
> 
> I'm running the svn version (r2898--- lastest as of yesterday) with
> numpy-1.0_rc1 on gentoo.
> 
> Keep up the good work!
> 
> Cheers,
> 
> JIM
From: JIM M. <ji...@ji...> - 2006年11月28日 21:15:46
Attachments: pcolor_log.py
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
---
From: Eric F. <ef...@ha...> - 2006年12月03日 22:02:57
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
> ---
From: JIM M. <ji...@ji...> - 2006年12月04日 21:55:36
Hi Eric,
> 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.
I just upgraded and it works great!
Thanks very much.
JIM
---
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /