[yt-svn] commit/yt: jzuhone: Merged in a_gilbert/yt (pull request #2294)
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Wed Aug 3 07:06:59 PDT 2016
1 new commit in yt:
https://bitbucket.org/yt_analysis/yt/commits/fb82173a3279/
Changeset: fb82173a3279
Branch: yt
User: jzuhone
Date: 2016-08-03 14:06:25+00:00
Summary: Merged in a_gilbert/yt (pull request #2294)
Backend Independent Plots: Closing Issue #660
Affected #: 11 files
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f CREDITS
--- a/CREDITS
+++ b/CREDITS
@@ -21,6 +21,7 @@
Daniel Fenn (df11c at my.fsu.edu)
John Forces (jforbes at ucolick.org)
Adam Ginsburg (keflavich at gmail.com)
+ Austin Gilbert (augilbert4 at gmail.com)
Sam Geen (samgeen at gmail.com)
Nathan Goldbaum (goldbaum at ucolick.org)
William Gray (graywilliamj at gmail.com)
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f doc/source/visualizing/plots.rst
--- a/doc/source/visualizing/plots.rst
+++ b/doc/source/visualizing/plots.rst
@@ -17,6 +17,24 @@
plots of slices, projections, 1D profiles, and 2D profiles (phase plots), all of
which are described below.
+.. _viewing-plots:
+
+Viewing Plots
+-------------
+
+YT uses an environment neutral plotting mechanism that detects the appropriate
+matplotlib configuration for a given environment, however it defaults to a basic
+renderer. To utilize interactive plots in matplotlib supported
+environments (Qt, GTK, WX, etc.) simply call the ``toggle_interactivity()`` function. Below is an
+example in a jupyter notebook environment, but the same command should work
+in other environments as well:
+
+.. code-block:: python
+
+ %matplotlib notebook
+ import yt
+ yt.toggle_interactivity()
+
.. _simple-inspection:
Slices & Projections
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/__init__.py
--- a/yt/__init__.py
+++ b/yt/__init__.py
@@ -93,7 +93,8 @@
parallel_profile, \
enable_plugins, \
memory_checker, \
- deprecated_class
+ deprecated_class, \
+ toggle_interactivity
from yt.utilities.logger import ytLogger as mylog
import yt.utilities.physical_constants as physical_constants
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/analysis_modules/level_sets/clump_handling.py
--- a/yt/analysis_modules/level_sets/clump_handling.py
+++ b/yt/analysis_modules/level_sets/clump_handling.py
@@ -85,7 +85,7 @@
if self.children is None: return
for child in self.children:
child.add_validator(validator)
-
+
def add_info_item(self, info_item, *args, **kwargs):
"Adds an entry to clump_info list and tells children to do the same."
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/convenience.py
--- a/yt/convenience.py
+++ b/yt/convenience.py
@@ -127,4 +127,3 @@
return simulation_time_series_registry[simulation_type](parameter_filename,
find_outputs=find_outputs)
-
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/frontends/stream/data_structures.py
--- a/yt/frontends/stream/data_structures.py
+++ b/yt/frontends/stream/data_structures.py
@@ -668,7 +668,7 @@
sfh.update({0:data})
grid_left_edges = domain_left_edge
grid_right_edges = domain_right_edge
- grid_dimensions = domain_dimensions.reshape(nprocs,3).astype("int32")
+ grid_dimensions = domain_dimensions.reshape(nprocs, 3).astype("int32")
if length_unit is None:
length_unit = 'code_length'
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/funcs.py
--- a/yt/funcs.py
+++ b/yt/funcs.py
@@ -16,7 +16,7 @@
import errno
from yt.extern.six import string_types
-from yt.extern.six.moves import input
+from yt.extern.six.moves import input, builtins
import time
import inspect
import traceback
@@ -986,3 +986,21 @@
except ImportError:
pass
return dummy_context_manager()
+
+interactivity = False
+
+"""Sets the condition that interactive backends can be used."""
+def toggle_interactivity():
+ global interactivity
+ interactivity = not interactivity
+ if interactivity is True:
+ if '__IPYTHON__' in dir(builtins):
+ import IPython
+ shell = IPython.get_ipython()
+ shell.magic('matplotlib')
+ else:
+ import matplotlib
+ matplotlib.interactive(True)
+
+def get_interactivity():
+ return interactivity
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/visualization/base_plot_types.py
--- a/yt/visualization/base_plot_types.py
+++ b/yt/visualization/base_plot_types.py
@@ -20,9 +20,30 @@
mylog, \
iterable, \
get_brewer_cmap, \
- matplotlib_style_context
+ matplotlib_style_context, \
+ get_interactivity
import numpy as np
+backend_dict = {'GTK': ['backend_gtk', 'FigureCanvasGTK',
+ 'FigureManagerGTK'],
+ 'GTKAgg': ['backend_gtkagg', 'FigureCanvasGTKAgg'],
+ 'GTKCairo': ['backend_gtkcairo', 'FigureCanvasGTKCairo'],
+ 'MacOSX': ['backend_macosx', 'FigureCanvasMac', 'FigureManagerMac'],
+ 'Qt4Agg': ['backend_qt4agg', 'FigureCanvasQTAgg'],
+ 'Qt5Agg': ['backend_gt5agg', 'FigureCanvasQTAgg'],
+ 'TkAgg': ['backend_tkagg', 'FigureCanvasTkAgg'],
+ 'WX': ['backend_wx', 'FigureCanvasWx'],
+ 'WXAgg': ['backend_wxagg', 'FigureCanvasWxAgg'],
+ 'GTK3Cairo': ['backend_gtk3cairo',
+ 'FigureCanvasGTK3Cairo',
+ 'FigureManagerGTK3Cairo'],
+ 'GTK3Agg': ['backend_gtk3agg', 'FigureCanvasGTK3Agg',
+ 'FigureManagerGTK3Agg'],
+ 'WebAgg': ['backend_webagg', 'FigureCanvasWebAgg'],
+ 'nbAgg': ['backend_nbagg', 'FigureCanvasNbAgg',
+ 'FigureManagerNbAgg'],
+ 'agg': ['backend_agg', 'FigureCanvasAgg']}
+
class CallbackWrapper(object):
def __init__(self, viewer, window_plot, frb, field, font_properties,
@@ -50,14 +71,15 @@
self.font_color = font_color
self.field = field
+
class PlotMPL(object):
- """A base class for all yt plots made using matplotlib.
+ """A base class for all yt plots made using matplotlib, that is backend independent.
"""
+
def __init__(self, fsize, axrect, figure, axes):
"""Initialize PlotMPL class"""
import matplotlib.figure
- from ._mpl_imports import FigureCanvasAgg
self._plot_valid = True
if figure is None:
self.figure = matplotlib.figure.Figure(figsize=fsize, frameon=True)
@@ -70,11 +92,33 @@
axes.cla()
axes.set_position(axrect)
self.axes = axes
- self.canvas = FigureCanvasAgg(self.figure)
+ canvas_classes = self._set_canvas()
+ self.canvas = canvas_classes[0](self.figure)
+ if len(canvas_classes) > 1:
+ self.manager = canvas_classes[1](self.canvas, 1)
for which in ['major', 'minor']:
for axis in 'xy':
self.axes.tick_params(which=which, axis=axis, direction='in')
+ def _set_canvas(self):
+ self.interactivity = get_interactivity()
+ if self.interactivity:
+ backend = str(matplotlib.get_backend())
+ else:
+ backend = 'agg'
+
+ for key in backend_dict.keys():
+ if key == backend:
+ mod = __import__('matplotlib.backends', globals(), locals(),
+ [backend_dict[key][0]], 0)
+ submod = getattr(mod, backend_dict[key][0])
+ FigureCanvas = getattr(submod, backend_dict[key][1])
+ if len(backend_dict[key]) > 2:
+ FigureManager = getattr(submod, backend_dict[key][2])
+ return [FigureCanvas, FigureManager]
+ else:
+ return [FigureCanvas]
+
def save(self, name, mpl_kwargs=None, canvas=None):
"""Choose backend and save image to disk"""
from ._mpl_imports import \
@@ -105,6 +149,12 @@
canvas.print_figure(name, **mpl_kwargs)
return name
+ def show(self):
+ try:
+ self.manager.show()
+ except AttributeError:
+ self.canvas.show()
+
def _get_labels(self):
ax = self.axes
labels = ax.xaxis.get_ticklabels() + ax.yaxis.get_ticklabels()
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/visualization/plot_container.py
--- a/yt/visualization/plot_container.py
+++ b/yt/visualization/plot_container.py
@@ -620,15 +620,18 @@
>>> slc.show()
"""
- if "__IPYTHON__" in dir(builtins):
- api_version = get_ipython_api_version()
- if api_version in ('0.10', '0.11'):
- self._send_zmq()
- else:
- from IPython.display import display
- display(self)
+ interactivity = self.plots[list(self.plots.keys())[0]].interactivity
+ if interactivity:
+ for k,v in sorted(iteritems(self.plots)):
+ v.show()
else:
- raise YTNotInsideNotebook
+ if "__IPYTHON__" in dir(builtins):
+ api_version = get_ipython_api_version()
+ if api_version in ('0.10', '0.11'):
+ self._send_zmq()
+ else:
+ from IPython.display import display
+ display(self)
@validate_plot
def display(self, name=None, mpl_kwargs=None):
diff -r 517b33cc1b1f11456721183f80aa4669d8f80da8 -r fb82173a327964238da127db05ea1af176616f8f yt/visualization/plot_window.py
--- a/yt/visualization/plot_window.py
+++ b/yt/visualization/plot_window.py
@@ -23,7 +23,8 @@
from distutils.version import LooseVersion
from numbers import Number
-from .base_plot_types import ImagePlotMPL
+from .base_plot_types import \
+ ImagePlotMPL
from .fixed_resolution import \
FixedResolutionBuffer, \
ObliqueFixedResolutionBuffer, \
Repository URL: https://bitbucket.org/yt_analysis/yt/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
More information about the yt-svn
mailing list