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