pylab.py
155 lines
| 5.9 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r6968 | """Implementation of magic functions for matplotlib/pylab support. | ||
""" | ||||
Thomas Kluyver
|
r13348 | from __future__ import print_function | ||
Fernando Perez
|
r6968 | #----------------------------------------------------------------------------- | ||
# Copyright (c) 2012 The IPython Development Team. | ||||
# | ||||
# Distributed under the terms of the Modified BSD License. | ||||
# | ||||
# The full license is in the file COPYING.txt, distributed with this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
# Our own packages | ||||
from IPython.config.application import Application | ||||
MinRK
|
r11324 | from IPython.core import magic_arguments | ||
Fernando Perez
|
r6973 | from IPython.core.magic import Magics, magics_class, line_magic | ||
Fernando Perez
|
r6968 | from IPython.testing.skipdoctest import skip_doctest | ||
MinRK
|
r11328 | from IPython.utils.warn import warn | ||
Paul Ivanov
|
r11446 | from IPython.core.pylabtools import backends | ||
Fernando Perez
|
r6968 | |||
#----------------------------------------------------------------------------- | ||||
# Magic implementation classes | ||||
#----------------------------------------------------------------------------- | ||||
MinRK
|
r11328 | magic_gui_arg = magic_arguments.argument( | ||
MinRK
|
r11324 | 'gui', nargs='?', | ||
Paul Ivanov
|
r11446 | help="""Name of the matplotlib backend to use %s. | ||
MinRK
|
r11324 | If given, the corresponding matplotlib backend is used, | ||
otherwise it will be matplotlib's default | ||||
(which you can set in your matplotlib config file). | ||||
Paul Ivanov
|
r11446 | """ % str(tuple(sorted(backends.keys()))) | ||
MinRK
|
r11328 | ) | ||
Fernando Perez
|
r6968 | |||
MinRK
|
r11328 | @magics_class | ||
class PylabMagics(Magics): | ||||
"""Magics related to matplotlib's pylab support""" | ||||
@skip_doctest | ||||
@line_magic | ||||
@magic_arguments.magic_arguments() | ||||
@magic_gui_arg | ||||
def matplotlib(self, line=''): | ||||
"""Set up matplotlib to work interactively. | ||||
This function lets you activate matplotlib interactive support | ||||
Brian E. Granger
|
r15126 | at any point during an IPython session. It does not import anything | ||
into the interactive namespace. | ||||
MinRK
|
r11328 | |||
Brian E. Granger
|
r15126 | If you are using the inline matplotlib backend in the IPython Notebook | ||
you can set which figure formats are enabled using the following:: | ||||
In [1]: from IPython.display import set_matplotlib_formats | ||||
In [2]: set_matplotlib_formats('pdf', 'svg') | ||||
Fernando Perez
|
r6968 | |||
Ryan Nelson
|
r20711 | The default for inline figures sets `bbox_inches` to 'tight'. This can | ||
cause discrepancies between the displayed image and the identical | ||||
image created using `savefig`. This behavior can be disabled using the | ||||
`%config` magic:: | ||||
In [3]: %config InlineBackend.print_figure_kwargs = {'bbox_inches':None} | ||||
In addition, see the docstring of | ||||
`IPython.display.set_matplotlib_formats` and | ||||
Brian E. Granger
|
r15126 | `IPython.display.set_matplotlib_close` for more information on | ||
Ryan Nelson
|
r20711 | changing additional behaviors of the inline backend. | ||
Fernando Perez
|
r6968 | |||
Examples | ||||
-------- | ||||
Brian E. Granger
|
r15126 | To enable the inline backend for usage with the IPython Notebook:: | ||
In [1]: %matplotlib inline | ||||
In this case, where the matplotlib default is TkAgg:: | ||||
Fernando Perez
|
r6968 | |||
MinRK
|
r11328 | In [2]: %matplotlib | ||
Using matplotlib backend: TkAgg | ||||
Fernando Perez
|
r6968 | |||
Brian E. Granger
|
r15126 | But you can explicitly request a different GUI backend:: | ||
Fernando Perez
|
r6968 | |||
MinRK
|
r11328 | In [3]: %matplotlib qt | ||
""" | ||||
args = magic_arguments.parse_argstring(self.matplotlib, line) | ||||
gui, backend = self.shell.enable_matplotlib(args.gui) | ||||
self._show_matplotlib_backend(args.gui, backend) | ||||
Fernando Perez
|
r6968 | |||
MinRK
|
r11328 | @skip_doctest | ||
@line_magic | ||||
@magic_arguments.magic_arguments() | ||||
@magic_arguments.argument( | ||||
'--no-import-all', action='store_true', default=None, | ||||
help="""Prevent IPython from performing ``import *`` into the interactive namespace. | ||||
MinRK
|
r11544 | You can govern the default behavior of this flag with the | ||
MinRK
|
r11328 | InteractiveShellApp.pylab_import_all configurable. | ||
""" | ||||
) | ||||
@magic_gui_arg | ||||
def pylab(self, line=''): | ||||
"""Load numpy and matplotlib to work interactively. | ||||
This function lets you activate pylab (matplotlib, numpy and | ||||
interactive support) at any point during an IPython session. | ||||
MinRK
|
r11544 | |||
%pylab makes the following imports:: | ||||
import numpy | ||||
import matplotlib | ||||
from matplotlib import pylab, mlab, pyplot | ||||
np = numpy | ||||
plt = pyplot | ||||
from IPython.display import display | ||||
from IPython.core.pylabtools import figsize, getfigs | ||||
from pylab import * | ||||
from numpy import * | ||||
MinRK
|
r11328 | |||
MinRK
|
r11544 | If you pass `--no-import-all`, the last two `*` imports will be excluded. | ||
MinRK
|
r11328 | |||
MinRK
|
r11544 | See the %matplotlib magic for more details about activating matplotlib | ||
without affecting the interactive namespace. | ||||
Fernando Perez
|
r6968 | """ | ||
MinRK
|
r11324 | args = magic_arguments.parse_argstring(self.pylab, line) | ||
MinRK
|
r11328 | if args.no_import_all is None: | ||
MinRK
|
r11324 | # get default from Application | ||
if Application.initialized(): | ||||
app = Application.instance() | ||||
try: | ||||
import_all = app.pylab_import_all | ||||
except AttributeError: | ||||
import_all = True | ||||
else: | ||||
# nothing specified, no app - default True | ||||
import_all = True | ||||
Fernando Perez
|
r6968 | else: | ||
MinRK
|
r11324 | # invert no-import flag | ||
MinRK
|
r11328 | import_all = not args.no_import_all | ||
gui, backend, clobbered = self.shell.enable_pylab(args.gui, import_all=import_all) | ||||
self._show_matplotlib_backend(args.gui, backend) | ||||
MinRK
|
r11533 | print ("Populating the interactive namespace from numpy and matplotlib") | ||
MinRK
|
r11328 | if clobbered: | ||
warn("pylab import has clobbered these variables: %s" % clobbered + | ||||
Paul Ivanov
|
r15553 | "\n`%matplotlib` prevents importing * from pylab and numpy" | ||
MinRK
|
r11328 | ) | ||
def _show_matplotlib_backend(self, gui, backend): | ||||
"""show matplotlib message backend message""" | ||||
if not gui or gui == 'auto': | ||||
Thomas Kluyver
|
r13386 | print("Using matplotlib backend: %s" % backend) | ||