#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: convenience functions
Report Upstream: N/A | Reviewers: Karl-Dieter Crisman
Authors: Punarbasu Purkayastha | Merged in:
Dependencies: #12974 | Stopgaps:
-----------------------------------------+----------------------------------
Old description:
> Attached is a patch which introduces log scale to `Graphics()` class.
>
> Depends on #12974.
>
> Apply [attachment:trac_4529-add_logscale_to_Graphics.2.patch] and a patch
> to be determined.
>
> OR
>
> 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.patch
> ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
> attachment/ticket/12974/trac_12974-refactor.patch
> ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
> attachment/ticket/12974/trac_12974-reorder_some_arguments.patch
> ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
> attachment/ticket/12974/trac_12974-whitespace_cleanup.patch
> ../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
> attachment/ticket/4529/trac_4529-add_logscale_to_Graphics.2.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
New description:
Attached is a patch which introduces log scale to `Graphics()` class.
Depends on #12974.
Apply [attachment:trac_4529-add_logscale_to_Graphics.2.patch] and a patch
to be determined.
OR
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.patch
../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
attachment/ticket/12974/trac_12974-refactor.patch
../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
attachment/ticket/12974/trac_12974-reorder_some_arguments.patch
../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
attachment/ticket/12974/trac_12974-whitespace_cleanup.patch
../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
attachment/ticket/4529/trac_4529-add_logscale_to_Graphics.2.patch
../../sage -b
}}}
Optionally, also apply patch which checks that there are enough ticks when
using log scale, but which makes us lose some functionality.
{{{
../../sage -hg qimport -P http://trac.sagemath.org/sage_trac/raw-
attachment/ticket/4529/trac_4529-check_for_single_tick.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 (by ppurka):
The following are the changes in the latest patches:
1. labeling of minor ticks was flaky; it is fixed now.
2. added several examples to `show()`
3. fixed a problem in axes position of the matplotlib() function when
custom xmax, xmin, etc were passed. Try this plot (without these patches)
and then try with these patches :)
{{{
plot(x).show(xmin=1, xmax=-1)
}}}
4. there is an [attachment:trac_4529-check_for_single_tick.patch optional
patch] where we check for a single tick. this is tricky and I don't know a
good and complete solution. Moreover, it makes most of the functions like
'arc, disk, etc' stop "just working" with log scale. It will be good if
you have a better idea how to check for ticks which don't affect these
functions too. We can't use xmin, xmax, etc to determine ticks because
some of them might well be negative and matplotlib will neglect these
values.
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/4529#comment:44>
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.