In this case, yes.  The assumption of these (private) functions is that 
x will be non-negative.  The only case where we need to worry about log 
raising an exception is with exactly 0.

Mike

On 05/20/2010 10:08 AM, Benjamin Root wrote:
> Do we really want to depend on a floating point equality?
>
> Ben Root
>
> On Thu, May 20, 2010 at 9:02 AM, Michael Droettboom<md...@stsci.edu>  wrote:
>
>    
>> Yep.  That's a bug.  Here's a patch to fix it:
>>
>> ndex: lib/matplotlib/ticker.py
>> ===================================================================
>> --- lib/matplotlib/ticker.py    (revision 8323)
>> +++ lib/matplotlib/ticker.py    (working copy)
>> @@ -1178,16 +1178,21 @@
>>
>>   def decade_down(x, base=10):
>>       'floor x to the nearest lower decade'
>> -
>> +    if x == 0.0:
>> +        return -base
>>       lx = math.floor(math.log(x)/math.log(base))
>>       return base**lx
>>
>>   def decade_up(x, base=10):
>>       'ceil x to the nearest higher decade'
>> +    if x == 0.0:
>> +        return base
>>       lx = math.ceil(math.log(x)/math.log(base))
>>       return base**lx
>>
>>   def is_decade(x,base=10):
>> +    if x == 0.0:
>> +        return True
>>        lx = math.log(x)/math.log(base)
>>        return lx==int(lx)
>>
>> Mike
>>
>> On 05/20/2010 09:43 AM, Christer wrote:
>>      
>>> Thank you for the help, I never knew what the symlog flag did actually.
>>>
>>> However, there is still a slight problem:
>>>
>>> =====================================================
>>> x = array([0,1,2,4,6,9,12,24])
>>> y = array([1000000, 500000, 100000, 100, 5, 1, 1, 1])
>>> subplot(111)
>>> plot(x, y)
>>> yscale('symlog')
>>> xscale=('linear')
>>> ylim(-1,10000000)
>>> show()
>>> =====================================================
>>>
>>> The plot looks exactly like I want it, the problem is when I change
>>> the "1"'s to "0"'s in the y-array, then I get a:
>>>
>>> File "C:\Python26\lib\site-packages\matplotlib\ticker.py", line 1029,
>>> in is_decade
>>>        lx = math.log(x)/math.log(base)
>>> ValueError: math domain error
>>>
>>> I suppose that means somewhere a log(0) is attempted. This kind of
>>> defeats the purpose...
>>>
>>> /C
>>>
>>> Quoting Eric Firing<efir...@hawaii.edu>:
>>>
>>>
>>>        
>>>> On 05/19/2010 10:28 AM, Benjamin Root wrote:
>>>>
>>>>          
>>>>> Maybe I am misunderstanding your problem, but you can select
>>>>>
>>>>>            
>>> 'semilog'
>>>
>>>        
>>>>> for the x/yscale parameter.
>>>>>
>>>>>            
>>>> You mean "symlog".
>>>>
>>>> See
>>>>
>>>>
>>>>          
>>>        
>> http://matplotlib.sourceforge.net/examples/pylab_examples/symlog_demo.html
>>      
>>>        
>>>> Although the example doesn't show it, the axis limits don't have to be
>>>> symmetric.  For example, on the top plot, you can use
>>>>
>>>> gca().set_xlim([0, 100])
>>>>
>>>> to show only the right-hand side.
>>>>
>>>> Eric
>>>>
>>>>
>>>>
>>>>          
>>>>> Ben Root
>>>>>
>>>>> On Wed, May 19, 2010 at 7:03 AM, Christer Malmberg
>>>>> <christer.malmberg.0...@student.uu.se
>>>>> <mailto:christer.malmberg.0...@student.uu.se>>   wrote:
>>>>>
>>>>>       Hi,
>>>>>
>>>>>       my problem is that I need a graph with a discontinous y-axis. Let
>>>>>
>>>>>            
>>> me
>>>
>>>        
>>>>>       explain the problem: in my field (microbiology) the data
>>>>>
>>>>>            
>>> generated
>>>
>>>        
>>>>>       from for example growth assays have a huge range (10^0-10^9),
>>>>>
>>>>>            
>>> which
>>>
>>>        
>>>>>       has to be plotted on a semilogy style plot (cell concentration
>>>>>
>>>>>            
>>> vs.
>>>
>>>        
>>>>>       time). The problem is that 0 cells is a useful number to plot
>>>>>       (indicates cell concentration lower than detection limit), but of
>>>>>       course not possible to show in a log diagram. This is easily
>>>>>
>>>>>            
>>> solved on
>>>
>>>        
>>>>>       old-style logarithmic graph paper; since the data will be either
>>>>>
>>>>>            
>>> 0, or
>>>
>>>        
>>>>>        >1 it is customary just to draw a zero x-axis at 10^-1 on the
>>>>>
>>>>>            
>>> paper
>>>
>>>        
>>>>>       and that's that. On the computer, this is extremely hard. Most
>>>>>
>>>>>            
>>> people
>>>
>>>        
>>>>>       I know resort to various tricks in Excel, such as entering a
>>>>>
>>>>>            
>>> small
>>>
>>>        
>>>>>       number (0.001 etc) and starting the y-axis range from 10^1 to
>>>>>
>>>>>            
>>> hide the
>>>
>>>        
>>>>>       problem. This makes excel draw a line, instead of leaving out the
>>>>>
>>>>>            
>>> dot
>>>
>>>        
>>>>>       and line entirely. The part of the curve below the x-axis is then
>>>>>       manually cut off in a suitable image editor. Needless to say,
>>>>>
>>>>>            
>>> this is
>>>
>>>        
>>>>>       extremely kludgy. Even professional graphing packages like
>>>>>
>>>>>            
>>> Graphpad
>>>
>>>        
>>>>>       Prism resort to similar kludges (re-define 0 values to 0.1,
>>>>>
>>>>>            
>>> change the
>>>
>>>        
>>>>>       y-axis tick label to "0" etc.) This problem of course exists in
>>>>>
>>>>>            
>>> other
>>>
>>>        
>>>>>       fields, while investigating a solution I found a guy who worked
>>>>>
>>>>>            
>>> with
>>>
>>>        
>>>>>       aerosol contamination in clean rooms, and he needed to plot
>>>>>
>>>>>            
>>> values
>>>
>>>        
>>>>>       logarithmically, at the same time as showing detector noise
>>>>>
>>>>>            
>>> around
>>>
>>>        
>>>>>       1-10 particles. He solved it by the same trick I would like to do
>>>>>
>>>>>            
>>> in
>>>
>>>        
>>>>>       Matplotlib, namely plotting a standard semilogy plot but with the
>>>>>       10^-1 to 10^0 decade being replaced by a 0-1 linear axis on the
>>>>>
>>>>>            
>>> same
>>>
>>>        
>>>>>       side.
>>>>>
>>>>>       The guy in this post has the same problem and a useful example:
>>>>>       http://ubuntuforums.org/showthread.php?t=394851
>>>>>
>>>>>       His partial solution is quite bad though, and I just got stuck
>>>>>
>>>>>            
>>> while
>>>
>>>        
>>>>>       trying to improve it. I looked around the gallery for useful
>>>>>
>>>>>            
>>> examples,
>>>
>>>        
>>>>>       and the closest I could find is the twinx/twiny function, but I
>>>>>
>>>>>            
>>> didn't
>>>
>>>        
>>>>>       manage a plot that put one data curve across both axes.
>>>>>
>>>>>       This code gives an image that maybe explains what I'm trying to
>>>>>
>>>>>            
>>> do:
>>>
>>>        
>>>>>       =======================================
>>>>>       t = array([0,1,2,4,6,9,12,24])
>>>>>       y = array([1000000, 500000, 100000, 100, 5, 1, 0, 0])
>>>>>       subplot(111, xscale="linear", yscale="log")
>>>>>       errorbar(x, y, yerr=0.4*y)
>>>>>       linbit = axes([0.125, 0.1, 0.775, 0.1],frameon=False)
>>>>>       linbit.xaxis.set_visible(False)
>>>>>       for tl in linbit.get_yticklabels():
>>>>>            tl.set_color('r')
>>>>>       show()
>>>>>       =======================================
>>>>>
>>>>>       (the y=0 points should be plotted and connected to the line in
>>>>>
>>>>>            
>>> the
>>>
>>>        
>>>>>       log part)
>>>>>
>>>>>       Is this possible to do in matplotlib? Could someone give me a
>>>>>
>>>>>            
>>> pointer
>>>
>>>        
>>>>>       on how to go on?
>>>>>
>>>>>       Sorry for the long mail,
>>>>>
>>>>>       /C
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>            
>>>        
>> ------------------------------------------------------------------------------
>>      
>>>        
>>>>>       _______________________________________________
>>>>>       Matplotlib-users mailing list
>>>>>       Matplotlib-users@lists.sourceforge.net
>>>>>       <mailto:Matplotlib-users@lists.sourceforge.net>
>>>>>       https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>            
>>>        
>> ------------------------------------------------------------------------------
>>      
>>>        
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Matplotlib-users mailing list
>>>>> Matplotlib-users@lists.sourceforge.net
>>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>>>
>>>>>            
>>>>
>>>>
>>>>          
>>>        
>> ------------------------------------------------------------------------------
>>      
>>>        
>>>> _______________________________________________
>>>> Matplotlib-users mailing list
>>>> Matplotlib-users@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>>
>>>>
>>>>          
>>>
>>>
>>>        
>> ------------------------------------------------------------------------------
>>      
>>> _______________________________________________
>>> Matplotlib-users mailing list
>>> Matplotlib-users@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>
>>>        
>>
>> --
>> Michael Droettboom
>> Science Software Branch
>> Space Telescope Science Institute
>> Baltimore, Maryland, USA
>>
>>
>>
>> ------------------------------------------------------------------------------
>>
>> _______________________________________________
>> Matplotlib-users mailing list
>> Matplotlib-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>
>>      
>    


-- 
Michael Droettboom
Science Software Branch
Space Telescope Science Institute
Baltimore, Maryland, USA


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

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to