Show More
@@ -25,6 +25,7 b' from io import BytesIO' | |||||
25 |
|
25 | |||
26 | from IPython.core.display import _pngxy |
|
26 | from IPython.core.display import _pngxy | |
27 | from IPython.utils.decorators import flag_calls |
|
27 | from IPython.utils.decorators import flag_calls | |
|
28 | from IPython.utils import py3compat | |||
28 |
|
29 | |||
29 | # If user specifies a GUI, that dictates the backend, otherwise we read the |
|
30 | # If user specifies a GUI, that dictates the backend, otherwise we read the | |
30 | # user's mpl default from the mpl rc structure |
|
31 | # user's mpl default from the mpl rc structure | |
@@ -165,10 +166,15 b' def mpl_runner(safe_execfile):' | |||||
165 | return mpl_execfile |
|
166 | return mpl_execfile | |
166 |
|
167 | |||
167 |
|
168 | |||
168 | def select_figure_format(shell, fmt, quality=90): |
|
169 | def select_figure_format(shell, formats, quality=90): | |
169 |
"""Select figure format for inline backend |
|
170 | """Select figure formats for the inline backend. | |
170 |
|
171 | |||
171 | Using this method ensures only one figure format is active at a time. |
|
172 | Parameters | |
|
173 | ========== | |||
|
174 | shell : InteractiveShell | |||
|
175 | The main IPython instance | |||
|
176 | formats : list | |||
|
177 | One or a set of figure formats to enable: 'png', 'retina', 'jpeg', 'svg', 'pdf'. | |||
172 | """ |
|
178 | """ | |
173 | from matplotlib.figure import Figure |
|
179 | from matplotlib.figure import Figure | |
174 | from IPython.kernel.zmq.pylab import backend_inline |
|
180 | from IPython.kernel.zmq.pylab import backend_inline | |
@@ -176,22 +182,26 b' def select_figure_format(shell, fmt, quality=90):' | |||||
176 | svg_formatter = shell.display_formatter.formatters['image/svg+xml'] |
|
182 | svg_formatter = shell.display_formatter.formatters['image/svg+xml'] | |
177 | png_formatter = shell.display_formatter.formatters['image/png'] |
|
183 | png_formatter = shell.display_formatter.formatters['image/png'] | |
178 | jpg_formatter = shell.display_formatter.formatters['image/jpeg'] |
|
184 | jpg_formatter = shell.display_formatter.formatters['image/jpeg'] | |
|
185 | pdf_formatter = shell.display_formatter.formatters['application/pdf'] | |||
179 |
|
186 | |||
180 | [ f.type_printers.pop(Figure, None) for f in {svg_formatter, png_formatter, jpg_formatter} ] |
|
187 | if isinstance(formats, py3compat.string_types): | |
|
188 | formats = {formats} | |||
181 |
|
189 | |||
182 | if fmt == 'png': |
|
190 | [ f.type_printers.pop(Figure, None) for f in {svg_formatter, png_formatter, jpg_formatter} ] | |
183 | png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png')) |
|
|||
184 | elif fmt in ('png2x', 'retina'): |
|
|||
185 | png_formatter.for_type(Figure, retina_figure) |
|
|||
186 | elif fmt in ('jpg', 'jpeg'): |
|
|||
187 | jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', quality)) |
|
|||
188 | elif fmt == 'svg': |
|
|||
189 | svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg')) |
|
|||
190 | else: |
|
|||
191 | raise ValueError("supported formats are: 'png', 'retina', 'svg', 'jpg', not %r" % fmt) |
|
|||
192 |
|
191 | |||
193 | # set the format to be used in the backend() |
|
192 | for fmt in formats: | |
194 | backend_inline._figure_format = fmt |
|
193 | if fmt == 'png': | |
|
194 | png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png')) | |||
|
195 | elif fmt in ('png2x', 'retina'): | |||
|
196 | png_formatter.for_type(Figure, retina_figure) | |||
|
197 | elif fmt in ('jpg', 'jpeg'): | |||
|
198 | jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', quality)) | |||
|
199 | elif fmt == 'svg': | |||
|
200 | svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg')) | |||
|
201 | elif fmt == 'pdf': | |||
|
202 | pdf_formatter.for_type(Figure, lambda fig: print_figure(fig, 'pdf')) | |||
|
203 | else: | |||
|
204 | raise ValueError("supported formats are: 'png', 'retina', 'svg', 'jpg', 'pdf' not %r" % fmt) | |||
195 |
|
205 | |||
196 | #----------------------------------------------------------------------------- |
|
206 | #----------------------------------------------------------------------------- | |
197 | # Code for initializing matplotlib and importing pylab |
|
207 | # Code for initializing matplotlib and importing pylab | |
@@ -342,5 +352,5 b' def configure_inline_support(shell, backend):' | |||||
342 | del shell._saved_rcParams |
|
352 | del shell._saved_rcParams | |
343 |
|
353 | |||
344 | # Setup the default figure format |
|
354 | # Setup the default figure format | |
345 | select_figure_format(shell, cfg.figure_format, cfg.quality) |
|
355 | select_figure_format(shell, cfg.figure_formats, cfg.quality) | |
346 |
|
356 |
@@ -14,7 +14,9 b' This module does not import anything from matplotlib.' | |||||
14 | #----------------------------------------------------------------------------- |
|
14 | #----------------------------------------------------------------------------- | |
15 |
|
15 | |||
16 | from IPython.config.configurable import SingletonConfigurable |
|
16 | from IPython.config.configurable import SingletonConfigurable | |
17 | from IPython.utils.traitlets import Dict, Instance, CaselessStrEnum, Bool, Int, TraitError |
|
17 | from IPython.utils.traitlets import ( | |
|
18 | Dict, Instance, CaselessStrEnum, Set, Bool, Int, TraitError, Unicode | |||
|
19 | ) | |||
18 | from IPython.utils.warn import warn |
|
20 | from IPython.utils.warn import warn | |
19 |
|
21 | |||
20 | #----------------------------------------------------------------------------- |
|
22 | #----------------------------------------------------------------------------- | |
@@ -63,15 +65,13 b' class InlineBackend(InlineBackendConfig):' | |||||
63 | inline backend.""" |
|
65 | inline backend.""" | |
64 | ) |
|
66 | ) | |
65 |
|
67 | |||
|
68 | figure_formats = Set({'png'}, config=True, | |||
|
69 | help="""A set of figure formats to enable: 'png', | |||
|
70 | 'retina', 'jpeg', 'svg', 'pdf'.""") | |||
66 |
|
71 | |||
67 | figure_format = CaselessStrEnum(['svg', 'png', 'retina', 'jpg'], |
|
72 | def _figure_formats_changed(self, name, old, new): | |
68 | default_value='png', config=True, |
|
|||
69 | help="""The image format for figures with the inline |
|
|||
70 | backend. JPEG requires the PIL/Pillow library.""") |
|
|||
71 |
|
||||
72 | def _figure_format_changed(self, name, old, new): |
|
|||
73 | from IPython.core.pylabtools import select_figure_format |
|
73 | from IPython.core.pylabtools import select_figure_format | |
74 | if new in {"jpg", "jpeg"}: |
|
74 | if 'jpg' in new or 'jpeg' in new: | |
75 | if not pil_available(): |
|
75 | if not pil_available(): | |
76 | raise TraitError("Requires PIL/Pillow for JPG figures") |
|
76 | raise TraitError("Requires PIL/Pillow for JPG figures") | |
77 | if self.shell is None: |
|
77 | if self.shell is None: | |
@@ -79,6 +79,12 b' class InlineBackend(InlineBackendConfig):' | |||||
79 | else: |
|
79 | else: | |
80 | select_figure_format(self.shell, new) |
|
80 | select_figure_format(self.shell, new) | |
81 |
|
81 | |||
|
82 | figure_format = Unicode() | |||
|
83 | ||||
|
84 | def _figure_format_changed(self, name, old, new): | |||
|
85 | if new: | |||
|
86 | self.figure_formats = {new} | |||
|
87 | ||||
82 | quality = Int(default_value=90, config=True, |
|
88 | quality = Int(default_value=90, config=True, | |
83 | help="Quality of compression [10-100], currently for lossy JPEG only.") |
|
89 | help="Quality of compression [10-100], currently for lossy JPEG only.") | |
84 |
|
90 |
General Comments 0
You need to be logged in to leave comments.
Login now