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 >
------------------------------------------------------------------------------
_______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users