diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index ebe7f9012d99..dcbff97b2ead 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -38,6 +38,17 @@ Features that depend on the Python Imaging Library, such as JPEG handling, do not work, since the version of PIL for Python 3.x is not sufficiently mature. +Object-oriented interface +------------------------- + +Damon McDougall has reduced some of the boilerplate code needed to interact +with the object-oriented interface. Now a figure canvas is set up by default:: + + >>> from matplotlib.figure import Figure + >>> fig = Figure() + >>> ax = fig.add_subplot(1, 1, 1) + >>> fig.savefig('figure.pdf') + PGF/TikZ backend ---------------- Peter Würtz wrote a backend that allows matplotlib to export figures as diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index e221989a6dbd..9760336b5bf8 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -515,3 +515,5 @@ def print_to_buffer(self): (int(renderer.width), int(renderer.height))) renderer.dpi = original_dpi return result + +FigureCanvas = FigureCanvasAgg diff --git a/lib/matplotlib/backends/backend_cairo.py b/lib/matplotlib/backends/backend_cairo.py index 966e618fa408..00471f0398c1 100644 --- a/lib/matplotlib/backends/backend_cairo.py +++ b/lib/matplotlib/backends/backend_cairo.py @@ -512,3 +512,5 @@ def _save (self, fo, format, **kwargs): ctx.show_page() surface.finish() + +FigureCanvas = FigureCanvasCairo diff --git a/lib/matplotlib/backends/backend_cocoaagg.py b/lib/matplotlib/backends/backend_cocoaagg.py index 5c9c04938874..dd4142404e8c 100644 --- a/lib/matplotlib/backends/backend_cocoaagg.py +++ b/lib/matplotlib/backends/backend_cocoaagg.py @@ -89,7 +89,7 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ - +FigureCanvas = FigureCanvasCocoaAgg NibClassBuilder.extractClasses('Matplotlib.nib', mplBundle) diff --git a/lib/matplotlib/backends/backend_emf.py b/lib/matplotlib/backends/backend_emf.py index 50da4fea706f..7a289b79829b 100644 --- a/lib/matplotlib/backends/backend_emf.py +++ b/lib/matplotlib/backends/backend_emf.py @@ -727,6 +727,8 @@ def print_emf(self, filename, dpi=300, **kwargs): def get_default_filetype(self): return 'emf' +FigureCanvas = FigureCanvasEMF + class FigureManagerEMF(FigureManagerBase): """ Wrap everything up into a window for the pylab interface diff --git a/lib/matplotlib/backends/backend_fltkagg.py b/lib/matplotlib/backends/backend_fltkagg.py index 7a2a7f258f2c..d132e6489c89 100644 --- a/lib/matplotlib/backends/backend_fltkagg.py +++ b/lib/matplotlib/backends/backend_fltkagg.py @@ -231,6 +231,8 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ +FigureCanvas = FigureCanvasFltkAgg + def destroy_figure(ptr, figman): figman.window.hide() Fltk.Fl.wait(0) # This is needed to make the last figure vanish. diff --git a/lib/matplotlib/backends/backend_gdk.py b/lib/matplotlib/backends/backend_gdk.py index c0790c6591bb..556fea2c16a2 100644 --- a/lib/matplotlib/backends/backend_gdk.py +++ b/lib/matplotlib/backends/backend_gdk.py @@ -434,7 +434,7 @@ def new_figure_manager_given_figure(num, figure): return manager -class FigureCanvasGDK (FigureCanvasBase): +class FigureCanvasGDK(FigureCanvasBase): def __init__(self, figure): FigureCanvasBase.__init__(self, figure) @@ -472,3 +472,5 @@ def _print_image(self, filename, format, *args, **kwargs): 0, 0, 0, 0, width, height) pixbuf.save(filename, format) + +FigureCanvas = FigureCanvasGDK diff --git a/lib/matplotlib/backends/backend_gtk.py b/lib/matplotlib/backends/backend_gtk.py index 8336ddaecf8e..3d107352f6f5 100644 --- a/lib/matplotlib/backends/backend_gtk.py +++ b/lib/matplotlib/backends/backend_gtk.py @@ -144,7 +144,7 @@ def _on_timer(self): return False -class FigureCanvasGTK (gtk.DrawingArea, FigureCanvasBase): +class FigureCanvasGTK(gtk.DrawingArea, FigureCanvasBase): keyvald = {65507 : 'control', 65505 : 'shift', 65513 : 'alt', @@ -519,6 +519,8 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ +FigureCanvas = FigureCanvasGTK + class FigureManagerGTK(FigureManagerBase): """ Public attributes diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index f9013257ce30..7e2fc585b1d9 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -98,7 +98,7 @@ def _on_timer(self): self._timer = None return False -class FigureCanvasGTK3 (Gtk.DrawingArea, FigureCanvasBase): +class FigureCanvasGTK3(Gtk.DrawingArea, FigureCanvasBase): keyvald = {65507 : 'control', 65505 : 'shift', 65513 : 'alt', diff --git a/lib/matplotlib/backends/backend_gtk3agg.py b/lib/matplotlib/backends/backend_gtk3agg.py index c05e0266631a..44e4516bd1c6 100644 --- a/lib/matplotlib/backends/backend_gtk3agg.py +++ b/lib/matplotlib/backends/backend_gtk3agg.py @@ -67,6 +67,7 @@ def print_png(self, filename, *args, **kwargs): agg = self.switch_backends(backend_agg.FigureCanvasAgg) return agg.print_png(filename, *args, **kwargs) +FigureCanvas = FigureCanvasGTK3Agg class FigureManagerGTK3Agg(backend_gtk3.FigureManagerGTK3): pass diff --git a/lib/matplotlib/backends/backend_gtk3cairo.py b/lib/matplotlib/backends/backend_gtk3cairo.py index 2b1fefc04d4b..b2fef69e7289 100644 --- a/lib/matplotlib/backends/backend_gtk3cairo.py +++ b/lib/matplotlib/backends/backend_gtk3cairo.py @@ -34,6 +34,7 @@ def on_draw_event(self, widget, ctx): return False # finish event propagation? +FigureCanvas = FigureCanvasGTK3Cairo class FigureManagerGTK3Cairo(backend_gtk3.FigureManagerGTK3): pass diff --git a/lib/matplotlib/backends/backend_gtkagg.py b/lib/matplotlib/backends/backend_gtkagg.py index aa7c42a68027..9a765f903d2e 100644 --- a/lib/matplotlib/backends/backend_gtkagg.py +++ b/lib/matplotlib/backends/backend_gtkagg.py @@ -33,6 +33,7 @@ def _get_toolbar(self, canvas): toolbar = None return toolbar +FigureCanvas = FigureManagerGTKAgg def new_figure_manager(num, *args, **kwargs): """ diff --git a/lib/matplotlib/backends/backend_gtkcairo.py b/lib/matplotlib/backends/backend_gtkcairo.py index 2cd41ba720eb..d57734646bf0 100644 --- a/lib/matplotlib/backends/backend_gtkcairo.py +++ b/lib/matplotlib/backends/backend_gtkcairo.py @@ -55,6 +55,7 @@ def _renderer_init(self): if _debug: print('%s.%s()' % (self.__class__.__name__, _fn_name())) self._renderer = RendererGTKCairo (self.figure.dpi) +FigureCanvas = FigureCanvasGTKCairo class FigureManagerGTKCairo(FigureManagerGTK): def _get_toolbar(self, canvas): diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index a8fb1b758fed..f06dd36ed4a7 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -352,6 +352,7 @@ def new_timer(self, *args, **kwargs): """ return TimerMac(*args, **kwargs) +FigureCanvas = FigureCanvasMac class FigureManagerMac(_macosx.FigureManager, FigureManagerBase): """ diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 06f9b1d30156..3211a2eb80d4 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -2299,6 +2299,8 @@ def print_pdf(self, filename, **kwargs): else: # we opened the file above; now finish it off file.close() +FigureCanvas = FigureCanvasPdf + class FigureManagerPdf(FigureManagerBase): pass diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index efdc7b340edc..8cee93a32236 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -838,6 +838,8 @@ def _render_texts_pgf(self, fh): def get_renderer(self): return RendererPgf(self.figure, None) +FigureCanvas = FigureCanvasPgf + class FigureManagerPgf(FigureManagerBase): def __init__(self, *args): FigureManagerBase.__init__(self, *args) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index d604028c554c..e460fa61f9e3 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -1357,6 +1357,8 @@ def write(self, *kl, **kwargs): shutil.move(tmpfile, outfile) os.chmod(outfile, mode) +FigureCanvas = FigureCanvasPS + def convert_psfrags(tmpfile, psfrags, font_preamble, custom_preamble, paperWidth, paperHeight, orientation): """ diff --git a/lib/matplotlib/backends/backend_qt.py b/lib/matplotlib/backends/backend_qt.py index 0e1836a81acf..094d5d68c684 100644 --- a/lib/matplotlib/backends/backend_qt.py +++ b/lib/matplotlib/backends/backend_qt.py @@ -203,6 +203,8 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ +FigureCanvas = FigureCanvasQT + class FigureManagerQT( FigureManagerBase ): """ Public attributes diff --git a/lib/matplotlib/backends/backend_qt4.py b/lib/matplotlib/backends/backend_qt4.py index f64bfa4245ff..3ba2814424e7 100644 --- a/lib/matplotlib/backends/backend_qt4.py +++ b/lib/matplotlib/backends/backend_qt4.py @@ -377,6 +377,8 @@ def idle_draw(*args): self._idle = True if d: QtCore.QTimer.singleShot(0, idle_draw) +FigureCanvas = FigureCanvasQT + class FigureManagerQT( FigureManagerBase ): """ Public attributes diff --git a/lib/matplotlib/backends/backend_qt4agg.py b/lib/matplotlib/backends/backend_qt4agg.py index 07017818e853..ddba18fcd527 100644 --- a/lib/matplotlib/backends/backend_qt4agg.py +++ b/lib/matplotlib/backends/backend_qt4agg.py @@ -145,3 +145,5 @@ def blit(self, bbox=None): def print_figure(self, *args, **kwargs): FigureCanvasAgg.print_figure(self, *args, **kwargs) self.draw() + +FigureCanvas = FigureCanvasQTAgg diff --git a/lib/matplotlib/backends/backend_qtagg.py b/lib/matplotlib/backends/backend_qtagg.py index 91a9cd47133e..61fc731fd733 100644 --- a/lib/matplotlib/backends/backend_qtagg.py +++ b/lib/matplotlib/backends/backend_qtagg.py @@ -156,3 +156,5 @@ def blit(self, bbox=None): def print_figure(self, *args, **kwargs): FigureCanvasAgg.print_figure(self, *args, **kwargs) self.draw() + +FigureCanvas = FigureCanvasQTAgg diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index aa117ca9bacb..a5c57c30af44 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -1143,6 +1143,8 @@ def _print_svg(self, filename, svgwriter, fh_to_close=None, **kwargs): def get_default_filetype(self): return 'svg' +FigureCanvas = FigureCanvasSVG + class FigureManagerSVG(FigureManagerBase): pass diff --git a/lib/matplotlib/backends/backend_template.py b/lib/matplotlib/backends/backend_template.py index ae7f01088e9c..eaf21c08e78f 100644 --- a/lib/matplotlib/backends/backend_template.py +++ b/lib/matplotlib/backends/backend_template.py @@ -245,6 +245,8 @@ def print_foo(self, filename, *args, **kwargs): def get_default_filetype(self): return 'foo' +FigureCanvas = FigureCanvasTemplate + class FigureManagerTemplate(FigureManagerBase): """ Wrap everything up into a window for the pylab interface diff --git a/lib/matplotlib/backends/backend_tkagg.py b/lib/matplotlib/backends/backend_tkagg.py index 322a2892796c..2135e0183e4f 100644 --- a/lib/matplotlib/backends/backend_tkagg.py +++ b/lib/matplotlib/backends/backend_tkagg.py @@ -505,6 +505,8 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ +FigureCanvas = FigureCanvasTkAgg + class FigureManagerTkAgg(FigureManagerBase): """ Public attributes diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 3c61d1e412bd..d76914aab072 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1400,6 +1400,7 @@ def _onEnter(self, evt): """Mouse has entered the window.""" FigureCanvasBase.enter_notify_event(self, guiEvent = evt) +FigureCanvas = FigureCanvasWx ######################################################################## # diff --git a/lib/matplotlib/backends/backend_wxagg.py b/lib/matplotlib/backends/backend_wxagg.py index 5b301a045f04..c10b0ee5d19a 100644 --- a/lib/matplotlib/backends/backend_wxagg.py +++ b/lib/matplotlib/backends/backend_wxagg.py @@ -105,6 +105,8 @@ def print_figure(self, filename, *args, **kwargs): if self._isDrawn: self.draw() +FigureCanvas = FigureCanvasWxAgg + class NavigationToolbar2WxAgg(NavigationToolbar2Wx): def get_canvas(self, frame, fig): return FigureCanvasWxAgg(frame, -1, fig) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 83667085416b..4dc36a31aac5 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -318,7 +318,7 @@ def __init__(self, self.patch.set_aa(False) self._hold = rcParams['axes.hold'] - self.canvas = None + self.canvas = self._setup_canvas() if subplotpars is None: subplotpars = SubplotParams() @@ -330,6 +330,14 @@ def __init__(self, self.clf() self._cachedRenderer = None + def _setup_canvas(self): + """ + Return the FigureCanvas instance defined by the currently loaded backend. + """ + import matplotlib.backends as mbackends # lazy import + backend_mod = mbackends.pylab_setup()[0] + return backend_mod.FigureCanvas(self) + def _get_axes(self): return self._axstack.as_list()