diff --git a/baukit/labwidget.py b/baukit/labwidget.py index 58beba2..908a884 100644 --- a/baukit/labwidget.py +++ b/baukit/labwidget.py @@ -993,13 +993,16 @@ class Image(Widget): """Clears the image.""" self.src = '' - def render(self, obj): + def render(self, obj, **kwargs): buf = io.BytesIO() + if 'format' not in kwargs: + kwargs['format'] = 'png' + image_format = kwargs['format'] if hasattr(obj, 'save'): # Like a PIL.Image.Image - obj.save(buf, format='png') + obj.save(buf, **kwargs) elif hasattr(obj, 'savefig'): # Like a matplotlib.figure.Figure - obj.savefig(buf, format='png', bbox_inches='tight') - self.src= 'data:image/png;base64,' + ( + obj.savefig(buf, **kwargs) + self.src= f'data:image/{image_format};base64,' + ( base64.b64encode(buf.getvalue()).decode('utf-8')) buf.close() diff --git a/baukit/plotwidget.py b/baukit/plotwidget.py index 17d53a9..3dbb354 100644 --- a/baukit/plotwidget.py +++ b/baukit/plotwidget.py @@ -27,6 +27,7 @@ class PlotWidget(Image): def __init__(self, redraw_rule, rc=None, **kwargs): super().__init__() init_args = dict(kwargs) + render_args = dict() self.rc = {} if rc is None else rc all_names = [] @@ -34,7 +35,7 @@ class PlotWidget(Image): if i == 0: assert p.default == inspect._empty, 'First arg of redraw rule should be the figure' else: - if name in kwargs: + if name in init_args: default = init_args.pop(name) else: assert p.default != inspect._empty, 'Arguments must have default values' @@ -42,6 +43,11 @@ class PlotWidget(Image): setattr(self, name, Property(default)) all_names.append(name) + for name in ['format', 'metadata', 'bbox_inches', 'pad_inches', + 'facecolor', 'edgecolor', 'backend']: + if name in init_args: + render_args[name] = init_args.pop(name) + with matplotlib.pyplot.rc_context(rc=self.rc): old_backend = matplotlib.pyplot.get_backend() matplotlib.pyplot.switch_backend('agg') @@ -57,6 +63,6 @@ class PlotWidget(Image): for name in all_names: args.append(getattr(self, name)) redraw_rule(*args) - self.render(self.fig) + self.render(self.fig, **render_args) self.on(' '.join(all_names), invoke_redraw) invoke_redraw()