pylab.py
173 lines
| 6.5 KiB
| text/x-python
|
PythonLexer
|
r6968 | """Implementation of magic functions for matplotlib/pylab support. | ||
""" | ||||
#----------------------------------------------------------------------------- | ||||
# 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 | ||||
|
r21253 | from traitlets.config.application import Application | ||
|
r11324 | from IPython.core import magic_arguments | ||
|
r6973 | from IPython.core.magic import Magics, magics_class, line_magic | ||
|
r6968 | from IPython.testing.skipdoctest import skip_doctest | ||
|
r22092 | from warnings import warn | ||
|
r6968 | |||
#----------------------------------------------------------------------------- | ||||
# Magic implementation classes | ||||
#----------------------------------------------------------------------------- | ||||
|
r11328 | magic_gui_arg = magic_arguments.argument( | ||
|
r28715 | "gui", | ||
nargs="?", | ||||
help="""Name of the matplotlib backend to use such as 'qt' or 'widget'. | ||||
|
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). | ||||
|
r28715 | """, | ||
|
r11328 | ) | ||
|
r6968 | |||
|
r11328 | @magics_class | ||
class PylabMagics(Magics): | ||||
"""Magics related to matplotlib's pylab support""" | ||||
|
r25137 | |||
|
r11328 | @skip_doctest | ||
@line_magic | ||||
@magic_arguments.magic_arguments() | ||||
|
r21428 | @magic_arguments.argument('-l', '--list', action='store_true', | ||
|
r21366 | help='Show available matplotlib backends') | ||
|
r11328 | @magic_gui_arg | ||
def matplotlib(self, line=''): | ||||
"""Set up matplotlib to work interactively. | ||||
|
r25137 | |||
|
r11328 | This function lets you activate matplotlib interactive support | ||
|
r15126 | at any point during an IPython session. It does not import anything | ||
into the interactive namespace. | ||||
|
r25137 | |||
|
r15126 | If you are using the inline matplotlib backend in the IPython Notebook | ||
you can set which figure formats are enabled using the following:: | ||||
|
r25137 | |||
|
r28073 | In [1]: from matplotlib_inline.backend_inline import set_matplotlib_formats | ||
|
r25137 | |||
|
r15126 | In [2]: set_matplotlib_formats('pdf', 'svg') | ||
|
r6968 | |||
|
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:: | ||||
|
r25137 | |||
|
r20711 | In [3]: %config InlineBackend.print_figure_kwargs = {'bbox_inches':None} | ||
|
r28073 | In addition, see the docstrings of | ||
`matplotlib_inline.backend_inline.set_matplotlib_formats` and | ||||
`matplotlib_inline.backend_inline.set_matplotlib_close` for more information on | ||||
|
r20711 | changing additional behaviors of the inline backend. | ||
|
r6968 | |||
Examples | ||||
-------- | ||||
|
r15126 | To enable the inline backend for usage with the IPython Notebook:: | ||
|
r25137 | |||
|
r15126 | In [1]: %matplotlib inline | ||
In this case, where the matplotlib default is TkAgg:: | ||||
|
r6968 | |||
|
r11328 | In [2]: %matplotlib | ||
Using matplotlib backend: TkAgg | ||||
|
r6968 | |||
|
r15126 | But you can explicitly request a different GUI backend:: | ||
|
r6968 | |||
|
r11328 | In [3]: %matplotlib qt | ||
|
r21366 | |||
|
r21578 | You can list the available backends using the -l/--list option:: | ||
|
r21366 | |||
|
r21406 | In [4]: %matplotlib --list | ||
|
r26726 | Available matplotlib backends: ['osx', 'qt4', 'qt5', 'gtk3', 'gtk4', 'notebook', 'wx', 'qt', 'nbagg', | ||
|
r21578 | 'gtk', 'tk', 'inline'] | ||
|
r21406 | """ | ||
args = magic_arguments.parse_argstring(self.matplotlib, line) | ||||
if args.list: | ||||
|
r28722 | from IPython.core.pylabtools import _list_matplotlib_backends_and_gui_loops | ||
|
r28715 | |||
|
r28722 | print( | ||
"Available matplotlib backends: %s" | ||||
% _list_matplotlib_backends_and_gui_loops() | ||||
) | ||||
|
r21366 | else: | ||
|
r25137 | gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui) | ||
|
r21366 | self._show_matplotlib_backend(args.gui, backend) | ||
|
r6968 | |||
|
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. | ||||
|
r25137 | |||
|
r11544 | You can govern the default behavior of this flag with the | ||
|
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. | ||||
|
r25137 | |||
|
r11544 | %pylab makes the following imports:: | ||
|
r25137 | |||
|
r11544 | import numpy | ||
import matplotlib | ||||
from matplotlib import pylab, mlab, pyplot | ||||
np = numpy | ||||
plt = pyplot | ||||
|
r25137 | |||
|
r11544 | from IPython.display import display | ||
from IPython.core.pylabtools import figsize, getfigs | ||||
|
r25137 | |||
|
r11544 | from pylab import * | ||
from numpy import * | ||||
|
r11328 | |||
|
r11544 | If you pass `--no-import-all`, the last two `*` imports will be excluded. | ||
|
r25137 | |||
|
r11544 | See the %matplotlib magic for more details about activating matplotlib | ||
without affecting the interactive namespace. | ||||
|
r6968 | """ | ||
|
r11324 | args = magic_arguments.parse_argstring(self.pylab, line) | ||
|
r11328 | if args.no_import_all is None: | ||
|
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 | ||||
|
r6968 | else: | ||
|
r11324 | # invert no-import flag | ||
|
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) | ||||
|
r25977 | print( | ||
|
r26027 | "%pylab is deprecated, use %matplotlib inline and import the required libraries." | ||
|
r25977 | ) | ||
print("Populating the interactive namespace from numpy and matplotlib") | ||||
|
r11328 | if clobbered: | ||
warn("pylab import has clobbered these variables: %s" % clobbered + | ||||
|
r15553 | "\n`%matplotlib` prevents importing * from pylab and numpy" | ||
|
r11328 | ) | ||
|
r25137 | |||
|
r11328 | def _show_matplotlib_backend(self, gui, backend): | ||
"""show matplotlib message backend message""" | ||||
if not gui or gui == 'auto': | ||||
|
r13386 | print("Using matplotlib backend: %s" % backend) | ||