Problems with auto scaling with infinite values

Hi all,

If I try to plot a graph with some y-values as -inf (which is very
common in physical sciences as we often take log10 of amplitude values
which can be zero), then matplotlib raises an exception:

/usr/lib/python2.5/site-packages/matplotlib/ticker.py in
scale_range(vmin, vmax, n, threshold)
    814 offset = 10**ex
    815 else:
--> 816 ex = divmod(math.log10(-meanv), 1)[0]
    817 offset = -10**ex
    818 ex = divmod(math.log10(dv/n), 1)[0]

<type 'exceptions.OverflowError'>: math range error

It is clear where the problem is, matplotlib takes log10 of the mean
y-range (in this case infinity) to auto scale the y-axis.

I know I can modify my input values to get around this problem, but it
is so common to want to plot data (some of which may be zero) in say a
decibel scale, that having a workaround for the case of -inf input
would be nice. I tried to look into writing one myself, but got
quickly lost. If someone could point me at the files/functions I
should look at I will have a go.

Hope somebody can help!

Best regards,
John Travers

I think this might trace back to Interval.get_bounds() in src/_transforms.h.
Maybe we could consider an additional Interval method like
Interval.get_finite_bounds(), which could do something like numpy's isfinite
function to filter values that can not be plotted. But I'm not an expert on
mpl's transforms, so perhaps someone more knowledgeable can comment.

Darren

···

On Friday 13 July 2007 09:13:03 am John Travers wrote:

Hi all,

If I try to plot a graph with some y-values as -inf (which is very
common in physical sciences as we often take log10 of amplitude values
which can be zero), then matplotlib raises an exception:

/usr/lib/python2.5/site-packages/matplotlib/ticker.py in
scale_range(vmin, vmax, n, threshold)
    814 offset = 10**ex
    815 else:
--> 816 ex = divmod(math.log10(-meanv), 1)[0]
    817 offset = -10**ex
    818 ex = divmod(math.log10(dv/n), 1)[0]

<type 'exceptions.OverflowError'>: math range error

It is clear where the problem is, matplotlib takes log10 of the mean
y-range (in this case infinity) to auto scale the y-axis.

I know I can modify my input values to get around this problem, but it
is so common to want to plot data (some of which may be zero) in say a
decibel scale, that having a workaround for the case of -inf input
would be nice. I tried to look into writing one myself, but got
quickly lost. If someone could point me at the files/functions I
should look at I will have a go.

I'm happy to do this, if someone can advise how to get a portable
isinf. I tried including math.h after reading

http://www.google.com/url?sa=t&ct=res&cd=1&url=http%3A%2F%2Fwww.opengroup.org%2Fonlinepubs%2F009695399%2Ffunctions%2Fisinf.html&ei=wYqXRr7IAovwiwHolJn2Bw&usg=AFQjCNGAlh-XN0EWgSuTSEsOLPLNCiTxNw&sig2=KAxpuLGHMuqoeGtzTz85YQ

but the symbol isn't found there on my system. I would be happy to
import it from numpy (since we can now rely on it, woohoo) but am
having trouble here too.... I see isfinite defined in
umathmodule.c.src (and also in ufuncobject.h but only for _MSC_VER.
If anyone can advise on how to get isinf or isfinite, pease do.

JDH

···

On 7/13/07, Darren Dale <dd55@...163...> wrote:

I think this might trace back to Interval.get_bounds() in src/_transforms.h.
Maybe we could consider an additional Interval method like
Interval.get_finite_bounds(), which could do something like numpy's isfinite
function to filter values that can not be plotted. But I'm not an expert on
mpl's transforms, so perhaps someone more knowledgeable can comment.

> I think this might trace back to Interval.get_bounds() in
> src/_transforms.h. Maybe we could consider an additional Interval method
> like
> Interval.get_finite_bounds(), which could do something like numpy's
> isfinite function to filter values that can not be plotted. But I'm not
> an expert on mpl's transforms, so perhaps someone more knowledgeable can
> comment.

I'm happy to do this, if someone can advise how to get a portable
isinf.

[...]

I would be happy to
import it from numpy (since we can now rely on it, woohoo) but am
having trouble here too....

If we can figure out how to get it from numpy, we can use numpy's isnan as
well, and drop that bit of extension code from mpl's sources.

···

On Friday 13 July 2007 10:32:15 am John Hunter wrote:

On 7/13/07, Darren Dale <dd55@...163...> wrote:

I see isfinite defined in
umathmodule.c.src (and also in ufuncobject.h but only for _MSC_VER.
If anyone can advise on how to get isinf or isfinite, pease do.

Darren Dale wrote:

If we can figure out how to get it from numpy, we can use numpy's isnan as well, and drop that bit of extension code from mpl's sources.

Done in r3512. Hurray for inclusion instead of code duplication. (I originally copied that stuff from numarray, which inspired numpy's design of that stuff, but since back then would couldn't depend on either...)

···

On Friday 13 July 2007 10:32:15 am John Hunter wrote:

>> I'm happy to do this, if someone can advise how to get a portable
>> isinf.

Also in r3512, I inserted the definition of isfinite, copied from numpy's umathmodule.c.src at the top of _transforms.cpp. If it works for numpy, it should work for us.

I'm slightly worried that this stuff will break on MSVC... Does anyone have the ability to test this svn revision sooner than later?

-Andrew