Give control over bbox_inches and rendering format.

This commit is contained in:
David Bau
2022-04-20 09:07:07 -04:00
parent 181c0e43cd
commit c444d3c041
2 changed files with 15 additions and 6 deletions
+7 -4
View File
@@ -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()
+8 -2
View File
@@ -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()