##// END OF EJS Templates
MNT: remove unneeded pylab imports...
Thomas A Caswell -
Show More
@@ -1,397 +1,398 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Pylab (matplotlib) support utilities."""
2 """Pylab (matplotlib) support utilities."""
3 from __future__ import print_function
3 from __future__ import print_function
4
4
5 # Copyright (c) IPython Development Team.
5 # Copyright (c) IPython Development Team.
6 # Distributed under the terms of the Modified BSD License.
6 # Distributed under the terms of the Modified BSD License.
7
7
8 from io import BytesIO
8 from io import BytesIO
9
9
10 from IPython.core.display import _pngxy
10 from IPython.core.display import _pngxy
11 from IPython.utils.decorators import flag_calls
11 from IPython.utils.decorators import flag_calls
12 from IPython.utils import py3compat
12 from IPython.utils import py3compat
13
13
14 # If user specifies a GUI, that dictates the backend, otherwise we read the
14 # If user specifies a GUI, that dictates the backend, otherwise we read the
15 # user's mpl default from the mpl rc structure
15 # user's mpl default from the mpl rc structure
16 backends = {'tk': 'TkAgg',
16 backends = {'tk': 'TkAgg',
17 'gtk': 'GTKAgg',
17 'gtk': 'GTKAgg',
18 'gtk3': 'GTK3Agg',
18 'gtk3': 'GTK3Agg',
19 'wx': 'WXAgg',
19 'wx': 'WXAgg',
20 'qt': 'Qt4Agg', # qt3 not supported
20 'qt': 'Qt4Agg', # qt3 not supported
21 'qt4': 'Qt4Agg',
21 'qt4': 'Qt4Agg',
22 'qt5': 'Qt5Agg',
22 'qt5': 'Qt5Agg',
23 'osx': 'MacOSX',
23 'osx': 'MacOSX',
24 'nbagg': 'nbAgg',
24 'nbagg': 'nbAgg',
25 'notebook': 'nbAgg',
25 'notebook': 'nbAgg',
26 'inline' : 'module://ipykernel.pylab.backend_inline'}
26 'inline' : 'module://ipykernel.pylab.backend_inline'}
27
27
28 # We also need a reverse backends2guis mapping that will properly choose which
28 # We also need a reverse backends2guis mapping that will properly choose which
29 # GUI support to activate based on the desired matplotlib backend. For the
29 # GUI support to activate based on the desired matplotlib backend. For the
30 # most part it's just a reverse of the above dict, but we also need to add a
30 # most part it's just a reverse of the above dict, but we also need to add a
31 # few others that map to the same GUI manually:
31 # few others that map to the same GUI manually:
32 backend2gui = dict(zip(backends.values(), backends.keys()))
32 backend2gui = dict(zip(backends.values(), backends.keys()))
33 # Our tests expect backend2gui to just return 'qt'
33 # Our tests expect backend2gui to just return 'qt'
34 backend2gui['Qt4Agg'] = 'qt'
34 backend2gui['Qt4Agg'] = 'qt'
35 # In the reverse mapping, there are a few extra valid matplotlib backends that
35 # In the reverse mapping, there are a few extra valid matplotlib backends that
36 # map to the same GUI support
36 # map to the same GUI support
37 backend2gui['GTK'] = backend2gui['GTKCairo'] = 'gtk'
37 backend2gui['GTK'] = backend2gui['GTKCairo'] = 'gtk'
38 backend2gui['GTK3Cairo'] = 'gtk3'
38 backend2gui['GTK3Cairo'] = 'gtk3'
39 backend2gui['WX'] = 'wx'
39 backend2gui['WX'] = 'wx'
40 backend2gui['CocoaAgg'] = 'osx'
40 backend2gui['CocoaAgg'] = 'osx'
41
41
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43 # Matplotlib utilities
43 # Matplotlib utilities
44 #-----------------------------------------------------------------------------
44 #-----------------------------------------------------------------------------
45
45
46
46
47 def getfigs(*fig_nums):
47 def getfigs(*fig_nums):
48 """Get a list of matplotlib figures by figure numbers.
48 """Get a list of matplotlib figures by figure numbers.
49
49
50 If no arguments are given, all available figures are returned. If the
50 If no arguments are given, all available figures are returned. If the
51 argument list contains references to invalid figures, a warning is printed
51 argument list contains references to invalid figures, a warning is printed
52 but the function continues pasting further figures.
52 but the function continues pasting further figures.
53
53
54 Parameters
54 Parameters
55 ----------
55 ----------
56 figs : tuple
56 figs : tuple
57 A tuple of ints giving the figure numbers of the figures to return.
57 A tuple of ints giving the figure numbers of the figures to return.
58 """
58 """
59 from matplotlib._pylab_helpers import Gcf
59 from matplotlib._pylab_helpers import Gcf
60 if not fig_nums:
60 if not fig_nums:
61 fig_managers = Gcf.get_all_fig_managers()
61 fig_managers = Gcf.get_all_fig_managers()
62 return [fm.canvas.figure for fm in fig_managers]
62 return [fm.canvas.figure for fm in fig_managers]
63 else:
63 else:
64 figs = []
64 figs = []
65 for num in fig_nums:
65 for num in fig_nums:
66 f = Gcf.figs.get(num)
66 f = Gcf.figs.get(num)
67 if f is None:
67 if f is None:
68 print('Warning: figure %s not available.' % num)
68 print('Warning: figure %s not available.' % num)
69 else:
69 else:
70 figs.append(f.canvas.figure)
70 figs.append(f.canvas.figure)
71 return figs
71 return figs
72
72
73
73
74 def figsize(sizex, sizey):
74 def figsize(sizex, sizey):
75 """Set the default figure size to be [sizex, sizey].
75 """Set the default figure size to be [sizex, sizey].
76
76
77 This is just an easy to remember, convenience wrapper that sets::
77 This is just an easy to remember, convenience wrapper that sets::
78
78
79 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
79 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
80 """
80 """
81 import matplotlib
81 import matplotlib
82 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
82 matplotlib.rcParams['figure.figsize'] = [sizex, sizey]
83
83
84
84
85 def print_figure(fig, fmt='png', bbox_inches='tight', **kwargs):
85 def print_figure(fig, fmt='png', bbox_inches='tight', **kwargs):
86 """Print a figure to an image, and return the resulting file data
86 """Print a figure to an image, and return the resulting file data
87
87
88 Returned data will be bytes unless ``fmt='svg'``,
88 Returned data will be bytes unless ``fmt='svg'``,
89 in which case it will be unicode.
89 in which case it will be unicode.
90
90
91 Any keyword args are passed to fig.canvas.print_figure,
91 Any keyword args are passed to fig.canvas.print_figure,
92 such as ``quality`` or ``bbox_inches``.
92 such as ``quality`` or ``bbox_inches``.
93 """
93 """
94 from matplotlib import rcParams
94 from matplotlib import rcParams
95 # When there's an empty figure, we shouldn't return anything, otherwise we
95 # When there's an empty figure, we shouldn't return anything, otherwise we
96 # get big blank areas in the qt console.
96 # get big blank areas in the qt console.
97 if not fig.axes and not fig.lines:
97 if not fig.axes and not fig.lines:
98 return
98 return
99
99
100 dpi = rcParams['savefig.dpi']
100 dpi = rcParams['savefig.dpi']
101 if dpi == 'figure':
101 if dpi == 'figure':
102 dpi = fig.dpi
102 dpi = fig.dpi
103 if fmt == 'retina':
103 if fmt == 'retina':
104 dpi = dpi * 2
104 dpi = dpi * 2
105 fmt = 'png'
105 fmt = 'png'
106
106
107 # build keyword args
107 # build keyword args
108 kw = dict(
108 kw = dict(
109 format=fmt,
109 format=fmt,
110 facecolor=fig.get_facecolor(),
110 facecolor=fig.get_facecolor(),
111 edgecolor=fig.get_edgecolor(),
111 edgecolor=fig.get_edgecolor(),
112 dpi=dpi,
112 dpi=dpi,
113 bbox_inches=bbox_inches,
113 bbox_inches=bbox_inches,
114 )
114 )
115 # **kwargs get higher priority
115 # **kwargs get higher priority
116 kw.update(kwargs)
116 kw.update(kwargs)
117
117
118 bytes_io = BytesIO()
118 bytes_io = BytesIO()
119 fig.canvas.print_figure(bytes_io, **kw)
119 fig.canvas.print_figure(bytes_io, **kw)
120 data = bytes_io.getvalue()
120 data = bytes_io.getvalue()
121 if fmt == 'svg':
121 if fmt == 'svg':
122 data = data.decode('utf-8')
122 data = data.decode('utf-8')
123 return data
123 return data
124
124
125 def retina_figure(fig, **kwargs):
125 def retina_figure(fig, **kwargs):
126 """format a figure as a pixel-doubled (retina) PNG"""
126 """format a figure as a pixel-doubled (retina) PNG"""
127 pngdata = print_figure(fig, fmt='retina', **kwargs)
127 pngdata = print_figure(fig, fmt='retina', **kwargs)
128 # Make sure that retina_figure acts just like print_figure and returns
128 # Make sure that retina_figure acts just like print_figure and returns
129 # None when the figure is empty.
129 # None when the figure is empty.
130 if pngdata is None:
130 if pngdata is None:
131 return
131 return
132 w, h = _pngxy(pngdata)
132 w, h = _pngxy(pngdata)
133 metadata = dict(width=w//2, height=h//2)
133 metadata = dict(width=w//2, height=h//2)
134 return pngdata, metadata
134 return pngdata, metadata
135
135
136 # We need a little factory function here to create the closure where
136 # We need a little factory function here to create the closure where
137 # safe_execfile can live.
137 # safe_execfile can live.
138 def mpl_runner(safe_execfile):
138 def mpl_runner(safe_execfile):
139 """Factory to return a matplotlib-enabled runner for %run.
139 """Factory to return a matplotlib-enabled runner for %run.
140
140
141 Parameters
141 Parameters
142 ----------
142 ----------
143 safe_execfile : function
143 safe_execfile : function
144 This must be a function with the same interface as the
144 This must be a function with the same interface as the
145 :meth:`safe_execfile` method of IPython.
145 :meth:`safe_execfile` method of IPython.
146
146
147 Returns
147 Returns
148 -------
148 -------
149 A function suitable for use as the ``runner`` argument of the %run magic
149 A function suitable for use as the ``runner`` argument of the %run magic
150 function.
150 function.
151 """
151 """
152
152
153 def mpl_execfile(fname,*where,**kw):
153 def mpl_execfile(fname,*where,**kw):
154 """matplotlib-aware wrapper around safe_execfile.
154 """matplotlib-aware wrapper around safe_execfile.
155
155
156 Its interface is identical to that of the :func:`execfile` builtin.
156 Its interface is identical to that of the :func:`execfile` builtin.
157
157
158 This is ultimately a call to execfile(), but wrapped in safeties to
158 This is ultimately a call to execfile(), but wrapped in safeties to
159 properly handle interactive rendering."""
159 properly handle interactive rendering."""
160
160
161 import matplotlib
161 import matplotlib
162 import matplotlib.pylab as pylab
162 import matplotlib.pyplot as plt
163
163
164 #print '*** Matplotlib runner ***' # dbg
164 #print '*** Matplotlib runner ***' # dbg
165 # turn off rendering until end of script
165 # turn off rendering until end of script
166 is_interactive = matplotlib.rcParams['interactive']
166 is_interactive = matplotlib.rcParams['interactive']
167 matplotlib.interactive(False)
167 matplotlib.interactive(False)
168 safe_execfile(fname,*where,**kw)
168 safe_execfile(fname,*where,**kw)
169 matplotlib.interactive(is_interactive)
169 matplotlib.interactive(is_interactive)
170 # make rendering call now, if the user tried to do it
170 # make rendering call now, if the user tried to do it
171 if pylab.draw_if_interactive.called:
171 if plt.draw_if_interactive.called:
172 pylab.draw()
172 plt.draw()
173 pylab.draw_if_interactive.called = False
173 plt.draw_if_interactive.called = False
174
174
175
175 return mpl_execfile
176 return mpl_execfile
176
177
177
178
178 def _reshow_nbagg_figure(fig):
179 def _reshow_nbagg_figure(fig):
179 """reshow an nbagg figure"""
180 """reshow an nbagg figure"""
180 try:
181 try:
181 reshow = fig.canvas.manager.reshow
182 reshow = fig.canvas.manager.reshow
182 except AttributeError:
183 except AttributeError:
183 raise NotImplementedError()
184 raise NotImplementedError()
184 else:
185 else:
185 reshow()
186 reshow()
186
187
187
188
188 def select_figure_formats(shell, formats, **kwargs):
189 def select_figure_formats(shell, formats, **kwargs):
189 """Select figure formats for the inline backend.
190 """Select figure formats for the inline backend.
190
191
191 Parameters
192 Parameters
192 ==========
193 ==========
193 shell : InteractiveShell
194 shell : InteractiveShell
194 The main IPython instance.
195 The main IPython instance.
195 formats : str or set
196 formats : str or set
196 One or a set of figure formats to enable: 'png', 'retina', 'jpeg', 'svg', 'pdf'.
197 One or a set of figure formats to enable: 'png', 'retina', 'jpeg', 'svg', 'pdf'.
197 **kwargs : any
198 **kwargs : any
198 Extra keyword arguments to be passed to fig.canvas.print_figure.
199 Extra keyword arguments to be passed to fig.canvas.print_figure.
199 """
200 """
200 import matplotlib
201 import matplotlib
201 from matplotlib.figure import Figure
202 from matplotlib.figure import Figure
202 from ipykernel.pylab import backend_inline
203 from ipykernel.pylab import backend_inline
203
204
204 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
205 svg_formatter = shell.display_formatter.formatters['image/svg+xml']
205 png_formatter = shell.display_formatter.formatters['image/png']
206 png_formatter = shell.display_formatter.formatters['image/png']
206 jpg_formatter = shell.display_formatter.formatters['image/jpeg']
207 jpg_formatter = shell.display_formatter.formatters['image/jpeg']
207 pdf_formatter = shell.display_formatter.formatters['application/pdf']
208 pdf_formatter = shell.display_formatter.formatters['application/pdf']
208
209
209 if isinstance(formats, py3compat.string_types):
210 if isinstance(formats, py3compat.string_types):
210 formats = {formats}
211 formats = {formats}
211 # cast in case of list / tuple
212 # cast in case of list / tuple
212 formats = set(formats)
213 formats = set(formats)
213
214
214 [ f.pop(Figure, None) for f in shell.display_formatter.formatters.values() ]
215 [ f.pop(Figure, None) for f in shell.display_formatter.formatters.values() ]
215
216
216 if matplotlib.get_backend().lower() == 'nbagg':
217 if matplotlib.get_backend().lower() == 'nbagg':
217 formatter = shell.display_formatter.ipython_display_formatter
218 formatter = shell.display_formatter.ipython_display_formatter
218 formatter.for_type(Figure, _reshow_nbagg_figure)
219 formatter.for_type(Figure, _reshow_nbagg_figure)
219
220
220 supported = {'png', 'png2x', 'retina', 'jpg', 'jpeg', 'svg', 'pdf'}
221 supported = {'png', 'png2x', 'retina', 'jpg', 'jpeg', 'svg', 'pdf'}
221 bad = formats.difference(supported)
222 bad = formats.difference(supported)
222 if bad:
223 if bad:
223 bs = "%s" % ','.join([repr(f) for f in bad])
224 bs = "%s" % ','.join([repr(f) for f in bad])
224 gs = "%s" % ','.join([repr(f) for f in supported])
225 gs = "%s" % ','.join([repr(f) for f in supported])
225 raise ValueError("supported formats are: %s not %s" % (gs, bs))
226 raise ValueError("supported formats are: %s not %s" % (gs, bs))
226
227
227 if 'png' in formats:
228 if 'png' in formats:
228 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
229 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
229 if 'retina' in formats or 'png2x' in formats:
230 if 'retina' in formats or 'png2x' in formats:
230 png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))
231 png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))
231 if 'jpg' in formats or 'jpeg' in formats:
232 if 'jpg' in formats or 'jpeg' in formats:
232 jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', **kwargs))
233 jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', **kwargs))
233 if 'svg' in formats:
234 if 'svg' in formats:
234 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg', **kwargs))
235 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg', **kwargs))
235 if 'pdf' in formats:
236 if 'pdf' in formats:
236 pdf_formatter.for_type(Figure, lambda fig: print_figure(fig, 'pdf', **kwargs))
237 pdf_formatter.for_type(Figure, lambda fig: print_figure(fig, 'pdf', **kwargs))
237
238
238 #-----------------------------------------------------------------------------
239 #-----------------------------------------------------------------------------
239 # Code for initializing matplotlib and importing pylab
240 # Code for initializing matplotlib and importing pylab
240 #-----------------------------------------------------------------------------
241 #-----------------------------------------------------------------------------
241
242
242
243
243 def find_gui_and_backend(gui=None, gui_select=None):
244 def find_gui_and_backend(gui=None, gui_select=None):
244 """Given a gui string return the gui and mpl backend.
245 """Given a gui string return the gui and mpl backend.
245
246
246 Parameters
247 Parameters
247 ----------
248 ----------
248 gui : str
249 gui : str
249 Can be one of ('tk','gtk','wx','qt','qt4','inline').
250 Can be one of ('tk','gtk','wx','qt','qt4','inline').
250 gui_select : str
251 gui_select : str
251 Can be one of ('tk','gtk','wx','qt','qt4','inline').
252 Can be one of ('tk','gtk','wx','qt','qt4','inline').
252 This is any gui already selected by the shell.
253 This is any gui already selected by the shell.
253
254
254 Returns
255 Returns
255 -------
256 -------
256 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
257 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
257 'WXAgg','Qt4Agg','module://ipykernel.pylab.backend_inline').
258 'WXAgg','Qt4Agg','module://ipykernel.pylab.backend_inline').
258 """
259 """
259
260
260 import matplotlib
261 import matplotlib
261
262
262 if gui and gui != 'auto':
263 if gui and gui != 'auto':
263 # select backend based on requested gui
264 # select backend based on requested gui
264 backend = backends[gui]
265 backend = backends[gui]
265 else:
266 else:
266 # We need to read the backend from the original data structure, *not*
267 # We need to read the backend from the original data structure, *not*
267 # from mpl.rcParams, since a prior invocation of %matplotlib may have
268 # from mpl.rcParams, since a prior invocation of %matplotlib may have
268 # overwritten that.
269 # overwritten that.
269 # WARNING: this assumes matplotlib 1.1 or newer!!
270 # WARNING: this assumes matplotlib 1.1 or newer!!
270 backend = matplotlib.rcParamsOrig['backend']
271 backend = matplotlib.rcParamsOrig['backend']
271 # In this case, we need to find what the appropriate gui selection call
272 # In this case, we need to find what the appropriate gui selection call
272 # should be for IPython, so we can activate inputhook accordingly
273 # should be for IPython, so we can activate inputhook accordingly
273 gui = backend2gui.get(backend, None)
274 gui = backend2gui.get(backend, None)
274
275
275 # If we have already had a gui active, we need it and inline are the
276 # If we have already had a gui active, we need it and inline are the
276 # ones allowed.
277 # ones allowed.
277 if gui_select and gui != gui_select:
278 if gui_select and gui != gui_select:
278 gui = gui_select
279 gui = gui_select
279 backend = backends[gui]
280 backend = backends[gui]
280
281
281 return gui, backend
282 return gui, backend
282
283
283
284
284 def activate_matplotlib(backend):
285 def activate_matplotlib(backend):
285 """Activate the given backend and set interactive to True."""
286 """Activate the given backend and set interactive to True."""
286
287
287 import matplotlib
288 import matplotlib
288 matplotlib.interactive(True)
289 matplotlib.interactive(True)
289
290
290 # Matplotlib had a bug where even switch_backend could not force
291 # Matplotlib had a bug where even switch_backend could not force
291 # the rcParam to update. This needs to be set *before* the module
292 # the rcParam to update. This needs to be set *before* the module
292 # magic of switch_backend().
293 # magic of switch_backend().
293 matplotlib.rcParams['backend'] = backend
294 matplotlib.rcParams['backend'] = backend
294
295
295 import matplotlib.pyplot
296 import matplotlib.pyplot
296 matplotlib.pyplot.switch_backend(backend)
297 matplotlib.pyplot.switch_backend(backend)
297
298
298 # This must be imported last in the matplotlib series, after
299 # This must be imported last in the matplotlib series, after
299 # backend/interactivity choices have been made
300 # backend/interactivity choices have been made
300 import matplotlib.pylab as pylab
301 import matplotlib.pyplot as plt
301
302
302 pylab.show._needmain = False
303 plt.show._needmain = False
303 # We need to detect at runtime whether show() is called by the user.
304 # We need to detect at runtime whether show() is called by the user.
304 # For this, we wrap it into a decorator which adds a 'called' flag.
305 # For this, we wrap it into a decorator which adds a 'called' flag.
305 pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
306 plt.draw_if_interactive = flag_calls(plt.draw_if_interactive)
306
307
307
308
308 def import_pylab(user_ns, import_all=True):
309 def import_pylab(user_ns, import_all=True):
309 """Populate the namespace with pylab-related values.
310 """Populate the namespace with pylab-related values.
310
311
311 Imports matplotlib, pylab, numpy, and everything from pylab and numpy.
312 Imports matplotlib, pylab, numpy, and everything from pylab and numpy.
312
313
313 Also imports a few names from IPython (figsize, display, getfigs)
314 Also imports a few names from IPython (figsize, display, getfigs)
314
315
315 """
316 """
316
317
317 # Import numpy as np/pyplot as plt are conventions we're trying to
318 # Import numpy as np/pyplot as plt are conventions we're trying to
318 # somewhat standardize on. Making them available to users by default
319 # somewhat standardize on. Making them available to users by default
319 # will greatly help this.
320 # will greatly help this.
320 s = ("import numpy\n"
321 s = ("import numpy\n"
321 "import matplotlib\n"
322 "import matplotlib\n"
322 "from matplotlib import pylab, mlab, pyplot\n"
323 "from matplotlib import pylab, mlab, pyplot\n"
323 "np = numpy\n"
324 "np = numpy\n"
324 "plt = pyplot\n"
325 "plt = pyplot\n"
325 )
326 )
326 exec(s, user_ns)
327 exec(s, user_ns)
327
328
328 if import_all:
329 if import_all:
329 s = ("from matplotlib.pylab import *\n"
330 s = ("from matplotlib.pylab import *\n"
330 "from numpy import *\n")
331 "from numpy import *\n")
331 exec(s, user_ns)
332 exec(s, user_ns)
332
333
333 # IPython symbols to add
334 # IPython symbols to add
334 user_ns['figsize'] = figsize
335 user_ns['figsize'] = figsize
335 from IPython.core.display import display
336 from IPython.core.display import display
336 # Add display and getfigs to the user's namespace
337 # Add display and getfigs to the user's namespace
337 user_ns['display'] = display
338 user_ns['display'] = display
338 user_ns['getfigs'] = getfigs
339 user_ns['getfigs'] = getfigs
339
340
340
341
341 def configure_inline_support(shell, backend):
342 def configure_inline_support(shell, backend):
342 """Configure an IPython shell object for matplotlib use.
343 """Configure an IPython shell object for matplotlib use.
343
344
344 Parameters
345 Parameters
345 ----------
346 ----------
346 shell : InteractiveShell instance
347 shell : InteractiveShell instance
347
348
348 backend : matplotlib backend
349 backend : matplotlib backend
349 """
350 """
350 # If using our svg payload backend, register the post-execution
351 # If using our svg payload backend, register the post-execution
351 # function that will pick up the results for display. This can only be
352 # function that will pick up the results for display. This can only be
352 # done with access to the real shell object.
353 # done with access to the real shell object.
353
354
354 # Note: if we can't load the inline backend, then there's no point
355 # Note: if we can't load the inline backend, then there's no point
355 # continuing (such as in terminal-only shells in environments without
356 # continuing (such as in terminal-only shells in environments without
356 # zeromq available).
357 # zeromq available).
357 try:
358 try:
358 from ipykernel.pylab.backend_inline import InlineBackend
359 from ipykernel.pylab.backend_inline import InlineBackend
359 except ImportError:
360 except ImportError:
360 return
361 return
361 from matplotlib import pyplot
362 from matplotlib import pyplot
362
363
363 cfg = InlineBackend.instance(parent=shell)
364 cfg = InlineBackend.instance(parent=shell)
364 cfg.shell = shell
365 cfg.shell = shell
365 if cfg not in shell.configurables:
366 if cfg not in shell.configurables:
366 shell.configurables.append(cfg)
367 shell.configurables.append(cfg)
367
368
368 if backend == backends['inline']:
369 if backend == backends['inline']:
369 from ipykernel.pylab.backend_inline import flush_figures
370 from ipykernel.pylab.backend_inline import flush_figures
370 shell.events.register('post_execute', flush_figures)
371 shell.events.register('post_execute', flush_figures)
371
372
372 # Save rcParams that will be overwrittern
373 # Save rcParams that will be overwrittern
373 shell._saved_rcParams = dict()
374 shell._saved_rcParams = dict()
374 for k in cfg.rc:
375 for k in cfg.rc:
375 shell._saved_rcParams[k] = pyplot.rcParams[k]
376 shell._saved_rcParams[k] = pyplot.rcParams[k]
376 # load inline_rc
377 # load inline_rc
377 pyplot.rcParams.update(cfg.rc)
378 pyplot.rcParams.update(cfg.rc)
378 new_backend_name = "inline"
379 new_backend_name = "inline"
379 else:
380 else:
380 from ipykernel.pylab.backend_inline import flush_figures
381 from ipykernel.pylab.backend_inline import flush_figures
381 try:
382 try:
382 shell.events.unregister('post_execute', flush_figures)
383 shell.events.unregister('post_execute', flush_figures)
383 except ValueError:
384 except ValueError:
384 pass
385 pass
385 if hasattr(shell, '_saved_rcParams'):
386 if hasattr(shell, '_saved_rcParams'):
386 pyplot.rcParams.update(shell._saved_rcParams)
387 pyplot.rcParams.update(shell._saved_rcParams)
387 del shell._saved_rcParams
388 del shell._saved_rcParams
388 new_backend_name = "other"
389 new_backend_name = "other"
389
390
390 # only enable the formats once -> don't change the enabled formats (which the user may
391 # only enable the formats once -> don't change the enabled formats (which the user may
391 # has changed) when getting another "%matplotlib inline" call.
392 # has changed) when getting another "%matplotlib inline" call.
392 # See https://github.com/ipython/ipykernel/issues/29
393 # See https://github.com/ipython/ipykernel/issues/29
393 cur_backend = getattr(configure_inline_support, "current_backend", "unset")
394 cur_backend = getattr(configure_inline_support, "current_backend", "unset")
394 if new_backend_name != cur_backend:
395 if new_backend_name != cur_backend:
395 # Setup the default figure format
396 # Setup the default figure format
396 select_figure_formats(shell, cfg.figure_formats, **cfg.print_figure_kwargs)
397 select_figure_formats(shell, cfg.figure_formats, **cfg.print_figure_kwargs)
397 configure_inline_support.current_backend = new_backend_name
398 configure_inline_support.current_backend = new_backend_name
General Comments 0
You need to be logged in to leave comments. Login now