##// END OF EJS Templates
ENH: Refactor pretty to allow it to run without global type registries.
ENH: Refactor pretty to allow it to run without global type registries.

File last commit:

r3195:3777d779
r3208:428050f8
Show More
pylabtools.py
208 lines | 7.1 KiB | text/x-python | PythonLexer
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 # -*- coding: utf-8 -*-
"""Pylab (matplotlib) support utilities.
Authors
-------
Brian Granger
Updating terminal GUI support to use guisupport.py for qt4/wx.
r2918
* Fernando Perez.
* Brian Granger
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 """
#-----------------------------------------------------------------------------
# Copyright (C) 2009 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Brian Granger
Work to address the review comments on Fernando's branch....
r2498
from IPython.utils.decorators import flag_calls
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 # If user specifies a GUI, that dictates the backend, otherwise we read the
# user's mpl default from the mpl rc structure
backends = {'tk': 'TkAgg',
'gtk': 'GTKAgg',
'wx': 'WXAgg',
'qt': 'Qt4Agg', # qt3 not supported
'qt4': 'Qt4Agg',
Fernando Perez
Renamed 'payload-svg' matplotlib backend to 'inline'.
r2991 'inline' : 'module://IPython.zmq.pylab.backend_inline'}
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 #-----------------------------------------------------------------------------
# Main classes and functions
#-----------------------------------------------------------------------------
Brian Granger
Initial GUI support in kernel.
r2868 def find_gui_and_backend(gui=None):
"""Given a gui string return the gui and mpl backend.
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Parameters
----------
Brian Granger
Initial GUI support in kernel.
r2868 gui : str
Fernando Perez
Renamed 'payload-svg' matplotlib backend to 'inline'.
r2991 Can be one of ('tk','gtk','wx','qt','qt4','inline').
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Returns
-------
Brian Granger
Initial GUI support in kernel.
r2868 A tuple of (gui, backend) where backend is one of ('TkAgg','GTKAgg',
Fernando Perez
Renamed 'payload-svg' matplotlib backend to 'inline'.
r2991 'WXAgg','Qt4Agg','module://IPython.zmq.pylab.backend_inline').
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 """
import matplotlib
if gui:
# select backend based on requested gui
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 backend = backends[gui]
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 else:
backend = matplotlib.rcParams['backend']
# In this case, we need to find what the appropriate gui selection call
# should be for IPython, so we can activate inputhook accordingly
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 g2b = backends # maps gui names to mpl backend names
b2g = dict(zip(g2b.values(), g2b.keys())) # reverse dict
Benjamin Ragan-Kelley
added default behavior, to allow for unhandled backends, such as 'MacOSX'
r2531 gui = b2g.get(backend, None)
Brian Granger
Initial GUI support in kernel.
r2868 return gui, backend
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Brian Granger
Initial GUI support in kernel.
r2868
def activate_matplotlib(backend):
"""Activate the given backend and set interactive to True."""
import matplotlib
if backend.startswith('module://'):
# Work around bug in matplotlib: matplotlib.use converts the
# backend_id to lowercase even if a module name is specified!
matplotlib.rcParams['backend'] = backend
else:
matplotlib.use(backend)
matplotlib.interactive(True)
Brian Granger
GUI support for wx, qt and tk.
r2872
# This must be imported last in the matplotlib series, after
# backend/interactivity choices have been made
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 import matplotlib.pylab as pylab
Brian Granger
GUI support for wx, qt and tk.
r2872 # XXX For now leave this commented out, but depending on discussions with
# mpl-dev, we may be able to allow interactive switching...
#import matplotlib.pyplot
#matplotlib.pyplot.switch_backend(backend)
pylab.show._needmain = False
# We need to detect at runtime whether show() is called by the user.
# For this, we wrap it into a decorator which adds a 'called' flag.
pylab.draw_if_interactive = flag_calls(pylab.draw_if_interactive)
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987
def import_pylab(user_ns, backend, import_all=True, shell=None):
Brian Granger
Initial GUI support in kernel.
r2868 """Import the standard pylab symbols into user_ns."""
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
# Import numpy as np/pyplot as plt are conventions we're trying to
# somewhat standardize on. Making them available to users by default
Fernando Perez
Fix name pollution of interactive namespace in pylab mode....
r3195 # will greatly help this.
s = ("import numpy\n"
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 "import matplotlib\n"
"from matplotlib import pylab, mlab, pyplot\n"
"np = numpy\n"
"plt = pyplot\n"
Fernando Perez
Fix name pollution of interactive namespace in pylab mode....
r3195 )
exec s in user_ns
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 if shell is not None:
Fernando Perez
Fix name pollution of interactive namespace in pylab mode....
r3195 exec s in shell.user_ns_hidden
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 # If using our svg payload backend, register the post-execution
# function that will pick up the results for display. This can only be
# done with access to the real shell object.
Fernando Perez
Renamed 'payload-svg' matplotlib backend to 'inline'.
r2991 if backend == backends['inline']:
Fernando Perez
Set default figure size in inline mode to (6,4)....
r3045 from IPython.zmq.pylab.backend_inline import flush_svg, figsize
from matplotlib import pyplot
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 shell.register_post_execute(flush_svg)
Fernando Perez
Set default figure size in inline mode to (6,4)....
r3045 # The typical default figure size is too large for inline use. We
# might make this a user-configurable parameter later.
figsize(6.0, 4.0)
# Add 'figsize' to pyplot and to the user's namespace
user_ns['figsize'] = pyplot.figsize = figsize
Fernando Perez
Fix name pollution of interactive namespace in pylab mode....
r3195 shell.user_ns_hidden['figsize'] = figsize
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 else:
Fernando Perez
Rename 'paste' function to 'pastefig'.
r3044 from IPython.zmq.pylab.backend_inline import pastefig
Fernando Perez
Add paste to plt, fix spurious newlines in cell mode.
r2988 from matplotlib import pyplot
# Add 'paste' to pyplot and to the user's namespace
Fernando Perez
Rename 'paste' function to 'pastefig'.
r3044 user_ns['pastefig'] = pyplot.pastefig = pastefig
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 if import_all:
Fernando Perez
Fix name pollution of interactive namespace in pylab mode....
r3195 s = ("from matplotlib.pylab import *\n"
"from numpy import *\n")
exec s in user_ns
if shell is not None:
exec s in shell.user_ns_hidden
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
Brian Granger
Initial GUI support in kernel.
r2868
def pylab_activate(user_ns, gui=None, import_all=True):
"""Activate pylab mode in the user's namespace.
Loads and initializes numpy, matplotlib and friends for interactive use.
Parameters
----------
user_ns : dict
Namespace where the imports will occur.
gui : optional, string
A valid gui name following the conventions of the %gui magic.
import_all : optional, boolean
If true, an 'import *' is done from numpy and pylab.
Returns
-------
The actual gui used (if not given as input, it was obtained from matplotlib
itself, and will be needed next to configure IPython's gui integration.
"""
gui, backend = find_gui_and_backend(gui)
activate_matplotlib(backend)
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987 import_pylab(user_ns, backend)
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363
print """
Fernando Perez
Small fix to info message when pylab starts.
r2364 Welcome to pylab, a matplotlib-based Python environment [backend: %s].
Fernando Perez
First semi-complete support for -pylab and %pylab....
r2363 For more information, type 'help(pylab)'.""" % backend
return gui
# We need a little factory function here to create the closure where
# safe_execfile can live.
def mpl_runner(safe_execfile):
"""Factory to return a matplotlib-enabled runner for %run.
Parameters
----------
safe_execfile : function
This must be a function with the same interface as the
:meth:`safe_execfile` method of IPython.
Returns
-------
A function suitable for use as the ``runner`` argument of the %run magic
function.
"""
def mpl_execfile(fname,*where,**kw):
"""matplotlib-aware wrapper around safe_execfile.
Its interface is identical to that of the :func:`execfile` builtin.
This is ultimately a call to execfile(), but wrapped in safeties to
properly handle interactive rendering."""
import matplotlib
import matplotlib.pylab as pylab
#print '*** Matplotlib runner ***' # dbg
# turn off rendering until end of script
is_interactive = matplotlib.rcParams['interactive']
matplotlib.interactive(False)
safe_execfile(fname,*where,**kw)
matplotlib.interactive(is_interactive)
# make rendering call now, if the user tried to do it
if pylab.draw_if_interactive.called:
pylab.draw()
pylab.draw_if_interactive.called = False
return mpl_execfile
Brian Granger
Updating terminal GUI support to use guisupport.py for qt4/wx.
r2918