[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