diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 3d228fd7a5af..c9212939b1a7 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -34,6 +34,7 @@ from six.moves import xrange import os +import sys import warnings import time import io @@ -56,17 +57,76 @@ from matplotlib.path import Path from matplotlib.cbook import mplDeprecation +try: + from importlib import import_module +except: + # simple python 2.6 implementation (no relative imports) + def import_module(name): + __import__(name) + return sys.modules[name] + try: from PIL import Image _has_pil = True except ImportError: _has_pil = False -_backend_d = {} + +_default_filetypes = { + 'ps': 'Postscript', + 'eps': 'Encapsulated Postscript', + 'pdf': 'Portable Document Format', + 'pgf': 'PGF code for LaTeX', + 'png': 'Portable Network Graphics', + 'raw': 'Raw RGBA bitmap', + 'rgba': 'Raw RGBA bitmap', + 'svg': 'Scalable Vector Graphics', + 'svgz': 'Scalable Vector Graphics' +} + + +_default_backends = { + 'ps': 'matplotlib.backends.backend_ps', + 'eps': 'matplotlib.backends.backend_ps', + 'pdf': 'matplotlib.backends.backend_pdf', + 'pgf': 'matplotlib.backends.backend_pgf', + 'png': 'matplotlib.backends.backend_agg', + 'raw': 'matplotlib.backends.backend_agg', + 'rgba': 'matplotlib.backends.backend_agg', + 'svg': 'matplotlib.backends.backend_svg', + 'svgz': 'matplotlib.backends.backend_svg', +} + + +def register_backend(format, backend, description): + """ + Register a backend for saving to a given file format. + + *format* + File extention + + *backend* + Backend for handling file output (module string or canvas class) + + *description* + Description of the file type + """ + _default_backends[format] = backend + _default_filetypes[format] = description -def register_backend(format, backend_class): - _backend_d[format] = backend_class +def get_registered_canvas_class(format): + """ + Return the registered default canvas for given file format. + Handles deferred import of required backend. + """ + if format not in _default_backends: + return None + backend_class = _default_backends[format] + if cbook.is_string_like(backend_class): + backend_class = import_module(backend_class).FigureCanvas + _default_backends[format] = backend_class + return backend_class class ShowBase(object): @@ -1566,6 +1626,20 @@ class FigureCanvasBase(object): supports_blit = True + filetypes = _default_filetypes + if _has_pil: + # JPEG support + register_backend('jpg', 'matplotlib.backends.backend_agg', + 'Joint Photographic Experts Group') + register_backend('jpeg', 'matplotlib.backends.backend_agg', + 'Joint Photographic Experts Group') + + # TIFF support + register_backend('tif', 'matplotlib.backends.backend_agg', + 'Tagged Image File Format') + register_backend('tiff', 'matplotlib.backends.backend_agg', + 'Tagged Image File Format') + def __init__(self, figure): figure.set_canvas(self) self.figure = figure @@ -1927,119 +2001,6 @@ def get_width_height(self): """ return int(self.figure.bbox.width), int(self.figure.bbox.height) - filetypes = { - 'eps': 'Encapsulated Postscript', - 'pdf': 'Portable Document Format', - 'pgf': 'LaTeX PGF Figure', - 'png': 'Portable Network Graphics', - 'ps': 'Postscript', - 'raw': 'Raw RGBA bitmap', - 'rgba': 'Raw RGBA bitmap', - 'svg': 'Scalable Vector Graphics', - 'svgz': 'Scalable Vector Graphics'} - - # All of these print_* functions do a lazy import because - # a) otherwise we'd have cyclical imports, since all of these - # classes inherit from FigureCanvasBase - # b) so we don't import a bunch of stuff the user may never use - - # TODO: these print_* throw ImportErrror when called from - # compare_images_decorator (decorators.py line 112) - # if the backend has not already been loaded earlier on. Simple trigger: - # >>> import matplotlib.tests.test_spines - # >>> list(matplotlib.tests.test_spines.test_spines_axes_positions())[0][0]() - - def print_eps(self, *args, **kwargs): - from .backends.backend_ps import FigureCanvasPS # lazy import - ps = self.switch_backends(FigureCanvasPS) - return ps.print_eps(*args, **kwargs) - - def print_pdf(self, *args, **kwargs): - from .backends.backend_pdf import FigureCanvasPdf # lazy import - pdf = self.switch_backends(FigureCanvasPdf) - return pdf.print_pdf(*args, **kwargs) - - def print_pgf(self, *args, **kwargs): - from .backends.backend_pgf import FigureCanvasPgf # lazy import - pgf = self.switch_backends(FigureCanvasPgf) - return pgf.print_pgf(*args, **kwargs) - - def print_png(self, *args, **kwargs): - from .backends.backend_agg import FigureCanvasAgg # lazy import - agg = self.switch_backends(FigureCanvasAgg) - return agg.print_png(*args, **kwargs) - - def print_ps(self, *args, **kwargs): - from .backends.backend_ps import FigureCanvasPS # lazy import - ps = self.switch_backends(FigureCanvasPS) - return ps.print_ps(*args, **kwargs) - - def print_raw(self, *args, **kwargs): - from .backends.backend_agg import FigureCanvasAgg # lazy import - agg = self.switch_backends(FigureCanvasAgg) - return agg.print_raw(*args, **kwargs) - print_bmp = print_rgba = print_raw - - def print_svg(self, *args, **kwargs): - from .backends.backend_svg import FigureCanvasSVG # lazy import - svg = self.switch_backends(FigureCanvasSVG) - return svg.print_svg(*args, **kwargs) - - def print_svgz(self, *args, **kwargs): - from .backends.backend_svg import FigureCanvasSVG # lazy import - svg = self.switch_backends(FigureCanvasSVG) - return svg.print_svgz(*args, **kwargs) - - if _has_pil: - filetypes['jpg'] = 'Joint Photographic Experts Group' - filetypes['jpeg'] = filetypes['jpg'] - - def print_jpg(self, filename_or_obj, *args, **kwargs): - """ - Supported kwargs: - - *quality*: The image quality, on a scale from 1 (worst) to - 95 (best). The default is 95, if not given in the - matplotlibrc file in the savefig.jpeg_quality parameter. - Values above 95 should be avoided; 100 completely - disables the JPEG quantization stage. - - *optimize*: If present, indicates that the encoder should - make an extra pass over the image in order to select - optimal encoder settings. - - *progressive*: If present, indicates that this image - should be stored as a progressive JPEG file. - """ - from .backends.backend_agg import FigureCanvasAgg # lazy import - agg = self.switch_backends(FigureCanvasAgg) - buf, size = agg.print_to_buffer() - if kwargs.pop("dryrun", False): - return - image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1) - options = cbook.restrict_dict(kwargs, ['quality', 'optimize', - 'progressive']) - - if 'quality' not in options: - options['quality'] = rcParams['savefig.jpeg_quality'] - - return image.save(filename_or_obj, format='jpeg', **options) - print_jpeg = print_jpg - - filetypes['tif'] = filetypes['tiff'] = 'Tagged Image File Format' - - def print_tif(self, filename_or_obj, *args, **kwargs): - from .backends.backend_agg import FigureCanvasAgg # lazy import - agg = self.switch_backends(FigureCanvasAgg) - buf, size = agg.print_to_buffer() - if kwargs.pop("dryrun", False): - return - image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1) - dpi = (self.figure.dpi, self.figure.dpi) - return image.save(filename_or_obj, format='tiff', - dpi=dpi) - print_tiff = print_tif - @classmethod def get_supported_filetypes(cls): """Return dict of savefig file formats supported by this backend""" @@ -2057,29 +2018,27 @@ def get_supported_filetypes_grouped(cls): groupings[name].sort() return groupings - def _get_print_method(self, format): + def _get_output_canvas(self, format): + """Return a canvas that is suitable for saving figures to a specified + file format. If necessary, this function will switch to a registered + backend that supports the format. + """ method_name = 'print_%s' % format - # check for registered backends - if format in _backend_d: - backend_class = _backend_d[format] - - def _print_method(*args, **kwargs): - backend = self.switch_backends(backend_class) - print_method = getattr(backend, method_name) - return print_method(*args, **kwargs) - - return _print_method + # check if this canvas supports the requested format + if hasattr(self, method_name): + return self - formats = self.get_supported_filetypes() - if (format not in formats or not hasattr(self, method_name)): - formats = sorted(formats) - raise ValueError( - 'Format "%s" is not supported.\n' - 'Supported formats: ' - '%s.' % (format, ', '.join(formats))) + # check if there is a default canvas for the requested format + canvas_class = get_registered_canvas_class(format) + if canvas_class: + return self.switch_backends(canvas_class) - return getattr(self, method_name) + # else report error for unsupported format + formats = sorted(self.get_supported_filetypes()) + raise ValueError('Format "%s" is not supported.\n' + 'Supported formats: ' + '%s.' % (format, ', '.join(formats))) def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', format=None, **kwargs): @@ -2136,7 +2095,9 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', filename = filename.rstrip('.') + '.' + format format = format.lower() - print_method = self._get_print_method(format) + # get canvas object and print method for format + canvas = self._get_output_canvas(format) + print_method = getattr(canvas, 'print_%s' % format) if dpi is None: dpi = rcParams['savefig.dpi'] diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 180755917689..b60227128c17 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -8,7 +8,7 @@ * linewidth * lines, rectangles, ellipses * clipping to a rectangle - * output to RGBA and PNG + * output to RGBA and PNG, optionally JPEG and TIFF * alpha blending * DPI scaling properly - everything scales properly (dashes, linewidths, etc) * draw polygon @@ -30,7 +30,7 @@ from matplotlib import verbose, rcParams from matplotlib.backend_bases import RendererBase,\ FigureManagerBase, FigureCanvasBase -from matplotlib.cbook import is_string_like, maxdict +from matplotlib.cbook import is_string_like, maxdict, restrict_dict from matplotlib.figure import Figure from matplotlib.font_manager import findfont from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT, LOAD_NO_HINTING, \ @@ -42,6 +42,12 @@ from matplotlib.backends._backend_agg import RendererAgg as _RendererAgg from matplotlib import _png +try: + from PIL import Image + _has_pil = True +except ImportError: + _has_pil = False + backend_version = 'v2.2' def get_hinting_flag(): @@ -456,8 +462,6 @@ def draw(self): finally: RendererAgg.lock.release() - - def get_renderer(self, cleared=False): l, b, w, h = self.figure.bbox.bounds key = w, h, self.figure.dpi @@ -533,3 +537,50 @@ def print_to_buffer(self): (int(renderer.width), int(renderer.height))) renderer.dpi = original_dpi return result + + if _has_pil: + + # add JPEG support + def print_jpg(self, filename_or_obj, *args, **kwargs): + """ + Supported kwargs: + + *quality*: The image quality, on a scale from 1 (worst) to + 95 (best). The default is 95, if not given in the + matplotlibrc file in the savefig.jpeg_quality parameter. + Values above 95 should be avoided; 100 completely + disables the JPEG quantization stage. + + *optimize*: If present, indicates that the encoder should + make an extra pass over the image in order to select + optimal encoder settings. + + *progressive*: If present, indicates that this image + should be stored as a progressive JPEG file. + """ + buf, size = self.print_to_buffer() + if kwargs.pop("dryrun", False): + return + image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1) + options = restrict_dict(kwargs, ['quality', 'optimize', + 'progressive']) + + if 'quality' not in options: + options['quality'] = rcParams['savefig.jpeg_quality'] + + return image.save(filename_or_obj, format='jpeg', **options) + print_jpeg = print_jpg + + # add TIFF support + def print_tif(self, filename_or_obj, *args, **kwargs): + buf, size = self.print_to_buffer() + if kwargs.pop("dryrun", False): + return + image = Image.frombuffer('RGBA', size, buf, 'raw', 'RGBA', 0, 1) + dpi = (self.figure.dpi, self.figure.dpi) + return image.save(filename_or_obj, format='tiff', + dpi=dpi) + print_tiff = print_tif + + +FigureCanvas = FigureCanvasAgg diff --git a/lib/matplotlib/backends/backend_cairo.py b/lib/matplotlib/backends/backend_cairo.py index 9494d535cd98..f210f6be6839 100644 --- a/lib/matplotlib/backends/backend_cairo.py +++ b/lib/matplotlib/backends/backend_cairo.py @@ -514,3 +514,6 @@ 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 0b4c38326462..2a9fb6ba72b7 100644 --- a/lib/matplotlib/backends/backend_cocoaagg.py +++ b/lib/matplotlib/backends/backend_cocoaagg.py @@ -249,8 +249,6 @@ def show(self): NSApplication.sharedApplication().run() -FigureManager = FigureManagerCocoaAgg - #### Everything below taken from PyObjC examples #### This is a hack to allow python scripts to access #### the window manager without running pythonw. @@ -302,3 +300,7 @@ def WMEnable(name='Python'): print('SetFrontProcess', (err, psn), file=sys.stderr) return False return True + + +FigureCanvas = FigureCanvasCocoaAgg +FigureManager = FigureManagerCocoaAgg diff --git a/lib/matplotlib/backends/backend_gtk.py b/lib/matplotlib/backends/backend_gtk.py index d71365244d96..c7c805972764 100644 --- a/lib/matplotlib/backends/backend_gtk.py +++ b/lib/matplotlib/backends/backend_gtk.py @@ -1065,4 +1065,5 @@ def error_msg_gtk(msg, parent=None): dialog.destroy() +FigureCanvas = FigureCanvasGTK FigureManager = FigureManagerGTK diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index 740d8bb0e872..e915c29111e6 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -359,7 +359,6 @@ def stop_event_loop(self): FigureCanvasBase.stop_event_loop_default(self) stop_event_loop.__doc__=FigureCanvasBase.stop_event_loop_default.__doc__ -FigureCanvas = FigureCanvasGTK3 class FigureManagerGTK3(FigureManagerBase): """ @@ -870,3 +869,7 @@ def error_msg_gtk(msg, parent=None): message_format = msg) dialog.run() dialog.destroy() + + +FigureCanvas = FigureCanvasGTK3 +FigureManager = FigureManagerGTK3 diff --git a/lib/matplotlib/backends/backend_gtk3agg.py b/lib/matplotlib/backends/backend_gtk3agg.py index 0c10426c14df..2985087f07be 100644 --- a/lib/matplotlib/backends/backend_gtk3agg.py +++ b/lib/matplotlib/backends/backend_gtk3agg.py @@ -107,5 +107,6 @@ def new_figure_manager_given_figure(num, figure): return manager +FigureCanvas = FigureCanvasGTK3Agg FigureManager = FigureManagerGTK3Agg show = backend_gtk3.show diff --git a/lib/matplotlib/backends/backend_gtk3cairo.py b/lib/matplotlib/backends/backend_gtk3cairo.py index 4421cd0e2fd4..c53c20239b79 100644 --- a/lib/matplotlib/backends/backend_gtk3cairo.py +++ b/lib/matplotlib/backends/backend_gtk3cairo.py @@ -62,5 +62,6 @@ def new_figure_manager_given_figure(num, figure): return manager +FigureCanvas = FigureCanvasGTK3Cairo FigureManager = FigureManagerGTK3Cairo show = backend_gtk3.show diff --git a/lib/matplotlib/backends/backend_gtkagg.py b/lib/matplotlib/backends/backend_gtkagg.py index 13c8d89997d2..3e108417dd36 100644 --- a/lib/matplotlib/backends/backend_gtkagg.py +++ b/lib/matplotlib/backends/backend_gtkagg.py @@ -122,3 +122,6 @@ def print_png(self, filename, *args, **kwargs): pixbuf = gtk.gdk.pixbuf_new_from_data( ValueError: data length (3156672) is less then required by the other parameters (3160608) """ + +FigureCanvas = FigureCanvasGTKAgg +FigureManager = FigureManagerGTKAgg diff --git a/lib/matplotlib/backends/backend_gtkcairo.py b/lib/matplotlib/backends/backend_gtkcairo.py index 15f86413a5bd..93bb69857a1f 100644 --- a/lib/matplotlib/backends/backend_gtkcairo.py +++ b/lib/matplotlib/backends/backend_gtkcairo.py @@ -73,3 +73,7 @@ def _get_toolbar(self, canvas): class NavigationToolbar2Cairo(NavigationToolbar2GTK): def _get_canvas(self, fig): return FigureCanvasGTKCairo(fig) + + +FigureCanvas = FigureCanvasGTKCairo +FigureManager = FigureManagerGTKCairo diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index 71965170e2f1..5c88eb0c57ce 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -423,5 +423,5 @@ def dynamic_update(self): # ######################################################################## - +FigureCanvas = FigureCanvasMac FigureManager = FigureManagerMac diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 8e9c29f4df3f..5fa623a5e033 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -2467,4 +2467,6 @@ def print_pdf(self, filename, **kwargs): class FigureManagerPdf(FigureManagerBase): pass + +FigureCanvas = FigureCanvasPdf FigureManager = FigureManagerPdf diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index af9cc3f75d33..b7b5a6a8852d 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -940,10 +940,11 @@ class FigureManagerPgf(FigureManagerBase): def __init__(self, *args): FigureManagerBase.__init__(self, *args) -######################################################################## +FigureCanvas = FigureCanvasPgf FigureManager = FigureManagerPgf + def _cleanup_all(): LatexManager._cleanup_remaining_instances() TmpDirCleaner.cleanup_remaining_tmpdirs() diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 004e85bee279..a4f4ff6df0fb 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -1725,14 +1725,10 @@ def pstoeps(tmpfile, bbox=None, rotated=False): shutil.move(epsfile, tmpfile) - class FigureManagerPS(FigureManagerBase): pass -FigureManager = FigureManagerPS - - # The following Python dictionary psDefs contains the entries for the # PostScript dictionary mpldict. This dictionary implements most of # the matplotlib primitives and some abbreviations. @@ -1771,3 +1767,6 @@ class FigureManagerPS(FigureManagerBase): newpath } bind def""", ] + +FigureCanvas = FigureCanvasPS +FigureManager = FigureManagerPS diff --git a/lib/matplotlib/backends/backend_qt4.py b/lib/matplotlib/backends/backend_qt4.py index 65a06e0da12c..b1d49758b22b 100644 --- a/lib/matplotlib/backends/backend_qt4.py +++ b/lib/matplotlib/backends/backend_qt4.py @@ -881,4 +881,5 @@ def exception_handler(type, value, tb): error_msg_qt(msg) +FigureCanvas = FigureCanvasQT FigureManager = FigureManagerQT diff --git a/lib/matplotlib/backends/backend_qt4agg.py b/lib/matplotlib/backends/backend_qt4agg.py index ad49853759cc..25fc2e7d7b9b 100644 --- a/lib/matplotlib/backends/backend_qt4agg.py +++ b/lib/matplotlib/backends/backend_qt4agg.py @@ -182,3 +182,6 @@ def blit(self, bbox=None): def print_figure(self, *args, **kwargs): FigureCanvasAgg.print_figure(self, *args, **kwargs) self.draw() + +FigureCanvas = FigureCanvasQTAgg +FigureManager = FigureManagerQTAgg diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index f68801cfd229..585f51420e8b 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -1204,7 +1204,6 @@ def get_default_filetype(self): class FigureManagerSVG(FigureManagerBase): pass -FigureManager = FigureManagerSVG def new_figure_manager(num, *args, **kwargs): FigureClass = kwargs.pop('FigureClass', Figure) @@ -1227,3 +1226,7 @@ def new_figure_manager_given_figure(num, figure): "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> """ + + +FigureCanvas = FigureCanvasSVG +FigureManager = FigureManagerSVG diff --git a/lib/matplotlib/backends/backend_template.py b/lib/matplotlib/backends/backend_template.py index c77406bb6038..a26679d0e0ab 100644 --- a/lib/matplotlib/backends/backend_template.py +++ b/lib/matplotlib/backends/backend_template.py @@ -31,11 +31,19 @@ import matplotlib matplotlib.use('module://my_backend') -where my_backend.py is your module name. Thus syntax is also +where my_backend.py is your module name. This syntax is also recognized in the rc file and in the -d argument in pylab, eg:: python simple_plot.py -dmodule://my_backend +If your backend implements support for saving figures (i.e. has a print_xyz() +method) you can register it as the default handler for a given file type + + from matplotlib.backend_bases import register_backend + register_backend('xyz', 'my_backend', 'XYZ File Format') + ... + plt.savefig("figure.xyz") + The files that are most relevant to backend_writers are matplotlib/backends/backend_your_backend.py @@ -262,5 +270,5 @@ class FigureManagerTemplate(FigureManagerBase): # ######################################################################## - +FigureCanvas = FigureCanvasTemplate FigureManager = FigureManagerTemplate diff --git a/lib/matplotlib/backends/backend_tkagg.py b/lib/matplotlib/backends/backend_tkagg.py index 5f60937d3e3b..209a8520d044 100644 --- a/lib/matplotlib/backends/backend_tkagg.py +++ b/lib/matplotlib/backends/backend_tkagg.py @@ -817,9 +817,6 @@ def dynamic_update(self): self.canvas.draw_idle() -FigureManager = FigureManagerTkAgg - - class ToolTip(object): """ Tooltip recipe from @@ -869,3 +866,6 @@ def hidetip(self): self.tipwindow = None if tw: tw.destroy() + +FigureCanvas = FigureCanvasTkAgg +FigureManager = FigureManagerTkAgg diff --git a/lib/matplotlib/backends/backend_webagg.py b/lib/matplotlib/backends/backend_webagg.py index d895b6d2c349..a8a0c81e2f3b 100644 --- a/lib/matplotlib/backends/backend_webagg.py +++ b/lib/matplotlib/backends/backend_webagg.py @@ -392,3 +392,6 @@ def ipython_inline_display(figure): toolitems=core.NavigationToolbar2WebAgg.toolitems, canvas=figure.canvas, port=WebAggApplication.port) + + +FigureCanvas = FigureCanvasWebAgg diff --git a/lib/matplotlib/backends/backend_webagg_core.py b/lib/matplotlib/backends/backend_webagg_core.py index c656c9756daa..c7a50b420a4d 100644 --- a/lib/matplotlib/backends/backend_webagg_core.py +++ b/lib/matplotlib/backends/backend_webagg_core.py @@ -357,3 +357,6 @@ def release_zoom(self, event): super(NavigationToolbar2WebAgg, self).release_zoom(event) self.canvas.send_event( "rubberband", x0=-1, y0=-1, x1=-1, y1=-1) + +FigureCanvas = FigureCanvasWebAggCore +FigureManager = FigureManagerWebAgg diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index f934af9a69b4..d99f04f07ea9 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1875,5 +1875,6 @@ def OnPrintPage(self, page): # ######################################################################## -Toolbar = NavigationToolbar2Wx +FigureCanvas = FigureCanvasWx FigureManager = FigureManagerWx +Toolbar = NavigationToolbar2Wx diff --git a/lib/matplotlib/backends/backend_wxagg.py b/lib/matplotlib/backends/backend_wxagg.py index 298a8f79c3c7..5dd01030560b 100644 --- a/lib/matplotlib/backends/backend_wxagg.py +++ b/lib/matplotlib/backends/backend_wxagg.py @@ -8,7 +8,7 @@ from .backend_agg import FigureCanvasAgg from . import backend_wx # already uses wxversion.ensureMinimal('2.8') -from .backend_wx import FigureManager, FigureManagerWx, FigureCanvasWx, \ +from .backend_wx import FigureManagerWx, FigureCanvasWx, \ FigureFrameWx, DEBUG_MSG, NavigationToolbar2Wx, error_msg_wx, \ draw_if_interactive, show, Toolbar, backend_version import wx @@ -189,3 +189,6 @@ def _WX28_clipped_agg_as_bitmap(agg, bbox): destDC.SelectObject(wx.NullBitmap) return destBmp + +FigureCanvas = FigureCanvasWxAgg +FigureManager = FigureManagerWx