Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Eric Firing
On 05/19/2010 11:31 PM, Christer Malmberg 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([100, 50, 10, 100, 5, 1, 1, 1])
> subplot(111)
> plot(x, y)
> yscale('symlog')
> xscale=('linear')
> ylim(-1,1000)
> 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...

Yes, it looks like a bug that can be fixed fairly easily.  In the 
meantime, a workaround is to add the kwarg "scaley=False" to your call 
to "plot"; or more generally, do something like

ax = subplot(111)
ax.set_autoscaley_on(False)

before proceeding with any plotting commands.

Eric


>
> /C
>
> Quoting Eric Firing :
>
>> 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
>>> >> > 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([100, 50, 10, 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
>>> 
>>> https://

Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Benjamin Root
Ok, good, I just wanted to do a sanity check.

On Thu, May 20, 2010 at 9:21 AM, Michael Droettboom  wrote:

> 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
>  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([100, 50, 10, 100, 5, 1, 1, 1])
> >>> subplot(111)
> >>> plot(x, y)
> >>> yscale('symlog')
> >>> xscale=('linear')
> >>> ylim(-1,1000)
> >>> 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:
> >>>
> >>>
> >>>
>  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
> >  > >   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. 

Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Michael Droettboom
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  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([100, 50, 10, 100, 5, 1, 1, 1])
>>> subplot(111)
>>> plot(x, y)
>>> yscale('symlog')
>>> xscale=('linear')
>>> ylim(-1,1000)
>>> 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:
>>>
>>>
>>>
 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
>  >   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,

Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Benjamin Root
Do we really want to depend on a floating point equality?

Ben Root

On Thu, May 20, 2010 at 9:02 AM, Michael Droettboom  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([100, 50, 10, 100, 5, 1, 1, 1])
> > subplot(111)
> > plot(x, y)
> > yscale('symlog')
> > xscale=('linear')
> > ylim(-1,1000)
> > 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:
> >
> >
> >> 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
> >>>  >>> >  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 s

Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Michael Droettboom
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([100, 50, 10, 100, 5, 1, 1, 1])
> subplot(111)
> plot(x, y)
> yscale('symlog')
> xscale=('linear')
> ylim(-1,1000)
> 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:
>
>
>> 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
>>> >> >  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 co

Re: [Matplotlib-users] linearized log axis

2010-05-20 Thread Christer
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([100, 50, 10, 100, 5, 1, 1, 1])
subplot(111)
plot(x, y)
yscale('symlog')
xscale=('linear')
ylim(-1,1000)
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 :

> 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
>> > > 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([100, 50, 10, 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
>> 
>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>
>>
>>
>>
>>
--
>>
>>
>>
>>
>> ___
>> Matplotlib-users mailing list

Re: [Matplotlib-users] linearized log axis

2010-05-19 Thread Eric Firing
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
>  > 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([100, 50, 10, 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
> 
> 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


Re: [Matplotlib-users] linearized log axis

2010-05-19 Thread Benjamin Root
Maybe I am misunderstanding your problem, but you can select 'semilog' for
the x/yscale parameter.

Ben Root

On Wed, May 19, 2010 at 7:03 AM, Christer Malmberg <
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([100, 50, 10, 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
> 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] linearized log axis

2010-05-19 Thread Christer Malmberg
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([100, 50, 10, 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
https://lists.sourceforge.net/lists/listinfo/matplotlib-users