Skip to content

Commit dd9cfa4

Browse files
committed
Merge pull request #1125 from dmcdougall/oo
Reduce object-oriented boilerplate for users
2 parents a7aaa83 + 8738c1c commit dd9cfa4

27 files changed

+64
-5
lines changed

doc/users/whats_new.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ Features that depend on the Python Imaging Library, such as JPEG
3838
handling, do not work, since the version of PIL for Python 3.x is not
3939
sufficiently mature.
4040

41+
Object-oriented interface
42+
-------------------------
43+
44+
Damon McDougall has reduced some of the boilerplate code needed to interact
45+
with the object-oriented interface. Now a figure canvas is set up by default::
46+
47+
>>> from matplotlib.figure import Figure
48+
>>> fig = Figure()
49+
>>> ax = fig.add_subplot(1, 1, 1)
50+
>>> fig.savefig('figure.pdf')
51+
4152
PGF/TikZ backend
4253
----------------
4354
Peter Würtz wrote a backend that allows matplotlib to export figures as

lib/matplotlib/backends/backend_agg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,3 +515,5 @@ def print_to_buffer(self):
515515
(int(renderer.width), int(renderer.height)))
516516
renderer.dpi = original_dpi
517517
return result
518+
519+
FigureCanvas = FigureCanvasAgg

lib/matplotlib/backends/backend_cairo.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,3 +512,5 @@ def _save (self, fo, format, **kwargs):
512512

513513
ctx.show_page()
514514
surface.finish()
515+
516+
FigureCanvas = FigureCanvasCairo

lib/matplotlib/backends/backend_cocoaagg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def stop_event_loop(self):
8989
FigureCanvasBase.stop_event_loop_default(self)
9090
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
9191

92-
92+
FigureCanvas = FigureCanvasCocoaAgg
9393

9494
NibClassBuilder.extractClasses('Matplotlib.nib', mplBundle)
9595

lib/matplotlib/backends/backend_emf.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,8 @@ def print_emf(self, filename, dpi=300, **kwargs):
727727
def get_default_filetype(self):
728728
return 'emf'
729729

730+
FigureCanvas = FigureCanvasEMF
731+
730732
class FigureManagerEMF(FigureManagerBase):
731733
"""
732734
Wrap everything up into a window for the pylab interface

lib/matplotlib/backends/backend_fltkagg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ def stop_event_loop(self):
231231
FigureCanvasBase.stop_event_loop_default(self)
232232
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
233233

234+
FigureCanvas = FigureCanvasFltkAgg
235+
234236
def destroy_figure(ptr, figman):
235237
figman.window.hide()
236238
Fltk.Fl.wait(0) # This is needed to make the last figure vanish.

lib/matplotlib/backends/backend_gdk.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ def new_figure_manager_given_figure(num, figure):
434434
return manager
435435

436436

437-
class FigureCanvasGDK (FigureCanvasBase):
437+
class FigureCanvasGDK(FigureCanvasBase):
438438
def __init__(self, figure):
439439
FigureCanvasBase.__init__(self, figure)
440440

@@ -472,3 +472,5 @@ def _print_image(self, filename, format, *args, **kwargs):
472472
0, 0, 0, 0, width, height)
473473

474474
pixbuf.save(filename, format)
475+
476+
FigureCanvas = FigureCanvasGDK

lib/matplotlib/backends/backend_gtk.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def _on_timer(self):
144144
return False
145145

146146

147-
class FigureCanvasGTK (gtk.DrawingArea, FigureCanvasBase):
147+
class FigureCanvasGTK(gtk.DrawingArea, FigureCanvasBase):
148148
keyvald = {65507 : 'control',
149149
65505 : 'shift',
150150
65513 : 'alt',
@@ -519,6 +519,8 @@ def stop_event_loop(self):
519519
FigureCanvasBase.stop_event_loop_default(self)
520520
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
521521

522+
FigureCanvas = FigureCanvasGTK
523+
522524
class FigureManagerGTK(FigureManagerBase):
523525
"""
524526
Public attributes

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def _on_timer(self):
9898
self._timer = None
9999
return False
100100

101-
class FigureCanvasGTK3 (Gtk.DrawingArea, FigureCanvasBase):
101+
class FigureCanvasGTK3(Gtk.DrawingArea, FigureCanvasBase):
102102
keyvald = {65507 : 'control',
103103
65505 : 'shift',
104104
65513 : 'alt',

lib/matplotlib/backends/backend_gtk3agg.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def print_png(self, filename, *args, **kwargs):
6767
agg = self.switch_backends(backend_agg.FigureCanvasAgg)
6868
return agg.print_png(filename, *args, **kwargs)
6969

70+
FigureCanvas = FigureCanvasGTK3Agg
7071

7172
class FigureManagerGTK3Agg(backend_gtk3.FigureManagerGTK3):
7273
pass

lib/matplotlib/backends/backend_gtk3cairo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def on_draw_event(self, widget, ctx):
3434

3535
return False # finish event propagation?
3636

37+
FigureCanvas = FigureCanvasGTK3Cairo
3738

3839
class FigureManagerGTK3Cairo(backend_gtk3.FigureManagerGTK3):
3940
pass

lib/matplotlib/backends/backend_gtkagg.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def _get_toolbar(self, canvas):
3333
toolbar = None
3434
return toolbar
3535

36+
FigureCanvas = FigureManagerGTKAgg
3637

3738
def new_figure_manager(num, *args, **kwargs):
3839
"""

lib/matplotlib/backends/backend_gtkcairo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def _renderer_init(self):
5555
if _debug: print('%s.%s()' % (self.__class__.__name__, _fn_name()))
5656
self._renderer = RendererGTKCairo (self.figure.dpi)
5757

58+
FigureCanvas = FigureCanvasGTKCairo
5859

5960
class FigureManagerGTKCairo(FigureManagerGTK):
6061
def _get_toolbar(self, canvas):

lib/matplotlib/backends/backend_macosx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ def new_timer(self, *args, **kwargs):
352352
"""
353353
return TimerMac(*args, **kwargs)
354354

355+
FigureCanvas = FigureCanvasMac
355356

356357
class FigureManagerMac(_macosx.FigureManager, FigureManagerBase):
357358
"""

lib/matplotlib/backends/backend_pdf.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,8 @@ def print_pdf(self, filename, **kwargs):
22992299
else: # we opened the file above; now finish it off
23002300
file.close()
23012301

2302+
FigureCanvas = FigureCanvasPdf
2303+
23022304
class FigureManagerPdf(FigureManagerBase):
23032305
pass
23042306

lib/matplotlib/backends/backend_pgf.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,8 @@ def _render_texts_pgf(self, fh):
838838
def get_renderer(self):
839839
return RendererPgf(self.figure, None)
840840

841+
FigureCanvas = FigureCanvasPgf
842+
841843
class FigureManagerPgf(FigureManagerBase):
842844
def __init__(self, *args):
843845
FigureManagerBase.__init__(self, *args)

lib/matplotlib/backends/backend_ps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,8 @@ def write(self, *kl, **kwargs):
13571357
shutil.move(tmpfile, outfile)
13581358
os.chmod(outfile, mode)
13591359

1360+
FigureCanvas = FigureCanvasPS
1361+
13601362
def convert_psfrags(tmpfile, psfrags, font_preamble, custom_preamble,
13611363
paperWidth, paperHeight, orientation):
13621364
"""

lib/matplotlib/backends/backend_qt.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ def stop_event_loop(self):
203203
FigureCanvasBase.stop_event_loop_default(self)
204204
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
205205

206+
FigureCanvas = FigureCanvasQT
207+
206208
class FigureManagerQT( FigureManagerBase ):
207209
"""
208210
Public attributes

lib/matplotlib/backends/backend_qt4.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ def idle_draw(*args):
377377
self._idle = True
378378
if d: QtCore.QTimer.singleShot(0, idle_draw)
379379

380+
FigureCanvas = FigureCanvasQT
381+
380382
class FigureManagerQT( FigureManagerBase ):
381383
"""
382384
Public attributes

lib/matplotlib/backends/backend_qt4agg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,5 @@ def blit(self, bbox=None):
145145
def print_figure(self, *args, **kwargs):
146146
FigureCanvasAgg.print_figure(self, *args, **kwargs)
147147
self.draw()
148+
149+
FigureCanvas = FigureCanvasQTAgg

lib/matplotlib/backends/backend_qtagg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,5 @@ def blit(self, bbox=None):
156156
def print_figure(self, *args, **kwargs):
157157
FigureCanvasAgg.print_figure(self, *args, **kwargs)
158158
self.draw()
159+
160+
FigureCanvas = FigureCanvasQTAgg

lib/matplotlib/backends/backend_svg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,8 @@ def _print_svg(self, filename, svgwriter, fh_to_close=None, **kwargs):
11431143
def get_default_filetype(self):
11441144
return 'svg'
11451145

1146+
FigureCanvas = FigureCanvasSVG
1147+
11461148
class FigureManagerSVG(FigureManagerBase):
11471149
pass
11481150

lib/matplotlib/backends/backend_template.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ def print_foo(self, filename, *args, **kwargs):
245245
def get_default_filetype(self):
246246
return 'foo'
247247

248+
FigureCanvas = FigureCanvasTemplate
249+
248250
class FigureManagerTemplate(FigureManagerBase):
249251
"""
250252
Wrap everything up into a window for the pylab interface

lib/matplotlib/backends/backend_tkagg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,8 @@ def stop_event_loop(self):
505505
FigureCanvasBase.stop_event_loop_default(self)
506506
stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__
507507

508+
FigureCanvas = FigureCanvasTkAgg
509+
508510
class FigureManagerTkAgg(FigureManagerBase):
509511
"""
510512
Public attributes

lib/matplotlib/backends/backend_wx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,7 @@ def _onEnter(self, evt):
14001400
"""Mouse has entered the window."""
14011401
FigureCanvasBase.enter_notify_event(self, guiEvent = evt)
14021402

1403+
FigureCanvas = FigureCanvasWx
14031404

14041405
########################################################################
14051406
#

lib/matplotlib/backends/backend_wxagg.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ def print_figure(self, filename, *args, **kwargs):
105105
if self._isDrawn:
106106
self.draw()
107107

108+
FigureCanvas = FigureCanvasWxAgg
109+
108110
class NavigationToolbar2WxAgg(NavigationToolbar2Wx):
109111
def get_canvas(self, frame, fig):
110112
return FigureCanvasWxAgg(frame, -1, fig)

lib/matplotlib/figure.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def __init__(self,
318318
self.patch.set_aa(False)
319319

320320
self._hold = rcParams['axes.hold']
321-
self.canvas = None
321+
self.canvas = self._setup_canvas()
322322

323323
if subplotpars is None:
324324
subplotpars = SubplotParams()
@@ -330,6 +330,14 @@ def __init__(self,
330330
self.clf()
331331
self._cachedRenderer = None
332332

333+
def _setup_canvas(self):
334+
"""
335+
Return the FigureCanvas instance defined by the currently loaded backend.
336+
"""
337+
import matplotlib.backends as mbackends # lazy import
338+
backend_mod = mbackends.pylab_setup()[0]
339+
return backend_mod.FigureCanvas(self)
340+
333341
def _get_axes(self):
334342
return self._axstack.as_list()
335343

0 commit comments

Comments
 (0)