#4529: Implement plots with logarithmic scale
----------------------------------+-----------------------------------------
       Reporter:  ronanpaixao     |         Owner:  ronanpaixao
           Type:  enhancement     |        Status:  needs_work 
       Priority:  major           |     Milestone:  sage-5.1   
      Component:  graphics        |    Resolution:             
       Keywords:  plot log scale  |   Work issues:             
Report Upstream:  N/A             |     Reviewers:             
        Authors:                  |     Merged in:             
   Dependencies:  12974           |      Stopgaps:             
----------------------------------+-----------------------------------------
Changes (by ppurka):

  * dependencies:  => 12974


Old description:

> Currently plot() has no option to use logarithmic scales.
>
> One workaround is to use matplotlib directly, with its semilogy(),
> semilogx() and loglog() functions, but that wouldn't produce plots with
> the customisations implemented in sage.
> Another workaround is messing with the plot figure like:
>
> {{{
> #!python
> import pylab
> p=plot(x,marker='.')
> f=pylab.figure()
> f.gca().set_xscale('log')
> p.save(figure=f)
> }}}
>
> But that creates two problems:
>
>  * The first problem is that the adaptive choosing of points just
> considers linear scale, so the points get too much spaced apart in the
> beginning of the plot and too close in the end.
>  * The second problem relates to the axis, which, for the same reason,
> isn't located right.
>
> Also, this requires the user to know how to deal with figures, which is
> not directly exposed by sage.
>
> There are some possibilities to fix that:
>  1. Make plot() detect if the figure changes the scales and modify the
> adaptive algorithm and the axis codes accordingly
>  2. Create a kwarg to tell plot() to implement the scale-change
> internally
>  3. Create other functions to use loglog(), semilogx() and semilogy()
>  4. Many (or all) of the above together, since they aren't mutually
> exclusive
>
> From what I noticed, Mathematica implements the separate functions way,
> but it may be better to fix the issue in plot() itself and if the other
> functions are wanted, just make it so that they call plot() with the
> correct arguments

New description:

 Attached is a patch which introduces log scale to `Graphics()` class.

 Apply the following patches in the specified order. `SAGE_ROOT` is the
 directory where the sage installation is present.
 {{{
 cd SAGE_ROOT/devel/sage
 ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
 
attachment/ticket/12974/trac_12974-fix_graphics_attributes_and_reorder_args.patch
 ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
 attachment/ticket/12974/trac_12974-refactor_and_whitespace_cleanups.patch
 ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
 attachment/ticket/4529/trac_4529-add_logscale_to_Graphics.patch
 ../../sage -b
 }}}

 ----
 '''OLD DISCUSSION BELOW :)'''

 Currently plot() has no option to use logarithmic scales.

 One workaround is to use matplotlib directly, with its semilogy(),
 semilogx() and loglog() functions, but that wouldn't produce plots with
 the customisations implemented in sage.
 Another workaround is messing with the plot figure like:

 {{{
 #!python
 import pylab
 p=plot(x,marker='.')
 f=pylab.figure()
 f.gca().set_xscale('log')
 p.save(figure=f)
 }}}

 But that creates two problems:

  * The first problem is that the adaptive choosing of points just
 considers linear scale, so the points get too much spaced apart in the
 beginning of the plot and too close in the end.
  * The second problem relates to the axis, which, for the same reason,
 isn't located right.

 Also, this requires the user to know how to deal with figures, which is
 not directly exposed by sage.

 There are some possibilities to fix that:
  1. Make plot() detect if the figure changes the scales and modify the
 adaptive algorithm and the axis codes accordingly
  2. Create a kwarg to tell plot() to implement the scale-change internally
  3. Create other functions to use loglog(), semilogx() and semilogy()
  4. Many (or all) of the above together, since they aren't mutually
 exclusive

 From what I noticed, Mathematica implements the separate functions way,
 but it may be better to fix the issue in plot() itself and if the other
 functions are wanted, just make it so that they call plot() with the
 correct arguments

--

Comment:

 I added a patch to `Graphics` class which introduces log plots. Some
 salient points
 1. I had to "disable" some tick formatting for log plots because
 matplotlib wasn't behaving well with the formatting that is done in
 `Graphics().maptplotlib()` (ex. the error in comment:11, out of memory
 error, etc)
 2. The patch in this ticket relies on the patches in #12974 which is
 mostly a cleanup of the `Graphics` class.
 3. In trying to implement my own class, I started to look at each of the
 matplotlib functions more carefully, and found out the reason(s) why
 setting the scale wasn't working (see point 1.). The result is that I
 could implement log scale right inside `Graphics` by carefully weeding out
 the corner cases. I hope I got all the corner cases.

 Todo:
 1. A patch to `plot()` and other functions will take more time to
 implement. :(
 2. Probably need to make sure that user does not specify tick formatters
 and locators which don't behave well with log plots.
 3. Feedback is welcome! I need to know if I missed something.

 Example code:
 {{{
 p = plot(exp, 1, 10)
 p.set_scale('loglog')
 p.show()
 xd=range(-5,5); yd=[10**_ for _ in xd]; p=list_plot(zip(xd,
 yd),plotjoined=True)
 p.set_yscale('log', 2) # Set only y-axis to log and with base of log being
 2.
 p.show()
 }}}

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/4529#comment:21>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to