 # linearized log axis

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,
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 <efiring@...202...>:

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.0653@…3109… >> <mailto:Christer.Malmberg.0653@…3109…>> 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

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:

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

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 @@

'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

'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

+ 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,
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<efiring@...202...>:

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

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.0653@…3109… >>> <mailto:Christer.Malmberg.0653@…3109…>> 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

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:

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

Do we really want to depend on a floating point equality?

Ben Root

···

On Thu, May 20, 2010 at 9:02 AM, Michael Droettboom <mdroe@…83…86…> 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 @@

``````  '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
``````

``````'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
``````

• 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,

``````  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<efiring@…878…202…>:

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.0653@…3109… > > >>> mailto:Christer.Malmberg.0653@...3109...> 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
``````

`````` 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](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](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

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<mdroe@...86...> 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 @@

'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

'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

+ 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,
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<efiring@...202...>:

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

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.0653@…3109… >>>>> <mailto:Christer.Malmberg.0653@…3109…>> 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

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:

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

Ok, good, I just wanted to do a sanity check.

···

On Thu, May 20, 2010 at 9:21 AM, Michael Droettboom <mdroe@…86…> 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<mdroe@…86…> 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 @@

``````  '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
``````

``````  '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
``````

• 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,

``````   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<efiring@…202…>:

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.0653@…3109… > > >>>>> mailto:Christer.Malmberg.0653@...3109...> 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
``````

``````  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](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](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