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
I don't understand your objection. In which cases do the returns depend on the arguments? "title" returns the title text object, regardless of whether there was an argument setting it to a new value. Same for "xlim". I haven't checked the whole list, but I expect this is the general pattern.
As for different behavior depending on arguments, what specifically do you object to, for example? I think we have all that nicely and pythonically implemented via kwargs, so you can use "xlim(xmin=3)", for example. Yes, that is different behavior than "xlim(3, 6)", but in a good way.
Maybe you are referring to the variety of signatures, such as for contour. I don't really like that either; but it is already in the OO layer, not just the pyplot layer. (The python builtin "slice()" has this characteristic, and I don't like it there, either.)
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(...)
This has occurred to me also--I have never particularly liked having such an enormous number of Axes methods.
There is one major difference in using methods instead of plotter functions, though: it allows subclassing. Whether this is ever used in practice, I don't know.
And then almost all of pyplot can be replaced with a wrapper function:
def inner(*args, **kwargs)
ax = plt.gca()
art_list = func(ax, *args, **kwargs)
inner.__name__ = func.__name__
inner.__doc__ = strip_ax_arg(func.__doc__)
for f in funcs_to_wrap:
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.
But it does *not* take care of one of the two *big* problems I am talking about: the lack of automatic interactive plot updating when one wants to explicitly specify axes and figures in the plot call, regardless of whether this is done via plotting functions or methods.
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.
I still don't really understand it, but perhaps it is orthogonal to the issues I am raising here. As far as I can see, your proposals above do not address either of the issues I raised, based on experience both in teaching matplotlib to non-programmers, and in using it day-to-day.
Regarding Matlab: it is justly popular for many reasons. It is relatively easy to learn both by design and because of its consistent high-quality documentation. Matplotlib's success has resulted in large measure from its pyplot layer, which can shield learners and users from mpl's complexity, which allows learners to build on their Matlab knowledge, and which is particularly well suited to quick interactive data exploration. The problem with the Matlab/pyplot approach is that it doesn't scale well, so we see a chorus of advice along the lines of "don't use pyplot except for subplots() and show(); use the nice, explicit OO interface for everything else". But at present, this doesn't work well, because the OO approach is not interactive enough, and using the getters and setters is clumsy when typing at the console--in demonstrating, teaching, learning, and exploring interactively, every keystroke counts!
On 2014/09/28, 6:20 AM, Thomas Caswell wrote:
On Sat, Sep 27, 2014 at 7:40 PM, Eric Firing <efiring@...229...> 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:
if not is_interactive:
if not isinstance(self.canvas, interactive_canvases):
Append this method to suitable Figure methods such as suptitle().
Add a method to Axes:
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.
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
Matplotlib-devel mailing list