I am against pushing the pyplot style title/xlabel/.. function down
into the OO layer, I really do not like the different behaviour and
returns depending on the arguments.   That has always struck me as a
MATLAB-ism that should be dropped, but we are stuck with to maintain
back-compatibility.

I have been thinking about going a very different route and pulling
almost all of the plotting function _off_ of the axes objects and just
having functions with signatures like

def plotter_function(ax, data1, data2, style1, style2,...)
    art = create_artists(...)
    ax.add_artists(art)
    return art_list

And then almost all of pyplot can be replaced with a wrapper function:

def wrap_for_pyplot(func):
    def inner(*args, **kwargs)
        ax = plt.gca()
        art_list = func(ax, *args, **kwargs)
        if plt.is_interactive():
             ax.figure.canvas.draw()

    inner.__name__ = func.__name__
    inner.__doc__ = strip_ax_arg(func.__doc__)
    return inner

for f in funcs_to_wrap:
    pyplot.setattr(f.__name__, wrap_for_pyplot(f))

Which pushes all of the interactive/global state related stuff up to
one place and removes the need for keywords to suppress re-drawing/the
need to manage that.   This will make embedding a lot easier as well.

I have also been thinking quite a bit about the semantic
artist/manager layer of objects which I think would also go a long way
making the library easier to use, but that is a different story.

Tom


On Sat, Sep 27, 2014 at 7:40 PM, Eric Firing <efir...@hawaii.edu> wrote:
> One of the biggest causes of controversy in mpl, and of difficulty in
> teaching and learning mpl, is the divide between pyplot and the rest of
> the library.  There are at least two aspects:
>
> 1) plt.title() versus ax.set_title(), etc; that is, all the clunky
> getters and setters on the OO side.  JDH used to note that they were a
> side-effect of his C++ heritage, and that he probably wouldn't have used
> them if he had had more Python experience when he started mpl.
>
> 2) For interactive use, such as in the ipython console, one really wants
> pyplot's draw_if_interactive() functionality; one doesn't want to have
> to type explicit plt.draw() commands.  Worse, plt.draw() operates on the
> current figure, which might not be the figure that one just updated with
> "ax2.set_title('the other plot')".
>
> I think that both of these speed bumps can be removed fairly easily, in
> an entirely backwards-compatible way.
>
> The first is just a matter of propagating some shorter-form pyplot
> function names back to Axes and Figure.  This idea is mentioned at the
> end of MEP 13, as an alternative to properties.
>
> The second requires accepting some behavior in the Axes and Figure
> classes that is conditional on the backend and the interactive state.  I
> think it would look *roughly* like this:
>
> Add a method to Figure:
>
> def draw_if_interactive():
>      if not is_interactive:
>          return
>      if not isinstance(self.canvas, interactive_canvases):
>          return
>      self.canvas.draw()
>
> Append this method to suitable Figure methods such as suptitle().
>
> Add a method to Axes:
>
> def draw_if_interactive():
>      self.figure.draw_if_interactive()
>
> Append this method to suitable Axes methods--all those that execute
> changes, or at least those with corresponding pyplot functions.
>
> Some additional logic (either a kwarg, or temporary manipulation of the
> "interactive" flag, or of an Axes instance flag) would be needed to
> block the drawing at intermediate stages--e.g., when boxplot is drawing
> all its bits and pieces.
>
> After these changes, the pyplot functions could be simplified; they
> would not need their own draw_if_interactive calls.
>
> Am I missing some major impediment?  If not, I think this set of changes
> would make it much easier to use and teach the OO interface, with pyplot
> still being used where it is most helpful, such as in the subplots() call.
>
> Eric
>
> ------------------------------------------------------------------------------
> Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
> Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
> Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
> Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
> http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
> _______________________________________________
> Matplotlib-devel mailing list
> Matplotlib-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel



-- 
Thomas Caswell
tcasw...@gmail.com

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to