[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#863523: marked as done (unblock: (preapproval) matplotlib/2.0.2-1)



Your message dated Sat, 3 Jun 2017 23:20:31 +0200
with message-id <20170603212029.GA12453@ugent.be>
and subject line Re: Bug#863523: unblock: (preapproval) matplotlib/2.0.2-1
has caused the Debian Bug report #863523,
regarding unblock: (preapproval) matplotlib/2.0.2-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
863523: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863523
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package matplotlib

Upstream has recently released matplotlib 2.0.2 which fixes only
critical/important bugs in the 2.0.x branch.

the high-level description of the changes is at [0] and also here below:

[0] https://github.com/matplotlib/matplotlib/releases

2.0.0 -> 2.0.1
```
API

 - Do not clip the linewidth used for dash pattern scaling.  This is
   an API change, but is a major improvement.
 - Deprecate 'vega' color names in favor of 'tab'.

Bug Fixes

 - Hatching color follows edge color again.
 - Fixes a critical bug with masked images.
 - Improved high-dpi support for Qt5.
 - Log ticking no never skip minor ticks
 - Do not skip points surrounded by nan/inf in vector outputs.
```

2.0.1 -> 2.0.2

```
Critical bug fixes for 2.0.1

 - fixed Qt4 support
 - fixed LogFormatter
 - fixed hatched artists in legends
 - fixed segfault with large images

```

I know it's late in the release, but 2.0.0 was a big milestone for upstream, so
some adjustments/bug fixes were expected. matplotlib is continuosly tested via
travis[1] and you can see there how the 2.0.x branch is passing the upstream
very extensive test suite.

[1] https://travis-ci.org/matplotlib/matplotlib/branches

An upsteam source diff is attached, filtering out doc/tests/examples; a full
diff is available at [2] or via git.

[2] https://anonscm.debian.org/cgit/python-modules/packages/matplotlib.git/commit/?h=upstream&id=4816639bd3468d3e9f9cc9fed76324fdc8e0c9b6

let me know if it's possible for me to proceed with an upload.

unblock matplotlib/2.0.2-1

Thanks!

-- System Information:
Debian Release: stretch/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64
 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.2.0-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.utf8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
commit 4816639bd3468d3e9f9cc9fed76324fdc8e0c9b6
Author: Sandro Tosi <morph@debian.org>
Date:   Sun May 14 22:57:13 2017 -0400

    Import matplotlib_2.0.2.orig.tar.gz

diff --git a/.travis.yml b/.travis.yml
index e2bf8ca..9c068a0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -52,12 +52,11 @@ matrix:
     - python: 3.4
     - python: 3.5
       env: PANDAS=pandas DELETE_FONT_CACHE=1
+    - python: 3.6   
     - python: 2.7
       env: TEST_ARGS=--pep8
     - python: 2.7
       env: BUILD_DOCS=true MOCK=mock
-    - python: "3.6-dev"
-      env: PRE=--pre
     - python: "nightly"
       env: PRE=--pre
   allow_failures:
@@ -76,6 +75,7 @@ before_install:
 
 install:
   - ccache -s
+  - git describe
   # Upgrade pip and setuptools. Mock has issues with the default version of
   # setuptools
   - |
diff --git a/INSTALL b/INSTALL
index 74dd8f6..706df37 100644
--- a/INSTALL
+++ b/INSTALL
@@ -64,12 +64,12 @@ install matplotlib using pip_::
     python -m pip install matplotlib
 
 In case Python 2.7 or 3.4 are not installed for all users,
-the Microsoft Visual C++ 2008 (
-`64 bit <https://www.microsoft.com/en-us/download/details.aspx?id=15336>`__
+the Microsoft Visual C++ 2008
+(`64 bit <https://www.microsoft.com/en-us/download/details.aspx?id=15336>`__
 or
 `32 bit <https://www.microsoft.com/en-us/download/details.aspx?id=29>`__
-for Python 2.7) or Microsoft Visual C++ 2010 (
-`64 bit <https://www.microsoft.com/en-us/download/details.aspx?id=14632>`__
+for Python 2.7) or Microsoft Visual C++ 2010
+(`64 bit <https://www.microsoft.com/en-us/download/details.aspx?id=14632>`__
 or
 `32 bit <https://www.microsoft.com/en-us/download/details.aspx?id=5555>`__
 for Python 3.4) redistributable packages need to be installed.
@@ -133,13 +133,15 @@ latest git version :ref:`install-from-git`.
 The standard environment variables `CC`, `CXX`, `PKG_CONFIG` are respected.
 This means you can set them if your toolchain is prefixed. This may be used for
 cross compiling.
+::
 
   export CC=x86_64-pc-linux-gnu-gcc
   export CXX=x86_64-pc-linux-gnu-g++
   export PKG_CONFIG=x86_64-pc-linux-gnu-pkg-config
 
 Once you have satisfied the requirements detailed below (mainly
-python, numpy, libpng and freetype), you can build matplotlib::
+python, numpy, libpng and freetype), you can build matplotlib.
+::
 
   cd matplotlib
   python setup.py build
diff --git a/README.rst b/README.rst
index 8d98da8..4aabced 100644
--- a/README.rst
+++ b/README.rst
@@ -1,3 +1,25 @@
+|Travis|_ |AppVeyor|_ |Codecov|_ |PyPi|_ |Gitter|_ |Depsy|_
+
+
+.. |Travis| image:: https://travis-ci.org/matplotlib/matplotlib.svg?branch=master
+.. _Travis: https://travis-ci.org/matplotlib/matplotlib
+
+.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/github/matplotlib/matplotlib?branch=master&svg=true
+.. _AppVeyor: https://ci.appveyor.com/project/matplotlib/matplotlib
+
+.. |Codecov| image:: https://codecov.io/github/matplotlib/matplotlib/badge.svg?branch=master&service=github
+.. _Codecov: https://codecov.io/github/matplotlib/matplotlib?branch=master
+
+.. |PyPi| image:: https://badge.fury.io/py/matplotlib.svg
+.. _PyPi: https://badge.fury.io/py/matplotlib
+
+.. |Gitter| image:: https://badges.gitter.im/Join%20Chat.svg
+   :alt: Join the chat at https://gitter.im/matplotlib/matplotlib
+.. _Gitter: https://gitter.im/matplotlib/matplotlib?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
+
+.. |Depsy| image:: http://depsy.org/api/package/pypi/matplotlib/badge.svg
+.. _Depsy: http://depsy.org/package/python/matplotlib
+
 ##########
 matplotlib
 ##########
@@ -44,9 +66,7 @@ matplotlib's communication channels include active mailing lists:
 The first is a good starting point for general questions and discussions.
 
 
-.. image:: https://badges.gitter.im/Join%20Chat.svg
-   :alt: Join the chat at https://gitter.im/matplotlib/matplotlib
-   :target: https://gitter.im/matplotlib/matplotlib?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
+
 
 Contribute
 ==========
diff --git a/doc/_static/depsy_badge_default.svg b/doc/_static/depsy_badge_default.svg
new file mode 100644
index 0000000..2fa22b8
diff --git a/doc/api/container_api.rst b/doc/api/container_api.rst
new file mode 100644
index 0000000..3b765f1
diff --git a/doc/devel/README.txt b/doc/devel/README.txt
new file mode 100644
index 0000000..3fc0740
diff --git a/doc/devel/gitwash/branch_dropdown.png b/doc/devel/gitwash/branch_dropdown.png
new file mode 100644
index 0000000..1bb7a57
Binary files /dev/null and b/doc/devel/gitwash/branch_dropdown.png differ
diff --git a/doc/devel/gitwash/git_development.rst b/doc/devel/gitwash/git_development.rst
new file mode 100644
index 0000000..c5b910d
diff --git a/doc/devel/gitwash/maintainer_workflow.rst b/doc/devel/gitwash/maintainer_workflow.rst
new file mode 100644
index 0000000..302f752
diff --git a/doc/devel/gitwash/pull_button.png b/doc/devel/gitwash/pull_button.png
new file mode 100644
index 0000000..e503168
Binary files /dev/null and b/doc/devel/gitwash/pull_button.png differ
diff --git a/examples/pylab_examples/quiver_simple_demo.py b/examples/pylab_examples/quiver_simple_demo.py
new file mode 100644
index 0000000..417b9c2
diff --git a/extern/agg24-svn/include/agg_rendering_buffer.h b/extern/agg24-svn/include/agg_rendering_buffer.h
index 0eff6ff..191347f 100644
--- a/extern/agg24-svn/include/agg_rendering_buffer.h
+++ b/extern/agg24-svn/include/agg_rendering_buffer.h
@@ -62,7 +62,7 @@ namespace agg
             m_stride = stride;
             if(stride < 0) 
             { 
-                m_start = m_buf - int(height - 1) * stride;
+                m_start = m_buf - (AGG_INT64)(height - 1) * stride;
             }
         }
 
@@ -80,10 +80,10 @@ namespace agg
         //--------------------------------------------------------------------
         AGG_INLINE       T* row_ptr(int, int y, unsigned) 
         { 
-            return m_start + y * m_stride; 
+            return m_start + y * (AGG_INT64)m_stride;
         }
-        AGG_INLINE       T* row_ptr(int y)       { return m_start + y * m_stride; }
-        AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; }
+        AGG_INLINE       T* row_ptr(int y)       { return m_start + y * (AGG_INT64)m_stride; }
+        AGG_INLINE const T* row_ptr(int y) const { return m_start + y * (AGG_INT64)m_stride; }
         AGG_INLINE row_data row    (int y) const 
         { 
             return row_data(0, m_width-1, row_ptr(y)); 
@@ -181,7 +181,7 @@ namespace agg
 
             if(stride < 0)
             {
-                row_ptr = m_buf - int(height - 1) * stride;
+                row_ptr = m_buf - (AGG_INT64)(height - 1) * stride;
             }
 
             T** rows = &m_rows[0];
diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py
index 004cc59..530c889 100644
--- a/lib/matplotlib/__init__.py
+++ b/lib/matplotlib/__init__.py
@@ -137,7 +137,7 @@ del get_versions
 
 __version__numpy__ = str('1.7.1')  # minimum required numpy version
 
-__bibtex__ = """@Article{Hunter:2007,
+__bibtex__ = r"""@Article{Hunter:2007,
   Author    = {Hunter, J. D.},
   Title     = {Matplotlib: A 2D graphics environment},
   Journal   = {Computing In Science \& Engineering},
@@ -395,7 +395,7 @@ def checkdep_tex():
                              stderr=subprocess.PIPE)
         stdout, stderr = s.communicate()
         line = stdout.decode('ascii').split('\n')[0]
-        pattern = '3\.1\d+'
+        pattern = r'3\.1\d+'
         match = re.search(pattern, line)
         v = match.group(0)
         return v
@@ -639,7 +639,7 @@ def _get_config_or_cache_dir(xdg_base):
     h = get_home()
     if h is not None:
         p = os.path.join(h, '.matplotlib')
-    if (sys.platform.startswith('linux') and xdg_base):
+    if sys.platform.startswith(('linux', 'freebsd')) and xdg_base:
         p = os.path.join(xdg_base, 'matplotlib')
 
     if p is not None:
@@ -1255,9 +1255,9 @@ def rc(group, **kwargs):
 
       rc('font', **font)  # pass in the font dict as kwargs
 
-    This enables you to easily switch between several configurations.
-    Use :func:`~matplotlib.pyplot.rcdefaults` to restore the default
-    rc params after changes.
+    This enables you to easily switch between several configurations.  Use
+    ``matplotlib.style.use('default')`` or :func:`~matplotlib.rcdefaults` to
+    restore the default rc params after changes.
     """
 
     aliases = {
@@ -1284,15 +1284,26 @@ def rc(group, **kwargs):
 
 
 def rcdefaults():
-    """
-    Restore the default rc params.  These are not the params loaded by
-    the rc file, but mpl's internal params.  See rc_file_defaults for
-    reloading the default params from the rc file
+    """Restore the rc params from Matplotlib's internal defaults.
+
+    See Also
+    --------
+    rc_file_defaults :
+        Restore the rc params from the rc file originally loaded by Matplotlib.
+    matplotlib.style.use :
+        Use a specific style file.  Call ``style.use('default')`` to restore
+        the default style.
     """
     rcParams.clear()
     rcParams.update(rcParamsDefault)
 
 
+def rc_file_defaults():
+    """Restore the rc params from the original rc file loaded by Matplotlib.
+    """
+    rcParams.update(rcParamsOrig)
+
+
 def rc_file(fname):
     """
     Update rc params from file.
@@ -1347,16 +1358,9 @@ class rc_context(object):
         rcParams.update(self._rcparams)
 
 
-def rc_file_defaults():
-    """
-    Restore the default rc params from the original matplotlib rc that
-    was loaded
-    """
-    rcParams.update(rcParamsOrig)
-
-_use_error_msg = """ This call to matplotlib.use() has no effect
-because the backend has already been chosen;
-matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
+_use_error_msg = """
+This call to matplotlib.use() has no effect because the backend has already
+been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
 or matplotlib.backends is imported for the first time.
 """
 
@@ -1472,6 +1476,7 @@ else:
 
 default_test_modules = [
     'matplotlib.tests.test_agg',
+    'matplotlib.tests.test_afm',
     'matplotlib.tests.test_animation',
     'matplotlib.tests.test_arrow_patches',
     'matplotlib.tests.test_artist',
@@ -1502,6 +1507,7 @@ default_test_modules = [
     'matplotlib.tests.test_image',
     'matplotlib.tests.test_legend',
     'matplotlib.tests.test_lines',
+    'matplotlib.tests.test_marker',
     'matplotlib.tests.test_mathtext',
     'matplotlib.tests.test_mlab',
     'matplotlib.tests.test_offsetbox',
@@ -1565,8 +1571,8 @@ def _init_tests():
             "Expected freetype version {0}. "
             "Found freetype version {1}. "
             "Freetype build type is {2}local".format(
-                ft2font.__freetype_version__,
                 LOCAL_FREETYPE_VERSION,
+                ft2font.__freetype_version__,
                 "" if ft2font.__freetype_build_type__ == 'local' else "not "
             )
         )
diff --git a/lib/matplotlib/_cm.py b/lib/matplotlib/_cm.py
index 8523e1c..2ea33ed 100644
--- a/lib/matplotlib/_cm.py
+++ b/lib/matplotlib/_cm.py
@@ -1283,7 +1283,7 @@ _wistia_data = {
 # (divided by 255)
 #
 
-_Vega10_data = (
+_tab10_data = (
     (0.12156862745098039, 0.4666666666666667,  0.7058823529411765  ),  # 1f77b4
     (1.0,                 0.4980392156862745,  0.054901960784313725),  # ff7f0e
     (0.17254901960784313, 0.6274509803921569,  0.17254901960784313 ),  # 2ca02c
@@ -1296,7 +1296,7 @@ _Vega10_data = (
     (0.09019607843137255, 0.7450980392156863,  0.8117647058823529),    # 17becf
     )
 
-_Vega20_data = (
+_tab20_data = (
 	(0.12156862745098039, 0.4666666666666667,  0.7058823529411765  ),  # 1f77b4
 	(0.6823529411764706,  0.7803921568627451,  0.9098039215686274  ),  # aec7e8
 	(1.0,                 0.4980392156862745,  0.054901960784313725),  # ff7f0e
@@ -1319,7 +1319,7 @@ _Vega20_data = (
 	(0.6196078431372549,  0.8549019607843137,  0.8980392156862745),    # 9edae5
     )
 
-_Vega20b_data = (
+_tab20b_data = (
 	(0.2235294117647059,  0.23137254901960785, 0.4745098039215686 ),  # 393b79
 	(0.3215686274509804,  0.32941176470588235, 0.6392156862745098 ),  # 5254a3
 	(0.4196078431372549,  0.43137254901960786, 0.8117647058823529 ),  # 6b6ecf
@@ -1342,7 +1342,7 @@ _Vega20b_data = (
 	(0.8705882352941177,  0.6196078431372549,  0.8392156862745098 ),  # de9ed6
     )
 
-_Vega20c_data = (
+_tab20c_data = (
 	(0.19215686274509805, 0.5098039215686274,  0.7411764705882353  ),  # 3182bd
 	(0.4196078431372549,  0.6823529411764706,  0.8392156862745098  ),  # 6baed6
 	(0.6196078431372549,  0.792156862745098,   0.8823529411764706  ),  # 9ecae1
@@ -1380,6 +1380,15 @@ class _deprecation_datad(dict):
                 alternative="nipy_spectral and nipy_spectral_r",
                 obj_type="colormap"
                 )
+        elif key in ["Vega10", "Vega10_r", "Vega20", "Vega20_r", "Vega20b",
+                     "Vega20b_r", "Vega20c", "Vega20c_r"]:
+            warn_deprecated(
+                "2.0",
+                name=key,
+                alternative="tab" + key[4:],
+                obj_type="colormap"
+                )
+
         return super(_deprecation_datad, self).__getitem__(key)
 
 
@@ -1465,7 +1474,12 @@ datad['Set1'] = {'listed': _Set1_data}
 datad['Set2'] = {'listed': _Set2_data}
 datad['Set3'] = {'listed': _Set3_data}
 
-datad['Vega10'] = {'listed': _Vega10_data}
-datad['Vega20'] = {'listed': _Vega20_data}
-datad['Vega20b'] = {'listed': _Vega20b_data}
-datad['Vega20c'] = {'listed': _Vega20c_data}
+datad['tab10'] = {'listed': _tab10_data}
+datad['tab20'] = {'listed': _tab20_data}
+datad['tab20b'] = {'listed': _tab20b_data}
+datad['tab20c'] = {'listed': _tab20c_data}
+
+datad['Vega10'] = {'listed': _tab10_data}
+datad['Vega20'] = {'listed': _tab20_data}
+datad['Vega20b'] = {'listed': _tab20b_data}
+datad['Vega20c'] = {'listed': _tab20c_data}
diff --git a/lib/matplotlib/_version.py b/lib/matplotlib/_version.py
index c13cbc2..6679d44 100644
--- a/lib/matplotlib/_version.py
+++ b/lib/matplotlib/_version.py
@@ -20,8 +20,8 @@ def get_keywords():
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (tag: v2.0.0)"
-    git_full = "1bfc7551f32f7b42ba50620a837f03e51d5b7c77"
+    git_refnames = " (tag: v2.0.2)"
+    git_full = "e175a41cb81880dbc553d9140e6ae5717457afa8"
     keywords = {"refnames": git_refnames, "full": git_full}
     return keywords
 
diff --git a/lib/matplotlib/afm.py b/lib/matplotlib/afm.py
index 212d6eb..45549e3 100644
--- a/lib/matplotlib/afm.py
+++ b/lib/matplotlib/afm.py
@@ -57,12 +57,12 @@ from ._mathtext_data import uni2type1
 def _to_int(x):
     return int(float(x))
 
+
 _to_float = float
-if six.PY3:
-    def _to_str(x):
-        return x.decode('utf8')
-else:
-    _to_str = str
+
+
+def _to_str(x):
+    return x.decode('utf8')
 
 
 def _to_list_of_ints(s):
diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py
index b28dfb9..dc0907c 100644
--- a/lib/matplotlib/animation.py
+++ b/lib/matplotlib/animation.py
@@ -23,6 +23,7 @@ from __future__ import (absolute_import, division, print_function,
 import six
 from six.moves import xrange, zip
 
+import numpy as np
 import os
 import platform
 import sys
@@ -61,9 +62,38 @@ else:
 
 
 def adjusted_figsize(w, h, dpi, n):
+    '''Compute figure size so that pixels are a multiple of n
+
+    Parameters
+    ----------
+    w, h : float
+        Size in inches
+
+    dpi : float
+        The dpi
+
+    n : int
+        The target multiple
+
+    Returns
+    -------
+    wnew, hnew : float
+        The new figure size in inches.
+    '''
+
+    # this maybe simplified if / when we adopt consistent rounding for
+    # pixel size across the whole library
+    def correct_roundoff(x, dpi, n):
+        if int(x*dpi) % n != 0:
+            if int(np.nextafter(x, np.inf)*dpi) % n == 0:
+                x = np.nextafter(x, np.inf)
+            elif int(np.nextafter(x, -np.inf)*dpi) % n == 0:
+                x = np.nextafter(x, -np.inf)
+        return x
+
     wnew = int(w * dpi / n) * n / dpi
     hnew = int(h * dpi / n) * n / dpi
-    return wnew, hnew
+    return (correct_roundoff(wnew, dpi, n), correct_roundoff(hnew, dpi, n))
 
 
 # A registry for available MovieWriter classes
@@ -214,8 +244,11 @@ class MovieWriter(object):
                 verbose.report('figure size (inches) has been adjusted '
                                'from %s x %s to %s x %s' % (wo, ho, w, h),
                                level='helpful')
+        else:
+            w, h = self.fig.get_size_inches()
         verbose.report('frame size in pixels is %s x %s' % self.frame_size,
                        level='debug')
+        return w, h
 
     def setup(self, fig, outfile, dpi):
         '''
@@ -235,7 +268,7 @@ class MovieWriter(object):
         self.outfile = outfile
         self.fig = fig
         self.dpi = dpi
-        self._adjust_frame_size()
+        self._w, self._h = self._adjust_frame_size()
 
         # Run here so that grab_frame() can write the data to a pipe. This
         # eliminates the need for temp files.
@@ -285,6 +318,10 @@ class MovieWriter(object):
         verbose.report('MovieWriter.grab_frame: Grabbing frame.',
                        level='debug')
         try:
+            # re-adjust the figure size in case it has been changed by the
+            # user.  We must ensure that every frame is the same size or
+            # the movie will not save correctly.
+            self.fig.set_size_inches(self._w, self._h)
             # Tell the figure to save its data to the sink, using the
             # frame format and dpi.
             self.fig.savefig(self._frame_sink(), format=self.frame_format,
@@ -334,16 +371,21 @@ class MovieWriter(object):
         if not bin_path:
             return False
         try:
-            p = subprocess.Popen(bin_path,
-                             shell=False,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE,
-                             creationflags=subprocess_creation_flags)
-            p.communicate()
-            return True
+            p = subprocess.Popen(
+                bin_path,
+                shell=False,
+                stdout=subprocess.PIPE,
+                stderr=subprocess.PIPE,
+                creationflags=subprocess_creation_flags)
+            return cls._handle_subprocess(p)
         except OSError:
             return False
 
+    @classmethod
+    def _handle_subprocess(cls, process):
+        process.communicate()
+        return True
+
 
 class FileMovieWriter(MovieWriter):
     '''`MovieWriter` for writing to individual files and stitching at the end.
@@ -514,10 +556,18 @@ class FFMpegBase(object):
 
         return args + ['-y', self.outfile]
 
+    @classmethod
+    def _handle_subprocess(cls, process):
+        _, err = process.communicate()
+        # Ubuntu 12.04 ships a broken ffmpeg binary which we shouldn't use
+        if 'Libav' in err.decode():
+            return False
+        return True
+
 
 # Combine FFMpeg options with pipe-based writing
 @writers.register('ffmpeg')
-class FFMpegWriter(MovieWriter, FFMpegBase):
+class FFMpegWriter(FFMpegBase, MovieWriter):
     '''Pipe-based ffmpeg writer.
 
     Frames are streamed directly to ffmpeg via a pipe and written in a single
@@ -538,7 +588,7 @@ class FFMpegWriter(MovieWriter, FFMpegBase):
 
 # Combine FFMpeg options with temp file-based writing
 @writers.register('ffmpeg_file')
-class FFMpegFileWriter(FileMovieWriter, FFMpegBase):
+class FFMpegFileWriter(FFMpegBase, FileMovieWriter):
     '''File-based ffmpeg writer.
 
     Frames are written to temporary files on disk and then stitched
diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py
index aea3240..dfcb0a6 100644
--- a/lib/matplotlib/axes/_axes.py
+++ b/lib/matplotlib/axes/_axes.py
@@ -1104,9 +1104,9 @@ or tuple of floats
         arrival times of people to a business on each day of the month or the
         date of hurricanes each year of the last century.
 
-        *orientation* : [ 'horizonal' | 'vertical' ]
-          'horizonal' : the lines will be vertical and arranged in rows
-          "vertical' : lines will be horizontal and arranged in columns
+        *orientation* : [ 'horizontal' | 'vertical' ]
+          'horizontal' : the lines will be vertical and arranged in rows
+          'vertical' : lines will be horizontal and arranged in columns
 
         *lineoffsets* :
           A float or array-like containing floats.
@@ -2112,12 +2112,6 @@ or tuple of floats
 
         args = zip(left, bottom, width, height, color, edgecolor, linewidth)
         for l, b, w, h, c, e, lw in args:
-            if h < 0:
-                b += h
-                h = abs(h)
-            if w < 0:
-                l += w
-                w = abs(w)
             r = mpatches.Rectangle(
                 xy=(l, b), width=w, height=h,
                 facecolor=c,
@@ -2484,92 +2478,95 @@ or tuple of floats
         Plot a pie chart.
 
         Make a pie chart of array *x*.  The fractional area of each
-        wedge is given by x/sum(x).  If sum(x) <= 1, then the values
-        of x give the fractional area directly and the array will not
-        be normalized.  The wedges are plotted counterclockwise,
-        by default starting from the x-axis.
+        wedge is given by ``x/sum(x)``.  If ``sum(x) <= 1``, then the
+        values of x give the fractional area directly and the array
+        will not be normalized.  The wedges are plotted
+        counterclockwise, by default starting from the x-axis.
 
-        Keyword arguments:
+        Parameters
+        ----------
+        x : array-like
+            The input array used to make the pie chart.
 
-          *explode*: [ *None* | len(x) sequence ]
+        explode : array-like, optional, default: None
             If not *None*, is a ``len(x)`` array which specifies the
             fraction of the radius with which to offset each wedge.
 
-          *colors*: [ *None* | color sequence ]
+        labels : list, optional, default: None
+            A sequence of strings providing the labels for each wedge
+
+        colors : array-like, optional, default: None
             A sequence of matplotlib color args through which the pie chart
             will cycle.  If `None`, will use the colors in the currently
             active cycle.
 
-          *labels*: [ *None* | len(x) sequence of strings ]
-            A sequence of strings providing the labels for each wedge
-
-          *autopct*: [ *None* | format string | format function ]
+        autopct : None (default), string, or function, optional
             If not *None*, is a string or function used to label the wedges
             with their numeric value.  The label will be placed inside the
             wedge.  If it is a format string, the label will be ``fmt%pct``.
             If it is a function, it will be called.
 
-          *pctdistance*: scalar
+        pctdistance : float, optional, default: 0.6
             The ratio between the center of each pie slice and the
             start of the text generated by *autopct*.  Ignored if
-            *autopct* is *None*; default is 0.6.
-
-          *labeldistance*: scalar
-            The radial distance at which the pie labels are drawn
+            *autopct* is *None*.
 
-          *shadow*: [ *False* | *True* ]
+        shadow : bool, optional, default: False
             Draw a shadow beneath the pie.
 
-          *startangle*: [ *None* | Offset angle ]
+        labeldistance : float, optional, default: 1.1
+            The radial distance at which the pie labels are drawn
+
+        startangle : float, optional, default: None
             If not *None*, rotates the start of the pie chart by *angle*
             degrees counterclockwise from the x-axis.
 
-          *radius*: [ *None* | scalar ]
-          The radius of the pie, if *radius* is *None* it will be set to 1.
+        radius : float, optional, default: None
+            The radius of the pie, if *radius* is *None* it will be set to 1.
 
-          *counterclock*: [ *False* | *True* ]
+        counterclock : bool, optional, default: True
             Specify fractions direction, clockwise or counterclockwise.
 
-          *wedgeprops*: [ *None* | dict of key value pairs ]
+        wedgeprops : dict, optional, default: None
             Dict of arguments passed to the wedge objects making the pie.
-            For example, you can pass in wedgeprops = { 'linewidth' : 3 }
+            For example, you can pass in``wedgeprops = {'linewidth': 3}``
             to set the width of the wedge border lines equal to 3.
             For more details, look at the doc/arguments of the wedge object.
-            By default `clip_on=False`.
+            By default ``clip_on=False``.
 
-          *textprops*: [ *None* | dict of key value pairs ]
+        textprops : dict, optional, default: None
             Dict of arguments to pass to the text objects.
 
-          *center*: [ (0,0) | sequence of 2 scalars ]
-          Center position of the chart.
+        center :  list of float, optional, default: (0, 0)
+            Center position of the chart. Takes value (0, 0) or is a
+            sequence of 2 scalars.
 
-          *frame*: [ *False* | *True* ]
-            Plot axes frame with the chart.
-
-        The pie chart will probably look best if the figure and axes are
-        square, or the Axes aspect is equal.  e.g.::
+        frame : bool, optional, default: False
+            Plot axes frame with the chart if true.
 
-          figure(figsize=(8,8))
-          ax = axes([0.1, 0.1, 0.8, 0.8])
+        Returns
+        -------
+        patches : list
+            A sequence of :class:`matplotlib.patches.Wedge` instances
 
-        or::
+        texts : list
+            A is a list of the label :class:`matplotlib.text.Text` instances.
 
-          axes(aspect=1)
+        autotexts : list
+            A is a list of :class:`~matplotlib.text.Text` instances for the
+            numeric labels. Is returned only if parameter *autopct* is
+            not *None*.
 
-        Return value:
-          If *autopct* is *None*, return the tuple (*patches*, *texts*):
+        Notes
+        -----
+        The pie chart will probably look best if the figure and axes are
+        square, or the Axes aspect is equal.
 
-            - *patches* is a sequence of
-              :class:`matplotlib.patches.Wedge` instances
+        Examples
+        --------
+        .. plot:: mpl_examples/pie_and_polar_charts/pie_demo_features.py
 
-            - *texts* is a list of the label
-              :class:`matplotlib.text.Text` instances.
 
-          If *autopct* is not *None*, return the tuple (*patches*,
-          *texts*, *autotexts*), where *patches* and *texts* are as
-          above, and *autotexts* is a list of
-          :class:`~matplotlib.text.Text` instances for the numeric
-          labels.
         """
 
         x = np.asarray(x).astype(np.float32)
@@ -2627,9 +2624,9 @@ or tuple of floats
             y += expl * math.sin(thetam)
 
             w = mpatches.Wedge((x, y), radius, 360. * min(theta1, theta2),
-                            360. * max(theta1, theta2),
-                            facecolor=get_next_color(),
-                            **wedgeprops)
+                               360. * max(theta1, theta2),
+                               facecolor=get_next_color(),
+                               **wedgeprops)
             slices.append(w)
             self.add_patch(w)
             w.set_label(label)
@@ -2680,9 +2677,9 @@ or tuple of floats
             self.set_frame_on(False)
 
             self.set_xlim((-1.25 + center[0],
-                            1.25 + center[0]))
+                           1.25 + center[0]))
             self.set_ylim((-1.25 + center[1],
-                            1.25 + center[1]))
+                           1.25 + center[1]))
             self.set_xticks([])
             self.set_yticks([])
 
@@ -2711,11 +2708,11 @@ or tuple of floats
 
         Parameters
         ----------
-        x : scalar
-        y : scalar
+        x : scalar or array-like
+        y : scalar or array-like
 
-        xerr/yerr : scalar or array-like, shape(n,1) or shape(2,n), optional
-            If a scalar number, len(N) array-like object, or an Nx1
+        xerr/yerr : scalar or array-like, shape(N,) or shape(2,N), optional
+            If a scalar number, len(N) array-like object, or a N-element
             array-like object, errorbars are drawn at +/-value relative
             to the data. Default is None.
 
@@ -2798,6 +2795,9 @@ or tuple of floats
         .. plot:: mpl_examples/statistics/errorbar_demo.py
         """
         kwargs = cbook.normalize_kwargs(kwargs, _alias_map)
+        # anything that comes in as 'None', drop so the default thing
+        # happens down stream
+        kwargs = {k: v for k, v in kwargs.items() if v is not None}
         kwargs.setdefault('zorder', 2)
 
         if errorevery < 1:
@@ -2823,6 +2823,9 @@ or tuple of floats
         fmt_style_kwargs = {k: v for k, v in
                             zip(('linestyle', 'marker', 'color'),
                                 _process_plot_format(fmt)) if v is not None}
+        if fmt == 'none':
+            # Remove alpha=0 color that _process_plot_format returns
+            fmt_style_kwargs.pop('color')
 
         if ('color' in kwargs or 'color' in fmt_style_kwargs or
                 ecolor is not None):
@@ -3129,9 +3132,12 @@ or tuple of floats
             everything is drawn horizontally.
 
         whis : float, sequence, or string (default = 1.5)
-            As a float, determines the reach of the whiskers past the
-            first and third quartiles (e.g., Q3 + whis*IQR,
-            IQR = interquartile range, Q3-Q1). Beyond the whiskers, data
+            As a float, determines the reach of the whiskers to the beyond the
+            first and third quartiles. In other words, where IQR is the
+            interquartile range (`Q3-Q1`), the upper whisker will extend to
+            last datum less than `Q3 + whis*IQR`). Similarly, the lower whisker
+            will extend to the first datum greater than `Q1 - whis*IQR`.
+            Beyond the whiskers, data
             are considered outliers and are plotted as individual
             points. Set this to an unreasonably high value to force the
             whiskers to show the min and max values. Alternatively, set
@@ -6056,6 +6062,10 @@ or tuple of floats
         .. plot:: mpl_examples/statistics/histogram_demo_features.py
 
         """
+        # Avoid shadowing the builtin.
+        bin_range = range
+        del range
+
         def _normalize_input(inp, ename='input'):
             """Normalize 1 or 2d input into list of np.ndarray or
             a single 2D np.ndarray.
@@ -6100,13 +6110,6 @@ or tuple of floats
         if bins is None:
             bins = rcParams['hist.bins']
 
-        # xrange becomes range after 2to3
-        bin_range = range
-        range = __builtins__["range"]
-
-        # NOTE: the range keyword overwrites the built-in func range !!!
-        #       needs to be fixed in numpy                           !!!
-
         # Validate string inputs here so we don't have to clutter
         # subsequent code.
         if histtype not in ['bar', 'barstacked', 'step', 'stepfilled']:
@@ -6453,7 +6456,20 @@ or tuple of floats
 
         Other parameters
         ----------------
-        kwargs : :meth:`pcolorfast` properties.
+        cmap : {Colormap, string}, optional
+            A :class:`matplotlib.colors.Colormap` instance.  If not set, use rc
+            settings.
+
+        norm : Normalize, optional
+            A :class:`matplotlib.colors.Normalize` instance is used to
+            scale luminance data to ``[0, 1]``. If not set, defaults to
+            ``Normalize()``.
+
+        vmin/vmax : {None, scalar}, optional
+            Arguments passed to the `Normalize` instance.
+
+        alpha : ``0 <= scalar <= 1`` or ``None``, optional
+            The alpha blending value.
 
         See also
         --------
@@ -6472,10 +6488,7 @@ or tuple of floats
         .. plot:: mpl_examples/pylab_examples/hist2d_demo.py
         """
 
-        # xrange becomes range after 2to3
-        bin_range = range
-        range = __builtins__["range"]
-        h, xedges, yedges = np.histogram2d(x, y, bins=bins, range=bin_range,
+        h, xedges, yedges = np.histogram2d(x, y, bins=bins, range=range,
                                            normed=normed, weights=weights)
 
         if cmin is not None:
@@ -6494,7 +6507,7 @@ or tuple of floats
     def psd(self, x, NFFT=None, Fs=None, Fc=None, detrend=None,
             window=None, noverlap=None, pad_to=None,
             sides=None, scale_by_freq=None, return_line=None, **kwargs):
-        """
+        r"""
         Plot the power spectral density.
 
         Call signature::
diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py
index 263119a..89835ef 100644
--- a/lib/matplotlib/axes/_base.py
+++ b/lib/matplotlib/axes/_base.py
@@ -731,10 +731,12 @@ class _AxesBase(martist.Artist):
             place axis elements in different locations.
 
         """
+        labels_align = matplotlib.rcParams["xtick.alignment"]
+
         return (self.get_xaxis_transform(which='tick1') +
                 mtransforms.ScaledTranslation(0, -1 * pad_points / 72.0,
                                               self.figure.dpi_scale_trans),
-                "top", "center")
+                "top", labels_align)
 
     def get_xaxis_text2_transform(self, pad_points):
         """
@@ -757,10 +759,11 @@ class _AxesBase(martist.Artist):
             place axis elements in different locations.
 
         """
+        labels_align = matplotlib.rcParams["xtick.alignment"]
         return (self.get_xaxis_transform(which='tick2') +
                 mtransforms.ScaledTranslation(0, pad_points / 72.0,
                                               self.figure.dpi_scale_trans),
-                "bottom", "center")
+                "bottom", labels_align)
 
     def get_yaxis_transform(self, which='grid'):
         """
@@ -808,10 +811,11 @@ class _AxesBase(martist.Artist):
             place axis elements in different locations.
 
         """
+        labels_align = matplotlib.rcParams["ytick.alignment"]
         return (self.get_yaxis_transform(which='tick1') +
                 mtransforms.ScaledTranslation(-1 * pad_points / 72.0, 0,
                                               self.figure.dpi_scale_trans),
-                "center_baseline", "right")
+                labels_align, "right")
 
     def get_yaxis_text2_transform(self, pad_points):
         """
@@ -834,10 +838,12 @@ class _AxesBase(martist.Artist):
             place axis elements in different locations.
 
         """
+        labels_align = matplotlib.rcParams["ytick.alignment"]
+
         return (self.get_yaxis_transform(which='tick2') +
                 mtransforms.ScaledTranslation(pad_points / 72.0, 0,
                                               self.figure.dpi_scale_trans),
-                "center_baseline", "left")
+                labels_align, "left")
 
     def _update_transScale(self):
         self.transScale.set(
@@ -2278,7 +2284,18 @@ class _AxesBase(martist.Artist):
             # ignore non-finite data limits if good limits exist
             finite_dl = [d for d in dl if np.isfinite(d).all()]
             if len(finite_dl):
+                # if finite limits exist for atleast one axis (and the
+                # other is infinite), restore the finite limits
+                x_finite = [d for d in dl
+                            if (np.isfinite(d.intervalx).all() and
+                                (d not in finite_dl))]
+                y_finite = [d for d in dl
+                            if (np.isfinite(d.intervaly).all() and
+                                (d not in finite_dl))]
+
                 dl = finite_dl
+                dl.extend(x_finite)
+                dl.extend(y_finite)
 
             bb = mtransforms.BboxBase.union(dl)
             x0, x1 = getattr(bb, interval)
@@ -2560,13 +2577,10 @@ class _AxesBase(martist.Artist):
                 raise ValueError("scilimits must be a sequence of 2 integers")
         if style[:3] == 'sci':
             sb = True
-        elif style in ['plain', 'comma']:
+        elif style == 'plain':
             sb = False
-            if style == 'plain':
-                cb = False
-            else:
-                cb = True
-                raise NotImplementedError("comma style remains to be added")
+        elif style == 'comma':
+            raise NotImplementedError("comma style remains to be added")
         elif style == '':
             sb = None
         else:
@@ -3371,7 +3385,7 @@ class _AxesBase(martist.Artist):
             elif scale == 'symlog':
                 s = ax._scale
                 ax.set_minor_locator(
-                    mticker.SymmetricalLogLocator(s.base, s.subs))
+                    mticker.SymmetricalLogLocator(s._transform, s.subs))
             else:
                 ax.set_minor_locator(mticker.AutoMinorLocator())
 
diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py
index cbae01d..d8cf3e0 100644
--- a/lib/matplotlib/axis.py
+++ b/lib/matplotlib/axis.py
@@ -2021,7 +2021,10 @@ class XAxis(Axis):
         # There is a heuristic here that the aspect ratio of tick text
         # is no more than 3:1
         size = tick.label1.get_size() * 3
-        return int(np.floor(length / size))
+        if size > 0:
+            return int(np.floor(length / size))
+        else:
+            return 2**31 - 1
 
 
 class YAxis(Axis):
@@ -2354,4 +2357,7 @@ class YAxis(Axis):
         tick = self._get_tick(True)
         # Having a spacing of at least 2 just looks good.
         size = tick.label1.get_size() * 2.0
-        return int(np.floor(length / size))
+        if size > 0:
+            return int(np.floor(length / size))
+        else:
+            return 2**31 - 1
diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py
index 40c7042..bc5257b 100644
--- a/lib/matplotlib/backend_bases.py
+++ b/lib/matplotlib/backend_bases.py
@@ -817,6 +817,8 @@ class GraphicsContextBase(object):
         self._linewidth = gc._linewidth
         self._rgb = gc._rgb
         self._hatch = gc._hatch
+        self._hatch_color = gc._hatch_color
+        self._hatch_linewidth = gc._hatch_linewidth
         self._url = gc._url
         self._gid = gc._gid
         self._snap = gc._snap
@@ -1111,6 +1113,12 @@ class GraphicsContextBase(object):
         """
         return self._hatch_color
 
+    def set_hatch_color(self, hatch_color):
+        """
+        sets the color to use for hatching.
+        """
+        self._hatch_color = hatch_color
+
     def get_hatch_linewidth(self):
         """
         Gets the linewidth to use for hatching.
@@ -2149,7 +2157,7 @@ class FigureCanvasBase(object):
             dpi = rcParams['savefig.dpi']
 
         if dpi == 'figure':
-            dpi = self.figure.dpi
+            dpi = getattr(self.figure, '_original_dpi', self.figure.dpi)
 
         if facecolor is None:
             facecolor = rcParams['savefig.facecolor']
@@ -2285,7 +2293,7 @@ class FigureCanvasBase(object):
         a default filename.
         """
         default_basename = self.get_window_title() or 'image'
-        default_basename = default_basename.lower().replace(' ', '_')
+        default_basename = default_basename.replace(' ', '_')
         default_filetype = self.get_default_filetype()
         default_filename = default_basename + '.' + default_filetype
 
diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py
index 015f71a..2b10f48 100644
--- a/lib/matplotlib/backends/backend_pdf.py
+++ b/lib/matplotlib/backends/backend_pdf.py
@@ -1003,8 +1003,9 @@ end"""
             for c in characters:
                 ccode = c
                 gind = font.get_char_index(ccode)
-                glyph = font.load_char(ccode, flags=LOAD_NO_HINTING)
-                widths.append((ccode, glyph.horiAdvance / 6))
+                glyph = font.load_char(ccode,
+                                       flags=LOAD_NO_SCALE | LOAD_NO_HINTING)
+                widths.append((ccode, cvt(glyph.horiAdvance)))
                 if ccode < 65536:
                     cid_to_gid_map[ccode] = unichr(gind)
                 max_ccode = max(ccode, max_ccode)
@@ -2210,14 +2211,14 @@ class GraphicsContextPdf(GraphicsContextBase):
         name = self.file.alphaState(effective_alphas)
         return [name, Op.setgstate]
 
-    def hatch_cmd(self, hatch):
+    def hatch_cmd(self, hatch, hatch_color):
         if not hatch:
             if self._fillcolor is not None:
                 return self.fillcolor_cmd(self._fillcolor)
             else:
                 return [Name('DeviceRGB'), Op.setcolorspace_nonstroke]
         else:
-            hatch_style = (self._hatch_color, self._fillcolor, hatch)
+            hatch_style = (hatch_color, self._fillcolor, hatch)
             name = self.file.hatchPattern(hatch_style)
             return [Name('Pattern'), Op.setcolorspace_nonstroke,
                     name, Op.setcolor_nonstroke]
@@ -2281,7 +2282,8 @@ class GraphicsContextPdf(GraphicsContextBase):
         (('_linewidth',), linewidth_cmd),
         (('_dashes',), dash_cmd),
         (('_rgb',), rgb_cmd),
-        (('_hatch',), hatch_cmd),  # must come after fillcolor and rgb
+        # must come after fillcolor and rgb
+        (('_hatch', '_hatch_color'), hatch_cmd),
         )
 
     # TODO: _linestyle
@@ -2312,7 +2314,7 @@ class GraphicsContextPdf(GraphicsContextBase):
                     break
 
             # Need to update hatching if we also updated fillcolor
-            if params == ('_hatch',) and fill_performed:
+            if params == ('_hatch', '_hatch_color') and fill_performed:
                 different = True
 
             if different:
diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py
index 8f5e709..682724a 100644
--- a/lib/matplotlib/backends/backend_pgf.py
+++ b/lib/matplotlib/backends/backend_pgf.py
@@ -191,10 +191,9 @@ def make_pdf_to_png_converter():
     # pick converter
     if "pdftocairo" in tools_available:
         def cairo_convert(pdffile, pngfile, dpi):
-            cmd = [str("pdftocairo"), "-singlefile", "-png",
-                   "-r %d" % dpi, pdffile, os.path.splitext(pngfile)[0]]
-            # for some reason this doesn't work without shell
-            check_output(cmd, shell=True, stderr=subprocess.STDOUT)
+            cmd = [str("pdftocairo"), "-singlefile", "-png", "-r", "%d" % dpi,
+                   pdffile, os.path.splitext(pngfile)[0]]
+            check_output(cmd, stderr=subprocess.STDOUT)
         return cairo_convert
     elif "gs" in tools_available:
         def gs_convert(pdffile, pngfile, dpi):
diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py
index 2371371..1fa7f9f 100644
--- a/lib/matplotlib/backends/backend_qt5.py
+++ b/lib/matplotlib/backends/backend_qt5.py
@@ -130,9 +130,17 @@ def _create_qApp():
         app = QtWidgets.QApplication.instance()
         if app is None:
             # check for DISPLAY env variable on X11 build of Qt
-            if hasattr(QtGui, "QX11Info"):
+            if is_pyqt5():
+                try:
+                    from PyQt5 import QtX11Extras
+                    is_x11_build = True
+                except ImportError:
+                    is_x11_build = False
+            else:
+                is_x11_build = hasattr(QtGui, "QX11Info")
+            if is_x11_build:
                 display = os.environ.get('DISPLAY')
-                if display is None or not re.search(':\d', display):
+                if display is None or not re.search(r':\d', display):
                     raise RuntimeError('Invalid DISPLAY variable')
 
             qApp = QtWidgets.QApplication([str(" ")])
@@ -141,7 +149,11 @@ def _create_qApp():
             qApp = app
 
     if is_pyqt5():
-        qApp.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
+        try:
+            qApp.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps)
+            qApp.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
+        except AttributeError:
+            pass
 
 
 class Show(ShowBase):
@@ -151,6 +163,7 @@ class Show(ShowBase):
         global qApp
         qApp.exec_()
 
+
 show = Show()
 
 
@@ -194,16 +207,6 @@ class TimerQT(TimerBase):
         self._timer.timeout.connect(self._on_timer)
         self._timer_set_interval()
 
-    def __del__(self):
-        # Probably not necessary in practice, but is good behavior to
-        # disconnect
-        try:
-            TimerBase.__del__(self)
-            self._timer.timeout.disconnect(self._on_timer)
-        except RuntimeError:
-            # Timer C++ object already deleted
-            pass
-
     def _timer_set_single_shot(self):
         self._timer.setSingleShot(self._single)
 
@@ -263,10 +266,20 @@ class FigureCanvasQT(QtWidgets.QWidget, FigureCanvasBase):
         FigureCanvasBase.leave_notify_event(self, guiEvent=event)
 
     def mouseEventCoords(self, pos):
-        x = pos.x() * self._dpi_ratio
+        """Calculate mouse coordinates in physical pixels
+
+        Qt5 use logical pixels, but the figure is scaled to physical
+        pixels for rendering.   Transform to physical pixels so that
+        all of the down-stream transforms work as expected.
+
+        Also, the origin is different and needs to be corrected.
+
+        """
+        dpi_ratio = self._dpi_ratio
+        x = pos.x()
         # flip y so y=0 is bottom of canvas
-        y = self.figure.bbox.height - pos.y() * self._dpi_ratio
-        return x, y
+        y = self.figure.bbox.height / dpi_ratio - pos.y()
+        return x * dpi_ratio, y * dpi_ratio
 
     def mousePressEvent(self, event):
         x, y = self.mouseEventCoords(event.pos())
@@ -574,7 +587,10 @@ class NavigationToolbar2QT(NavigationToolbar2, QtWidgets.QToolBar):
     def _icon(self, name):
         if is_pyqt5():
             name = name.replace('.png', '_large.png')
-        return QtGui.QIcon(os.path.join(self.basedir, name))
+        pm = QtGui.QPixmap(os.path.join(self.basedir, name))
+        if hasattr(pm, 'setDevicePixelRatio'):
+            pm.setDevicePixelRatio(self.canvas._dpi_ratio)
+        return QtGui.QIcon(pm)
 
     def _init_toolbar(self):
         self.basedir = os.path.join(matplotlib.rcParams['datapath'], 'images')
@@ -584,7 +600,7 @@ class NavigationToolbar2QT(NavigationToolbar2, QtWidgets.QToolBar):
                 self.addSeparator()
             else:
                 a = self.addAction(self._icon(image_file + '.png'),
-                                         text, getattr(self, callback))
+                                   text, getattr(self, callback))
                 self._actions[callback] = a
                 if callback in ['zoom', 'pan']:
                     a.setCheckable(True)
@@ -606,7 +622,7 @@ class NavigationToolbar2QT(NavigationToolbar2, QtWidgets.QToolBar):
                     QtCore.Qt.AlignRight | QtCore.Qt.AlignTop)
             self.locLabel.setSizePolicy(
                 QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
-                                  QtWidgets.QSizePolicy.Ignored))
+                                      QtWidgets.QSizePolicy.Ignored))
             labelAction = self.addWidget(self.locLabel)
             labelAction.setVisible(True)
 
diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py
index 4ab049a..4aee897 100644
--- a/lib/matplotlib/backends/backend_wx.py
+++ b/lib/matplotlib/backends/backend_wx.py
@@ -694,6 +694,9 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         self.Bind(wx.EVT_MIDDLE_DCLICK, self._onMiddleButtonDClick)
         self.Bind(wx.EVT_MIDDLE_UP, self._onMiddleButtonUp)
 
+        self.Bind(wx.EVT_MOUSE_CAPTURE_CHANGED, self._onCaptureLost)
+        self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, self._onCaptureLost)
+
         if wx.VERSION_STRING < "2.9":
             # only needed in 2.8 to reduce flicker
             self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
@@ -1031,12 +1034,23 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         evt.Skip()
         FigureCanvasBase.key_release_event(self, key, guiEvent=evt)
 
+    def _set_capture(self, capture=True):
+        """control wx mouse capture """
+        if self.HasCapture():
+            self.ReleaseMouse()
+        if capture:
+            self.CaptureMouse()
+
+    def _onCaptureLost(self, evt):
+        """Capture changed or lost"""
+        self._set_capture(False)
+
     def _onRightButtonDown(self, evt):
         """Start measuring on an axis."""
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 3, guiEvent=evt)
 
     def _onRightButtonDClick(self, evt):
@@ -1044,7 +1058,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 3,
                                             dblclick=True, guiEvent=evt)
 
@@ -1053,8 +1067,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        if self.HasCapture():
-            self.ReleaseMouse()
+        self._set_capture(False)
         FigureCanvasBase.button_release_event(self, x, y, 3, guiEvent=evt)
 
     def _onLeftButtonDown(self, evt):
@@ -1062,7 +1075,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 1, guiEvent=evt)
 
     def _onLeftButtonDClick(self, evt):
@@ -1070,7 +1083,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 1,
                                             dblclick=True, guiEvent=evt)
 
@@ -1080,8 +1093,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         y = self.figure.bbox.height - evt.GetY()
         # print 'release button', 1
         evt.Skip()
-        if self.HasCapture():
-            self.ReleaseMouse()
+        self._set_capture(False)
         FigureCanvasBase.button_release_event(self, x, y, 1, guiEvent=evt)
 
     # Add middle button events
@@ -1090,7 +1102,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 2, guiEvent=evt)
 
     def _onMiddleButtonDClick(self, evt):
@@ -1098,7 +1110,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         x = evt.GetX()
         y = self.figure.bbox.height - evt.GetY()
         evt.Skip()
-        self.CaptureMouse()
+        self._set_capture(True)
         FigureCanvasBase.button_press_event(self, x, y, 2,
                                             dblclick=True, guiEvent=evt)
 
@@ -1108,8 +1120,7 @@ class FigureCanvasWx(FigureCanvasBase, wx.Panel):
         y = self.figure.bbox.height - evt.GetY()
         # print 'release button', 1
         evt.Skip()
-        if self.HasCapture():
-            self.ReleaseMouse()
+        self._set_capture(False)
         FigureCanvasBase.button_release_event(self, x, y, 2, guiEvent=evt)
 
     def _onMouseWheel(self, evt):
diff --git a/lib/matplotlib/backends/qt_compat.py b/lib/matplotlib/backends/qt_compat.py
index 1a4db71..0859084 100644
--- a/lib/matplotlib/backends/qt_compat.py
+++ b/lib/matplotlib/backends/qt_compat.py
@@ -70,6 +70,7 @@ if (QT_API_ENV is not None) and QT_API is None:
         # compatible use the env variable.
         QT_API = ETS[QT_API_ENV][0]
 
+_fallback_to_qt4 = False
 if QT_API is None:
     # No ETS environment or incompatible so use rcParams.
     if rcParams['backend'] == 'Qt5Agg':
@@ -81,7 +82,7 @@ if QT_API is None:
         # bindings is imported, but we still got here because a Qt
         # related file was imported. This is allowed, fall back to Qt5
         # using which ever binding the rparams ask for.
-
+        _fallback_to_qt4 = True
         QT_API = rcParams['backend.qt5']
 
 # We will define an appropriate wrapper for the differing versions
@@ -127,9 +128,12 @@ if _sip_imported:
             from PyQt5 import QtCore, QtGui, QtWidgets
             _getSaveFileName = QtWidgets.QFileDialog.getSaveFileName
         except ImportError:
-            # fell through, tried PyQt5, failed fall back to PyQt4
-            QT_API = rcParams['backend.qt4']
-            QT_RC_MAJOR_VERSION = 4
+            if _fallback_to_qt4:
+                # fell through, tried PyQt5, failed fall back to PyQt4
+                QT_API = rcParams['backend.qt4']
+                QT_RC_MAJOR_VERSION = 4
+            else:
+                raise
 
     # needs to be if so we can re-test the value of QT_API which may
     # have been changed in the above if block
diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py
index 1a6c7d2..d472b98 100644
--- a/lib/matplotlib/cbook.py
+++ b/lib/matplotlib/cbook.py
@@ -481,13 +481,18 @@ class CallbackRegistry(object):
         self._cid = 0
         self._func_cid_map = {}
 
+    # In general, callbacks may not be pickled; thus, we simply recreate an
+    # empty dictionary at unpickling.  In order to ensure that `__setstate__`
+    # (which just defers to `__init__`) is called, `__getstate__` must
+    # return a truthy value (for pickle protocol>=3, i.e. Py3, the
+    # *actual* behavior is that `__setstate__` will be called as long as
+    # `__getstate__` does not return `None`, but this is undocumented -- see
+    # http://bugs.python.org/issue12290).
+
     def __getstate__(self):
-        # We cannot currently pickle the callables in the registry, so
-        # return an empty dictionary.
-        return {}
+        return True
 
     def __setstate__(self, state):
-        # re-initialise an empty callback registry
         self.__init__()
 
     def connect(self, s, func):
@@ -1891,9 +1896,12 @@ def boxplot_stats(X, whis=1.5, bootstrap=None, labels=None,
         fewer dimensions.
 
     whis : float, string, or sequence (default = 1.5)
-        As a float, determines the reach of the whiskers past the first
-        and third quartiles (e.g., Q3 + whis*IQR, QR = interquartile
-        range, Q3-Q1). Beyond the whiskers, data are considered outliers
+        As a float, determines the reach of the whiskers to the beyond the
+        first and third quartiles. In other words, where IQR is the
+        interquartile range (`Q3-Q1`), the upper whisker will extend to last
+        datum less than `Q3 + whis*IQR`). Similarly, the lower whisker will
+        extend to the first datum greater than `Q1 - whis*IQR`.
+        Beyond the whiskers, data are considered outliers
         and are plotted as individual points. This can be set this to an
         ascending sequence of percentile (e.g., [5, 95]) to set the
         whiskers at specific percentiles of the data. Finally, `whis`
@@ -1957,8 +1965,8 @@ def boxplot_stats(X, whis=1.5, bootstrap=None, labels=None,
         M = len(data)
         percentiles = [2.5, 97.5]
 
-        ii = np.random.randint(M, size=(N, M))
-        bsData = x[ii]
+        bs_index = np.random.randint(M, size=(N, M))
+        bsData = data[bs_index]
         estimate = np.median(bsData, axis=1, overwrite_input=True)
 
         CI = np.percentile(estimate, percentiles)
diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py
index dbd050f..0384fa4 100644
--- a/lib/matplotlib/cm.py
+++ b/lib/matplotlib/cm.py
@@ -10,7 +10,6 @@ from __future__ import (absolute_import, division, print_function,
 import six
 
 import os
-import warnings as _warnings  # To remove once spectral is removed
 import numpy as np
 from numpy import ma
 import matplotlib as mpl
@@ -69,7 +68,8 @@ def _generate_cmap(name, lutsize):
     """Generates the requested cmap from its *name*.  The lut size is
     *lutsize*."""
 
-    spec = datad[name]
+    # Use superclass method to avoid deprecation warnings during initial load.
+    spec = dict.__getitem__(datad, name)
 
     # Generate the colormap object.
     if 'red' in spec:
@@ -81,22 +81,19 @@ def _generate_cmap(name, lutsize):
 
 LUTSIZE = mpl.rcParams['image.lut']
 
-# We silence warnings here to avoid raising the deprecation warning for
-# spectral/spectral_r when this module is imported.
-with _warnings.catch_warnings():
-    _warnings.simplefilter("ignore")
-    # Generate the reversed specifications ...
-    for cmapname in list(six.iterkeys(datad)):
-        spec = datad[cmapname]
-        spec_reversed = _reverse_cmap_spec(spec)
-        datad[cmapname + '_r'] = spec_reversed
-
-    # Precache the cmaps with ``lutsize = LUTSIZE`` ...
-
-    # Use datad.keys() to also add the reversed ones added in the section
-    # above:
-    for cmapname in six.iterkeys(datad):
-        cmap_d[cmapname] = _generate_cmap(cmapname, LUTSIZE)
+# Generate the reversed specifications ...
+for cmapname in list(six.iterkeys(datad)):
+    # Use superclass method to avoid deprecation warnings during initial load.
+    spec = dict.__getitem__(datad, cmapname)
+    spec_reversed = _reverse_cmap_spec(spec)
+    datad[cmapname + '_r'] = spec_reversed
+
+# Precache the cmaps with ``lutsize = LUTSIZE`` ...
+
+# Use datad.keys() to also add the reversed ones added in the section
+# above:
+for cmapname in six.iterkeys(datad):
+    cmap_d[cmapname] = _generate_cmap(cmapname, LUTSIZE)
 
 cmap_d.update(cmaps_listed)
 
diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py
index 4da0d66..ee6bb59 100644
--- a/lib/matplotlib/collections.py
+++ b/lib/matplotlib/collections.py
@@ -136,6 +136,7 @@ class Collection(artist.Artist, cm.ScalarMappable):
         self._linewidths = [0]
         self._is_filled = True  # May be modified by set_facecolor().
 
+        self._hatch_color = mcolors.to_rgba(mpl.rcParams['hatch.color'])
         self.set_facecolor(facecolors)
         self.set_edgecolor(edgecolors)
         self.set_linewidth(linewidths)
@@ -293,6 +294,12 @@ class Collection(artist.Artist, cm.ScalarMappable):
 
         if self._hatch:
             gc.set_hatch(self._hatch)
+            try:
+                gc.set_hatch_color(self._hatch_color)
+            except AttributeError:
+                # if we end up with a GC that does not have this method
+                warnings.warn("Your backend does not support setting the "
+                              "hatch color.")
 
         if self.get_sketch_params() is not None:
             gc.set_sketch_params(*self.get_sketch_params())
@@ -690,12 +697,15 @@ class Collection(artist.Artist, cm.ScalarMappable):
     get_edgecolors = get_edgecolor
 
     def _set_edgecolor(self, c):
+        set_hatch_color = True
         if c is None:
             if (mpl.rcParams['patch.force_edgecolor'] or
                     not self._is_filled or self._edge_default):
                 c = mpl.rcParams['patch.edgecolor']
             else:
                 c = 'none'
+                set_hatch_color = False
+
         self._is_stroked = True
         try:
             if c.lower() == 'none':
@@ -710,6 +720,8 @@ class Collection(artist.Artist, cm.ScalarMappable):
         except AttributeError:
             pass
         self._edgecolors = mcolors.to_rgba_array(c, self._alpha)
+        if set_hatch_color and len(self._edgecolors):
+            self._hatch_color = tuple(self._edgecolors[0])
         self.stale = True
 
     def set_edgecolor(self, c):
diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py
index f665b13..fcc1408 100644
--- a/lib/matplotlib/colors.py
+++ b/lib/matplotlib/colors.py
@@ -186,12 +186,14 @@ def _to_rgba_no_colorcycle(c, alpha=None):
             pass
         raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
     # tuple color.
-    # Python 2.7 / numpy 1.6 apparently require this to return builtin floats,
-    # not numpy floats.
-    try:
-        c = tuple(map(float, c))
-    except TypeError:
+    c = np.array(c)
+    if not np.can_cast(c.dtype, float) or c.ndim != 1:
+        # Test the dtype explicitly as `map(float, ...)`, `np.array(...,
+        # float)` and `np.array(...).astype(float)` all convert "0.5" to 0.5.
+        # Test dimensionality to reject single floats.
         raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
+    # Return a tuple to prevent the cached value from being modified.
+    c = tuple(c.astype(float))
     if len(c) not in [3, 4]:
         raise ValueError("RGBA sequence should have length 3 or 4")
     if len(c) == 3 and alpha is None:
diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py
index 10b5d9b..ed0e34b 100644
--- a/lib/matplotlib/dates.py
+++ b/lib/matplotlib/dates.py
@@ -718,6 +718,9 @@ class rrulewrapper(object):
             return self.__dict__[name]
         return getattr(self._rrule, name)
 
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+
 
 class DateLocator(ticker.Locator):
     """
diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py
index 77dad88..288ff45 100644
--- a/lib/matplotlib/figure.py
+++ b/lib/matplotlib/figure.py
@@ -323,9 +323,10 @@ class Figure(Artist):
         if frameon is None:
             frameon = rcParams['figure.frameon']
 
-        self.dpi_scale_trans = Affine2D()
-        self.dpi = dpi
         self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
+        self.dpi_scale_trans = Affine2D().scale(dpi, dpi)
+        # do not use property as it will trigger
+        self._dpi = dpi
         self.bbox = TransformedBbox(self.bbox_inches, self.dpi_scale_trans)
 
         self.frameon = frameon
@@ -413,6 +414,7 @@ class Figure(Artist):
     def _set_dpi(self, dpi):
         self._dpi = dpi
         self.dpi_scale_trans.clear().scale(dpi, dpi)
+        self.set_size_inches(*self.get_size_inches())
         self.callbacks.process('dpi_changed', self)
     dpi = property(_get_dpi, _set_dpi)
 
@@ -682,15 +684,12 @@ class Figure(Artist):
         return im
 
     def set_size_inches(self, w, h=None, forward=True):
-        """
-        set_size_inches(w,h, forward=False)
-
-        Set the figure size in inches (1in == 2.54cm)
+        """Set the figure size in inches (1in == 2.54cm)
 
-        Usage::
+        Usage ::
 
              fig.set_size_inches(w,h)  # OR
-             fig.set_size_inches((w,h) )
+             fig.set_size_inches((w,h))
 
         optional kwarg *forward=True* will cause the canvas size to be
         automatically updated; e.g., you can resize the figure window
@@ -713,13 +712,15 @@ class Figure(Artist):
         self.bbox_inches.p1 = w, h
 
         if forward:
-            ratio = getattr(self.canvas, '_dpi_ratio', 1)
-            dpival = self.dpi / ratio
-            canvasw = w * dpival
-            canvash = h * dpival
-            manager = getattr(self.canvas, 'manager', None)
-            if manager is not None:
-                manager.resize(int(canvasw), int(canvash))
+            canvas = getattr(self, 'canvas')
+            if canvas is not None:
+                ratio = getattr(self.canvas, '_dpi_ratio', 1)
+                dpival = self.dpi / ratio
+                canvasw = w * dpival
+                canvash = h * dpival
+                manager = getattr(self.canvas, 'manager', None)
+                if manager is not None:
+                    manager.resize(int(canvasw), int(canvash))
         self.stale = True
 
     def get_size_inches(self):
diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py
index 3084410..e1d9e81 100644
--- a/lib/matplotlib/font_manager.py
+++ b/lib/matplotlib/font_manager.py
@@ -281,7 +281,7 @@ def _call_fc_list():
         'This may take a moment.'))
     timer.start()
     try:
-        out = subprocess.check_output([str('fc-list'), '--format=%{file}'])
+        out = subprocess.check_output([str('fc-list'), '--format=%{file}\\n'])
     except (OSError, subprocess.CalledProcessError):
         return []
     finally:
@@ -1024,7 +1024,7 @@ class FontManager(object):
     # Increment this version number whenever the font cache data
     # format or behavior has changed and requires a existing font
     # cache files to be rebuilt.
-    __version__ = 200
+    __version__ = 201
 
     def __init__(self, size=None, weight='normal'):
         self._version = self.__version__
diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py
index 7791614..c875138 100644
--- a/lib/matplotlib/image.py
+++ b/lib/matplotlib/image.py
@@ -301,6 +301,10 @@ class _ImageBase(martist.Artist, cm.ScalarMappable):
         if A is None:
             raise RuntimeError('You must first set the image'
                                ' array or the image attribute')
+        if any(s == 0 for s in A.shape):
+            raise RuntimeError("_make_image must get a non-empty image. "
+                               "Your Artist's draw method must filter before "
+                               "this method is called.")
 
         clipped_bbox = Bbox.intersection(out_bbox, clip_bbox)
 
@@ -371,9 +375,20 @@ class _ImageBase(martist.Artist, cm.ScalarMappable):
                     # this is to work around spurious warnings coming
                     # out of masked arrays.
                     with np.errstate(invalid='ignore'):
-                        rgba[..., 1] = A < 0  # under data
-                        rgba[..., 2] = A > 1  # over data
-                    rgba[..., 3] = ~A.mask  # bad data
+                        rgba[..., 1] = np.where(A < 0, np.nan, 1)  # under data
+                        rgba[..., 2] = np.where(A > 1, np.nan, 1)  # over data
+                    # Have to invert mask, Agg knows what alpha means
+                    # so if you put this in as 0 for 'good' points, they
+                    # all get zeroed out
+                    rgba[..., 3] = 1
+                    if A.mask.shape == A.shape:
+                        # this is the case of a nontrivial mask
+                        mask = np.where(A.mask, np.nan, 1)
+                    else:
+                        # this is the case that the mask is a
+                        # numpy.bool_ of False
+                        mask = A.mask
+                    # ~A.mask  # masked data
                     A = rgba
                     output = np.zeros((out_height, out_width, 4),
                                       dtype=A.dtype)
@@ -414,12 +429,37 @@ class _ImageBase(martist.Artist, cm.ScalarMappable):
                 # Convert back to a masked greyscale array so
                 # colormapping works correctly
                 hid_output = output
+                # any pixel where the a masked pixel is included
+                # in the kernel (pulling this down from 1) needs to
+                # be masked in the output
+                if len(mask.shape) == 2:
+                    out_mask = np.empty((out_height, out_width),
+                                        dtype=mask.dtype)
+                    _image.resample(mask, out_mask, t,
+                                    _interpd_[self.get_interpolation()],
+                                    True, 1,
+                                    self.get_filternorm() or 0.0,
+                                    self.get_filterrad() or 0.0)
+                    out_mask = np.isnan(out_mask)
+                else:
+                    out_mask = mask
+                # we need to mask both pixels which came in as masked
+                # and the pixels that Agg is telling us to ignore (relavent
+                # to non-affine transforms)
+                # Use half alpha as the threshold for pixels to mask.
+                out_mask = out_mask | (hid_output[..., 3] < .5)
                 output = np.ma.masked_array(
-                    hid_output[..., 0], hid_output[..., 3] < 0.5)
-                # relabel under data
-                output[hid_output[..., 1] > .5] = -1
+                    hid_output[..., 0],
+                    out_mask)
+                # 'unshare' the mask array to
+                # needed to suppress numpy warning
+                del out_mask
+                invalid_mask = ~output.mask * ~np.isnan(output.data)
+                # relabel under data.  If any of the input data for
+                # the pixel has input out of the norm bounds,
+                output[np.isnan(hid_output[..., 1]) * invalid_mask] = -1
                 # relabel over data
-                output[hid_output[..., 2] > .5] = 2
+                output[np.isnan(hid_output[..., 2]) * invalid_mask] = 2
 
             output = self.to_rgba(output, bytes=True, norm=False)
 
@@ -478,9 +518,17 @@ class _ImageBase(martist.Artist, cm.ScalarMappable):
 
     @allow_rasterization
     def draw(self, renderer, *args, **kwargs):
+        # if not visible, declare victory and return
         if not self.get_visible():
+            self.stale = False
+            return
+
+        # for empty images, there is nothing to draw!
+        if self.get_array().size == 0:
+            self.stale = False
             return
 
+        # actually render the image.
         gc = renderer.new_gc()
         self._set_gc_clip(gc)
         gc.set_alpha(self.get_alpha())
@@ -525,14 +573,17 @@ class _ImageBase(martist.Artist, cm.ScalarMappable):
 
     def write_png(self, fname):
         """Write the image to png file with fname"""
-        im = self.to_rgba(self._A, bytes=True, norm=True)
+        im = self.to_rgba(self._A[::-1] if self.origin == 'lower' else self._A,
+                          bytes=True, norm=True)
         _png.write_png(im, fname)
 
     def set_data(self, A):
         """
-        Set the image array
+        Set the image array.
 
         ACCEPTS: numpy/PIL Image A
+
+        Note that this function does *not* update the normalization used.
         """
         # check if data is PIL Image without importing Image
         if hasattr(A, 'getpixel'):
diff --git a/lib/matplotlib/legend_handler.py b/lib/matplotlib/legend_handler.py
index 1cc81fa..7966111 100644
--- a/lib/matplotlib/legend_handler.py
+++ b/lib/matplotlib/legend_handler.py
@@ -592,6 +592,8 @@ class HandlerPolyCollection(HandlerBase):
     """
     def _update_prop(self, legend_handle, orig_handle):
         def first_color(colors):
+            if colors is None:
+                return None
             colors = mcolors.to_rgba_array(colors)
             if len(colors):
                 return colors[0]
@@ -602,8 +604,12 @@ class HandlerPolyCollection(HandlerBase):
                 return prop_array[0]
             else:
                 return None
-        legend_handle.set_edgecolor(first_color(orig_handle.get_edgecolor()))
-        legend_handle.set_facecolor(first_color(orig_handle.get_facecolor()))
+        edgecolor = getattr(orig_handle, '_original_edgecolor',
+                            orig_handle.get_edgecolor())
+        legend_handle.set_edgecolor(first_color(edgecolor))
+        facecolor = getattr(orig_handle, '_original_facecolor',
+                            orig_handle.get_facecolor())
+        legend_handle.set_facecolor(first_color(facecolor))
         legend_handle.set_fill(orig_handle.get_fill())
         legend_handle.set_hatch(orig_handle.get_hatch())
         legend_handle.set_linewidth(get_first(orig_handle.get_linewidths()))
diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py
index 57634cf..26c7f74 100644
--- a/lib/matplotlib/lines.py
+++ b/lib/matplotlib/lines.py
@@ -68,12 +68,12 @@ def _get_dash_pattern(style):
 def _scale_dashes(offset, dashes, lw):
     if not rcParams['lines.scale_dashes']:
         return offset, dashes
-    scale = max(2.0, lw)
+
     scaled_offset = scaled_dashes = None
     if offset is not None:
-        scaled_offset = offset * scale
+        scaled_offset = offset * lw
     if dashes is not None:
-        scaled_dashes = [x * scale if x is not None else None
+        scaled_dashes = [x * lw if x is not None else None
                          for x in dashes]
 
     return scaled_offset, scaled_dashes
diff --git a/lib/matplotlib/markers.py b/lib/matplotlib/markers.py
index 200e9e0..ec2526d 100644
--- a/lib/matplotlib/markers.py
+++ b/lib/matplotlib/markers.py
@@ -246,12 +246,14 @@ class MarkerStyle(object):
         return self._marker
 
     def set_marker(self, marker):
-        if (iterable(marker) and len(marker) in (2, 3) and
+        if (isinstance(marker, np.ndarray) and marker.ndim == 2 and
+                marker.shape[1] == 2):
+            self._marker_function = self._set_vertices
+        elif (iterable(marker) and len(marker) in (2, 3) and
                 marker[1] in (0, 1, 2, 3)):
             self._marker_function = self._set_tuple_marker
-        elif isinstance(marker, np.ndarray):
-            self._marker_function = self._set_vertices
-        elif not isinstance(marker, list) and marker in self.markers:
+        elif (not isinstance(marker, (np.ndarray, list)) and
+              marker in self.markers):
             self._marker_function = getattr(
                 self, '_set_' + self.markers[marker])
         elif is_string_like(marker) and is_math_text(marker):
diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py
index 96c3331..3087822 100644
--- a/lib/matplotlib/mathtext.py
+++ b/lib/matplotlib/mathtext.py
@@ -2881,21 +2881,18 @@ class Parser(object):
                 return toks[0] # .asList()
             else:
                 nucleus = toks[0]
-        elif len(toks) == 2:
-            op, next = toks
-            nucleus = Hbox(0.0)
-            if op == '_':
-                sub = next
-            else:
-                super = next
-        elif len(toks) == 3:
-            nucleus, op, next = toks
+        elif len(toks) in (2, 3):
+            # single subscript or superscript
+            nucleus = toks[0] if len(toks) == 3 else Hbox(0.0)
+            op, next = toks[-2:]
             if op == '_':
                 sub = next
             else:
                 super = next
-        elif len(toks) == 5:
-            nucleus, op1, next1, op2, next2 = toks
+        elif len(toks) in (4, 5):
+            # subscript and superscript
+            nucleus = toks[0] if len(toks) == 5 else Hbox(0.0)
+            op1, next1, op2, next2 = toks[-4:]
             if op1 == op2:
                 if op1 == '_':
                     raise ParseFatalException("Double subscript")
diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py
index 168dbe6..4b5e4e2 100644
--- a/lib/matplotlib/mlab.py
+++ b/lib/matplotlib/mlab.py
@@ -889,7 +889,7 @@ docstring.interpd.update(PSD=cbook.dedent("""
 @docstring.dedent_interpd
 def psd(x, NFFT=None, Fs=None, detrend=None, window=None,
         noverlap=None, pad_to=None, sides=None, scale_by_freq=None):
-    """
+    r"""
     Compute the power spectral density.
 
     Call signature::
diff --git a/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle b/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle
new file mode 100644
index 0000000..02e08fa
--- /dev/null
+++ b/lib/matplotlib/mpl-data/stylelib/_classic_test.mplstyle
@@ -0,0 +1,526 @@
+### Classic matplotlib plotting style as of v1.5
+
+
+### LINES
+# See http://matplotlib.org/api/artist_api.html#module-matplotlib.lines for more
+# information on line properties.
+lines.linewidth   : 1.0     # line width in points
+lines.linestyle   : -       # solid line
+lines.color       : b       # has no affect on plot(); see axes.prop_cycle
+lines.marker      : None    # the default marker
+lines.markeredgewidth  : 0.5     # the line width around the marker symbol
+lines.markersize  : 6            # markersize, in points
+lines.dash_joinstyle : round        # miter|round|bevel
+lines.dash_capstyle : butt          # butt|round|projecting
+lines.solid_joinstyle : round       # miter|round|bevel
+lines.solid_capstyle : projecting   # butt|round|projecting
+lines.antialiased : True         # render lines in antialiased (no jaggies)
+lines.dashed_pattern : 6, 6
+lines.dashdot_pattern : 3, 5, 1, 5
+lines.dotted_pattern : 1, 3
+lines.scale_dashes: False
+
+### Marker props
+markers.fillstyle: full
+
+### PATCHES
+# Patches are graphical objects that fill 2D space, like polygons or
+# circles.  See
+# http://matplotlib.org/api/artist_api.html#module-matplotlib.patches
+# information on patch properties
+patch.linewidth        : 1.0     # edge width in points
+patch.facecolor        : b
+patch.force_edgecolor  : True
+patch.edgecolor        : k
+patch.antialiased      : True    # render patches in antialiased (no jaggies)
+
+hatch.color            : k
+hatch.linewidth        : 1.0
+
+hist.bins              : 10
+
+### FONT
+#
+# font properties used by text.Text.  See
+# http://matplotlib.org/api/font_manager_api.html for more
+# information on font properties.  The 6 font properties used for font
+# matching are given below with their default values.
+#
+# The font.family property has five values: 'serif' (e.g., Times),
+# 'sans-serif' (e.g., Helvetica), 'cursive' (e.g., Zapf-Chancery),
+# 'fantasy' (e.g., Western), and 'monospace' (e.g., Courier).  Each of
+# these font families has a default list of font names in decreasing
+# order of priority associated with them.  When text.usetex is False,
+# font.family may also be one or more concrete font names.
+#
+# The font.style property has three values: normal (or roman), italic
+# or oblique.  The oblique style will be used for italic, if it is not
+# present.
+#
+# The font.variant property has two values: normal or small-caps.  For
+# TrueType fonts, which are scalable fonts, small-caps is equivalent
+# to using a font size of 'smaller', or about 83% of the current font
+# size.
+#
+# The font.weight property has effectively 13 values: normal, bold,
+# bolder, lighter, 100, 200, 300, ..., 900.  Normal is the same as
+# 400, and bold is 700.  bolder and lighter are relative values with
+# respect to the current weight.
+#
+# The font.stretch property has 11 values: ultra-condensed,
+# extra-condensed, condensed, semi-condensed, normal, semi-expanded,
+# expanded, extra-expanded, ultra-expanded, wider, and narrower.  This
+# property is not currently implemented.
+#
+# The font.size property is the default font size for text, given in pts.
+# 12pt is the standard value.
+#
+font.family         : sans-serif
+font.style          : normal
+font.variant        : normal
+font.weight         : normal
+font.stretch        : normal
+# note that font.size controls default text sizes.  To configure
+# special text sizes tick labels, axes, labels, title, etc, see the rc
+# settings for axes and ticks. Special text sizes can be defined
+# relative to font.size, using the following values: xx-small, x-small,
+# small, medium, large, x-large, xx-large, larger, or smaller
+font.size           : 12.0
+font.serif     : DejaVu Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
+font.sans-serif: DejaVu Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
+font.cursive   : Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive
+font.fantasy   : Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, fantasy
+font.monospace : DejaVu Sans Mono, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace
+
+### TEXT
+# text properties used by text.Text.  See
+# http://matplotlib.org/api/artist_api.html#module-matplotlib.text for more
+# information on text properties
+
+text.color          : k
+
+### LaTeX customizations. See http://www.scipy.org/Wiki/Cookbook/Matplotlib/UsingTex
+text.usetex         : False  # use latex for all text handling. The following fonts
+                             # are supported through the usual rc parameter settings:
+                             # new century schoolbook, bookman, times, palatino,
+                             # zapf chancery, charter, serif, sans-serif, helvetica,
+                             # avant garde, courier, monospace, computer modern roman,
+                             # computer modern sans serif, computer modern typewriter
+                             # If another font is desired which can loaded using the
+                             # LaTeX \usepackage command, please inquire at the
+                             # matplotlib mailing list
+text.latex.unicode : False # use "ucs" and "inputenc" LaTeX packages for handling
+                           # unicode strings.
+text.latex.preamble :  # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES
+                           # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP
+                           # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO.
+                           # preamble is a comma separated list of LaTeX statements
+                           # that are included in the LaTeX document preamble.
+                           # An example:
+                           # text.latex.preamble : \usepackage{bm},\usepackage{euler}
+                           # The following packages are always loaded with usetex, so
+                           # beware of package collisions: color, geometry, graphicx,
+                           # type1cm, textcomp. Adobe Postscript (PSSNFS) font packages
+                           # may also be loaded, depending on your font settings
+text.latex.preview : False
+
+text.dvipnghack : None      # some versions of dvipng don't handle alpha
+                            # channel properly.  Use True to correct
+                            # and flush ~/.matplotlib/tex.cache
+                            # before testing and False to force
+                            # correction off.  None will try and
+                            # guess based on your dvipng version
+
+text.hinting : auto   # May be one of the following:
+                      #   'none': Perform no hinting
+                      #   'auto': Use freetype's autohinter
+                      #   'native': Use the hinting information in the
+                      #             font file, if available, and if your
+                      #             freetype library supports it
+                      #   'either': Use the native hinting information,
+                      #             or the autohinter if none is available.
+                      # For backward compatibility, this value may also be
+                      # True === 'auto' or False === 'none'.
+text.hinting_factor : 8 # Specifies the amount of softness for hinting in the
+                        # horizontal direction.  A value of 1 will hint to full
+                        # pixels.  A value of 2 will hint to half pixels etc.
+
+text.antialiased : True # If True (default), the text will be antialiased.
+                        # This only affects the Agg backend.
+
+# The following settings allow you to select the fonts in math mode.
+# They map from a TeX font name to a fontconfig font pattern.
+# These settings are only used if mathtext.fontset is 'custom'.
+# Note that this "custom" mode is unsupported and may go away in the
+# future.
+mathtext.cal : cursive
+mathtext.rm  : serif
+mathtext.tt  : monospace
+mathtext.it  : serif:italic
+mathtext.bf  : serif:bold
+mathtext.sf  : sans\-serif
+mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix',
+                      # 'stixsans' or 'custom'
+mathtext.fallback_to_cm : True  # When True, use symbols from the Computer Modern
+                                # fonts when a symbol can not be found in one of
+                                # the custom math fonts.
+
+mathtext.default : it # The default font to use for math.
+                      # Can be any of the LaTeX font names, including
+                      # the special name "regular" for the same font
+                      # used in regular text.
+
+### AXES
+# default face and edge color, default tick sizes,
+# default fontsizes for ticklabels, and so on.  See
+# http://matplotlib.org/api/axes_api.html#module-matplotlib.axes
+axes.facecolor      : w       # axes background color
+axes.edgecolor      : k       # axes edge color
+axes.linewidth      : 1.0     # edge linewidth
+axes.grid           : False   # display grid or not
+axes.grid.which     : major
+axes.grid.axis      : both
+axes.titlesize      : large   # fontsize of the axes title
+axes.titlepad       : 5.0     # pad between axes and title in points
+axes.titleweight    : normal  # font weight for axes title
+axes.labelsize      : medium  # fontsize of the x any y labels
+axes.labelpad       : 5.0     # space between label and axis
+axes.labelweight    : normal  # weight of the x and y labels
+axes.labelcolor     : k
+axes.axisbelow      : False   # whether axis gridlines and ticks are below
+                              # the axes elements (lines, text, etc)
+
+axes.formatter.limits : -7, 7 # use scientific notation if log10
+                              # of the axis range is smaller than the
+                              # first or larger than the second
+axes.formatter.use_locale : False # When True, format tick labels
+                                  # according to the user's locale.
+                                  # For example, use ',' as a decimal
+                                  # separator in the fr_FR locale.
+axes.formatter.use_mathtext : False # When True, use mathtext for scientific
+                                    # notation.
+axes.formatter.useoffset      : True    # If True, the tick label formatter
+                                        # will default to labeling ticks relative
+                                        # to an offset when the data range is very
+                                        # small compared to the minimum absolute
+                                        # value of the data.
+axes.formatter.offset_threshold : 2      # When useoffset is True, the offset
+                                         # will be used when it can remove
+                                         # at least this number of significant
+                                         # digits from tick labels.
+
+axes.unicode_minus  : True    # use unicode for the minus symbol
+                              # rather than hyphen.  See
+                              # http://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
+axes.prop_cycle    : cycler('color', 'bgrcmyk')
+                                           # color cycle for plot lines
+                                           # as list of string colorspecs:
+                                           # single letter, long name, or
+                                           # web-style hex
+axes.autolimit_mode : round_numbers
+axes.xmargin        : 0  # x margin.  See `axes.Axes.margins`
+axes.ymargin        : 0  # y margin See `axes.Axes.margins`
+axes.spines.bottom  : True
+axes.spines.left    : True
+axes.spines.right   : True
+axes.spines.top     : True
+polaraxes.grid      : True    # display grid on polar axes
+axes3d.grid         : True    # display grid on 3d axes
+
+date.autoformatter.year   : %Y
+date.autoformatter.month  : %b %Y
+date.autoformatter.day    : %b %d %Y
+date.autoformatter.hour   : %H:%M:%S
+date.autoformatter.minute : %H:%M:%S.%f
+date.autoformatter.second : %H:%M:%S.%f
+date.autoformatter.microsecond : %H:%M:%S.%f
+
+### TICKS
+# see http://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick
+
+xtick.top            : True   # draw ticks on the top side
+xtick.bottom         : True   # draw ticks on the bottom side
+xtick.major.size     : 4      # major tick size in points
+xtick.minor.size     : 2      # minor tick size in points
+xtick.minor.visible  : False
+xtick.major.width    : 0.5    # major tick width in points
+xtick.minor.width    : 0.5    # minor tick width in points
+xtick.major.pad      : 4      # distance to major tick label in points
+xtick.minor.pad      : 4      # distance to the minor tick label in points
+xtick.color          : k      # color of the tick labels
+xtick.labelsize      : medium # fontsize of the tick labels
+xtick.direction      : in     # direction: in, out, or inout
+xtick.major.top      : True   # draw x axis top major ticks
+xtick.major.bottom   : True   # draw x axis bottom major ticks
+xtick.minor.top      : True   # draw x axis top minor ticks
+xtick.minor.bottom   : True   # draw x axis bottom minor ticks
+
+ytick.left           : True   # draw ticks on the left side
+ytick.right          : True   # draw ticks on the right side
+ytick.major.size     : 4      # major tick size in points
+ytick.minor.size     : 2      # minor tick size in points
+ytick.minor.visible  : False
+ytick.major.width    : 0.5    # major tick width in points
+ytick.minor.width    : 0.5    # minor tick width in points
+ytick.major.pad      : 4      # distance to major tick label in points
+ytick.minor.pad      : 4      # distance to the minor tick label in points
+ytick.color          : k      # color of the tick labels
+ytick.labelsize      : medium # fontsize of the tick labels
+ytick.direction      : in     # direction: in, out, or inout
+ytick.major.left     : True   # draw y axis left major ticks
+ytick.major.right    : True   # draw y axis right major ticks
+ytick.minor.left     : True   # draw y axis left minor ticks
+ytick.minor.right    : True   # draw y axis right minor ticks
+
+### GRIDS
+grid.color       :   k       # grid color
+grid.linestyle   :   :       # dotted
+grid.linewidth   :   0.5     # in points
+grid.alpha       :   1.0     # transparency, between 0.0 and 1.0
+
+### Legend
+legend.fancybox      : False  # if True, use a rounded box for the
+                              # legend, else a rectangle
+legend.loc           : upper right
+legend.numpoints     : 2      # the number of points in the legend line
+legend.fontsize      : large
+legend.borderpad     : 0.4    # border whitespace in fontsize units
+legend.markerscale   : 1.0    # the relative size of legend markers vs. original
+# the following dimensions are in axes coords
+legend.labelspacing  : 0.5    # the vertical space between the legend entries in fraction of fontsize
+legend.handlelength  : 2.     # the length of the legend lines in fraction of fontsize
+legend.handleheight  : 0.7     # the height of the legend handle in fraction of fontsize
+legend.handletextpad : 0.8    # the space between the legend line and legend text in fraction of fontsize
+legend.borderaxespad : 0.5   # the border between the axes and legend edge in fraction of fontsize
+legend.columnspacing : 2.    # the border between the axes and legend edge in fraction of fontsize
+legend.shadow        : False
+legend.frameon       : True   # whether or not to draw a frame around legend
+legend.framealpha    : None    # opacity of legend frame
+legend.scatterpoints : 3 # number of scatter points
+legend.facecolor     : inherit   # legend background color (when 'inherit' uses axes.facecolor)
+legend.edgecolor     : inherit   # legend edge color (when 'inherit' uses axes.edgecolor)
+
+
+
+### FIGURE
+# See http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure
+figure.titlesize : medium     # size of the figure title
+figure.titleweight : normal   # weight of the figure title
+figure.figsize   : 8, 6    # figure size in inches
+figure.dpi       : 80      # figure dots per inch
+figure.facecolor : 0.75    # figure facecolor; 0.75 is scalar gray
+figure.edgecolor : w       # figure edgecolor
+figure.autolayout : False  # When True, automatically adjust subplot
+                           # parameters to make the plot fit the figure
+figure.frameon : True
+
+# The figure subplot parameters.  All dimensions are a fraction of the
+# figure width or height
+figure.subplot.left    : 0.125  # the left side of the subplots of the figure
+figure.subplot.right   : 0.9    # the right side of the subplots of the figure
+figure.subplot.bottom  : 0.1    # the bottom of the subplots of the figure
+figure.subplot.top     : 0.9    # the top of the subplots of the figure
+figure.subplot.wspace  : 0.2    # the amount of width reserved for blank space between subplots,
+                                # expressed as a fraction of the average axis width
+figure.subplot.hspace  : 0.2    # the amount of height reserved for white space between subplots,
+                                # expressed as a fraction of the average axis height
+
+### IMAGES
+image.aspect : equal             # equal | auto | a number
+image.interpolation  : bilinear  # see help(imshow) for options
+image.cmap   : jet               # gray | jet etc...
+image.lut    : 256               # the size of the colormap lookup table
+image.origin : upper             # lower | upper
+image.resample  : False
+image.composite_image : True
+
+### CONTOUR PLOTS
+contour.negative_linestyle :  dashed # dashed | solid
+contour.corner_mask : True
+
+# errorbar props
+errorbar.capsize: 3
+
+# scatter props
+scatter.marker: o
+
+### Boxplots
+boxplot.bootstrap: None
+boxplot.boxprops.color: b
+boxplot.boxprops.linestyle: -
+boxplot.boxprops.linewidth: 1.0
+boxplot.capprops.color: k
+boxplot.capprops.linestyle: -
+boxplot.capprops.linewidth: 1.0
+boxplot.flierprops.color: b
+boxplot.flierprops.linestyle: none
+boxplot.flierprops.linewidth: 1.0
+boxplot.flierprops.marker: +
+boxplot.flierprops.markeredgecolor: k
+boxplot.flierprops.markerfacecolor: auto
+boxplot.flierprops.markersize: 6.0
+boxplot.meanline: False
+boxplot.meanprops.color: r
+boxplot.meanprops.linestyle: -
+boxplot.meanprops.linewidth: 1.0
+boxplot.medianprops.color: r
+boxplot.meanprops.marker: s
+boxplot.meanprops.markerfacecolor: r
+boxplot.meanprops.markeredgecolor: k
+boxplot.meanprops.markersize: 6.0
+boxplot.medianprops.linestyle: -
+boxplot.medianprops.linewidth: 1.0
+boxplot.notch: False
+boxplot.patchartist: False
+boxplot.showbox: True
+boxplot.showcaps: True
+boxplot.showfliers: True
+boxplot.showmeans: False
+boxplot.vertical: True
+boxplot.whiskerprops.color: b
+boxplot.whiskerprops.linestyle: --
+boxplot.whiskerprops.linewidth: 1.0
+boxplot.whiskers: 1.5
+
+### Agg rendering
+### Warning: experimental, 2008/10/10
+agg.path.chunksize : 0           # 0 to disable; values in the range
+                                 # 10000 to 100000 can improve speed slightly
+                                 # and prevent an Agg rendering failure
+                                 # when plotting very large data sets,
+                                 # especially if they are very gappy.
+                                 # It may cause minor artifacts, though.
+                                 # A value of 20000 is probably a good
+                                 # starting point.
+### SAVING FIGURES
+path.simplify : True   # When True, simplify paths by removing "invisible"
+                       # points to reduce file size and increase rendering
+                       # speed
+path.simplify_threshold : 0.1111111111111111
+                               # The threshold of similarity below which
+                               # vertices will be removed in the simplification
+                               # process
+path.snap : True # When True, rectilinear axis-aligned paths will be snapped to
+                 # the nearest pixel when certain criteria are met.  When False,
+                 # paths will never be snapped.
+path.sketch : None # May be none, or a 3-tuple of the form (scale, length,
+                   # randomness).
+                   # *scale* is the amplitude of the wiggle
+                   # perpendicular to the line (in pixels).  *length*
+                   # is the length of the wiggle along the line (in
+                   # pixels).  *randomness* is the factor by which
+                   # the length is randomly scaled.
+
+# the default savefig params can be different from the display params
+# e.g., you may want a higher resolution, or to make the figure
+# background white
+savefig.dpi         : 100      # figure dots per inch
+savefig.facecolor   : w        # figure facecolor when saving
+savefig.edgecolor   : w        # figure edgecolor when saving
+savefig.format      : png      # png, ps, pdf, svg
+savefig.bbox        : standard # 'tight' or 'standard'.
+                               # 'tight' is incompatible with pipe-based animation
+                               # backends but will workd with temporary file based ones:
+                               # e.g. setting animation.writer to ffmpeg will not work,
+                               # use ffmpeg_file instead
+savefig.pad_inches  : 0.1      # Padding to be used when bbox is set to 'tight'
+savefig.jpeg_quality: 95       # when a jpeg is saved, the default quality parameter.
+savefig.transparent : False    # setting that controls whether figures are saved with a
+                               # transparent background by default
+savefig.frameon : True
+savefig.orientation : portrait
+
+nbagg.transparent: True
+
+# ps backend params
+ps.papersize      : letter   # auto, letter, legal, ledger, A0-A10, B0-B10
+ps.useafm         : False    # use of afm fonts, results in small files
+ps.usedistiller   : False    # can be: None, ghostscript or xpdf
+                                          # Experimental: may produce smaller files.
+                                          # xpdf intended for production of publication quality files,
+                                          # but requires ghostscript, xpdf and ps2eps
+ps.distiller.res  : 6000      # dpi
+ps.fonttype       : 3         # Output Type 3 (Type3) or Type 42 (TrueType)
+
+# pdf backend params
+pdf.compression   : 6 # integer from 0 to 9
+                      # 0 disables compression (good for debugging)
+pdf.fonttype       : 3         # Output Type 3 (Type3) or Type 42 (TrueType)
+pdf.inheritcolor   : False
+pdf.use14corefonts : False
+
+# pgf backend params
+pgf.debug           : False
+pgf.texsystem       : xelatex
+pgf.rcfonts         : True
+pgf.preamble        :
+
+# svg backend params
+svg.image_inline : True       # write raster image data directly into the svg file
+svg.fonttype : path            # How to handle SVG fonts:
+#    'none': Assume fonts are installed on the machine where the SVG will be viewed.
+#    'path': Embed characters as paths -- supported by most SVG renderers
+#    'svgfont': Embed characters as SVG fonts -- supported only by Chrome,
+#               Opera and Safari
+
+
+# Set the verbose flags.  This controls how much information
+# matplotlib gives you at runtime and where it goes.  The verbosity
+# levels are: silent, helpful, debug, debug-annoying.  Any level is
+# inclusive of all the levels below it.  If your setting is "debug",
+# you'll get all the debug and helpful messages.  When submitting
+# problems to the mailing-list, please set verbose to "helpful" or "debug"
+# and paste the output into your report.
+#
+# The "fileo" gives the destination for any calls to verbose.report.
+# These objects can a filename, or a filehandle like sys.stdout.
+#
+# You can override the rc default verbosity from the command line by
+# giving the flags --verbose-LEVEL where LEVEL is one of the legal
+# levels, e.g., --verbose-helpful.
+#
+# You can access the verbose instance in your code
+#   from matplotlib import verbose.
+verbose.level  : silent      # one of silent, helpful, debug, debug-annoying
+verbose.fileo  : sys.stdout  # a log filename, sys.stdout or sys.stderr
+
+# Event keys to interact with figures/plots via keyboard.
+# Customize these settings according to your needs.
+# Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '')
+
+keymap.fullscreen : f, ctrl+f       # toggling
+keymap.home : h, r, home            # home or reset mnemonic
+keymap.back : left, c, backspace    # forward / backward keys to enable
+keymap.forward : right, v           #   left handed quick navigation
+keymap.pan : p                      # pan mnemonic
+keymap.zoom : o                     # zoom mnemonic
+keymap.save : s, ctrl+s             # saving current figure
+keymap.quit : ctrl+w, cmd+w         # close the current figure
+keymap.grid : g                     # switching on/off a grid in current axes
+keymap.yscale : l                   # toggle scaling of y-axes ('log'/'linear')
+keymap.xscale : k, L                # toggle scaling of x-axes ('log'/'linear')
+keymap.all_axes : a                 # enable all axes
+
+###ANIMATION settings
+animation.writer : ffmpeg         # MovieWriter 'backend' to use
+animation.codec : mpeg4           # Codec to use for writing movie
+animation.bitrate: -1             # Controls size/quality tradeoff for movie.
+                                  # -1 implies let utility auto-determine
+animation.frame_format: png       # Controls frame format used by temp files
+animation.ffmpeg_path: ffmpeg     # Path to ffmpeg binary. Without full path
+                                  # $PATH is searched
+animation.ffmpeg_args:            # Additional arguments to pass to ffmpeg
+animation.avconv_path: avconv     # Path to avconv binary. Without full path
+                                  # $PATH is searched
+animation.avconv_args:            # Additional arguments to pass to avconv
+animation.mencoder_path: mencoder
+                                  # Path to mencoder binary. Without full path
+                                  # $PATH is searched
+animation.mencoder_args:          # Additional arguments to pass to mencoder
+animation.convert_path: convert   # Path to ImageMagick's convert binary.
+                                  # On Windows use the full path since convert
+                                  # is also the name of a system tool.
+animation.convert_args:
+animation.html: none
+
+_internal.classic_mode: True
diff --git a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle
index 02e08fa..840f097 100644
--- a/lib/matplotlib/mpl-data/stylelib/classic.mplstyle
+++ b/lib/matplotlib/mpl-data/stylelib/classic.mplstyle
@@ -254,6 +254,7 @@ xtick.major.top      : True   # draw x axis top major ticks
 xtick.major.bottom   : True   # draw x axis bottom major ticks
 xtick.minor.top      : True   # draw x axis top minor ticks
 xtick.minor.bottom   : True   # draw x axis bottom minor ticks
+xtick.alignment : center
 
 ytick.left           : True   # draw ticks on the left side
 ytick.right          : True   # draw ticks on the right side
@@ -271,6 +272,7 @@ ytick.major.left     : True   # draw y axis left major ticks
 ytick.major.right    : True   # draw y axis right major ticks
 ytick.minor.left     : True   # draw y axis left minor ticks
 ytick.minor.right    : True   # draw y axis right minor ticks
+ytick.alignment      : center
 
 ### GRIDS
 grid.color       :   k       # grid color
diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py
index 05be96e..bb52b18 100644
--- a/lib/matplotlib/patches.py
+++ b/lib/matplotlib/patches.py
@@ -5,6 +5,7 @@ from __future__ import (absolute_import, division, print_function,
 
 import six
 from six.moves import map, zip
+import warnings
 
 import math
 
@@ -113,10 +114,10 @@ class Patch(artist.Artist):
         if antialiased is None:
             antialiased = mpl.rcParams['patch.antialiased']
 
+        self._hatch_color = colors.to_rgba(mpl.rcParams['hatch.color'])
         self._fill = True  # needed for set_facecolor call
         if color is not None:
             if (edgecolor is not None or facecolor is not None):
-                import warnings
                 warnings.warn("Setting the 'color' property will override"
                               "the edgecolor or facecolor properties. ")
             self.set_color(color)
@@ -199,6 +200,7 @@ class Patch(artist.Artist):
         self._facecolor = other._facecolor
         self._fill = other._fill
         self._hatch = other._hatch
+        self._hatch_color = other._hatch_color
         # copy the unscaled dash pattern
         self._us_dashes = other._us_dashes
         self.set_linewidth(other._linewidth)  # also sets dash properties
@@ -288,13 +290,18 @@ class Patch(artist.Artist):
         return self.set_antialiased(aa)
 
     def _set_edgecolor(self, color):
+        set_hatch_color = True
         if color is None:
             if (mpl.rcParams['patch.force_edgecolor'] or
                     not self._fill or self._edge_default):
                 color = mpl.rcParams['patch.edgecolor']
             else:
                 color = 'none'
+                set_hatch_color = False
+
         self._edgecolor = colors.to_rgba(color, self._alpha)
+        if set_hatch_color:
+            self._hatch_color = self._edgecolor
         self.stale = True
 
     def set_edgecolor(self, color):
@@ -545,6 +552,12 @@ class Patch(artist.Artist):
 
         if self._hatch:
             gc.set_hatch(self._hatch)
+            try:
+                gc.set_hatch_color(self._hatch_color)
+            except AttributeError:
+                # if we end up with a GC that does not have this method
+                warnings.warn("Your backend does not have support for "
+                              "setting the hatch color.")
 
         if self.get_sketch_params() is not None:
             gc.set_sketch_params(*self.get_sketch_params())
@@ -1236,7 +1249,7 @@ class FancyArrow(Polygon):
                     # The half-arrows contain the midpoint of the stem,
                     # which we can omit from the full arrow. Including it
                     # twice caused a problem with xpdf.
-                    coords = np.concatenate([left_half_arrow[:-2],
+                    coords = np.concatenate([left_half_arrow[:-1],
                                              right_half_arrow[-2::-1]])
                 else:
                     raise ValueError("Got unknown shape: %s" % shape)
@@ -3425,11 +3438,13 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveA, self).__init__(
@@ -3445,11 +3460,13 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveB, self).__init__(
@@ -3465,11 +3482,13 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveAB, self).__init__(
@@ -3485,11 +3504,13 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveFilledA, self).__init__(
@@ -3506,11 +3527,13 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveFilledB, self).__init__(
@@ -3522,17 +3545,18 @@ class ArrowStyle(_Style):
 
     class CurveFilledAB(_Curve):
         """
-        An arrow with filled triangle heads both at the begin and the end
-        point.
+        An arrow with filled triangle heads at both ends.
         """
 
         def __init__(self, head_length=.4, head_width=.2):
             """
-            *head_length*
-              length of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *head_width*
-              width of the arrow head
+            head_width : float, optional, default : 0.2
+                Width of the arrow head
             """
 
             super(ArrowStyle.CurveFilledAB, self).__init__(
@@ -3621,30 +3645,32 @@ class ArrowStyle(_Style):
 
     class BracketAB(_Bracket):
         """
-        An arrow with a bracket(])  at both ends.
+        An arrow with a bracket(]) at both ends.
         """
 
         def __init__(self,
                      widthA=1., lengthA=0.2, angleA=None,
                      widthB=1., lengthB=0.2, angleB=None):
             """
-            *widthA*
-              width of the bracket
+            Parameters
+            ----------
+            widthA : float, optional, default : 1.0
+                Width of the bracket
 
-            *lengthA*
-              length of the bracket
+            lengthA : float, optional, default : 0.2
+                Length of the bracket
 
-            *angleA*
-              angle between the bracket and the line
+            angleA : float, optional, default : None
+                Angle between the bracket and the line
 
-            *widthB*
-              width of the bracket
+            widthB : float, optional, default : 1.0
+                Width of the bracket
 
-            *lengthB*
-              length of the bracket
+            lengthB : float, optional, default : 0.2
+                Length of the bracket
 
-            *angleB*
-              angle between the bracket and the line
+            angleB : float, optional, default : None
+                Angle between the bracket and the line
             """
 
             super(ArrowStyle.BracketAB, self).__init__(
@@ -3661,14 +3687,16 @@ class ArrowStyle(_Style):
 
         def __init__(self, widthA=1., lengthA=0.2, angleA=None):
             """
-            *widthA*
-              width of the bracket
+            Parameters
+            ----------
+            widthA : float, optional, default : 1.0
+                Width of the bracket
 
-            *lengthA*
-              length of the bracket
+            lengthA : float, optional, default : 0.2
+                Length of the bracket
 
-            *angleA*
-              angle between the bracket and the line
+            angleA : float, optional, default : None
+                Angle between the bracket and the line
             """
 
             super(ArrowStyle.BracketA, self).__init__(True, None,
@@ -3685,14 +3713,16 @@ class ArrowStyle(_Style):
 
         def __init__(self, widthB=1., lengthB=0.2, angleB=None):
             """
-            *widthB*
-              width of the bracket
+            Parameters
+            ----------
+            widthB : float, optional, default : 1.0
+                Width of the bracket
 
-            *lengthB*
-              length of the bracket
+            lengthB : float, optional, default : 0.2
+                Length of the bracket
 
-            *angleB*
-              angle between the bracket and the line
+            angleB : float, optional, default : None
+                Angle between the bracket and the line
             """
 
             super(ArrowStyle.BracketB, self).__init__(None, True,
@@ -3711,23 +3741,19 @@ class ArrowStyle(_Style):
                      widthA=1., angleA=None,
                      widthB=1., angleB=None):
             """
-            *widthA*
-              width of the bracket
-
-            *lengthA*
-              length of the bracket
-
-            *angleA*
-              angle between the bracket and the line
+            Parameters
+            ----------
+            widthA : float, optional, default : 1.0
+                Width of the bracket
 
-            *widthB*
-              width of the bracket
+            angleA : float, optional, default : None
+                Angle between the bracket and the line
 
-            *lengthB*
-              length of the bracket
+            widthB : float, optional, default : 1.0
+                Width of the bracket
 
-            *angleB*
-              angle between the bracket and the line
+            angleB : float, optional, default : None
+                Angle between the bracket and the line
             """
 
             super(ArrowStyle.BarAB, self).__init__(
@@ -3743,15 +3769,16 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.5, head_width=.5, tail_width=.2):
             """
-            *head_length*
-              length of the arrow head
-
-            *head_with*
-              width of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.5
+                Length of the arrow head
 
-            *tail_width*
-              width of the arrow tail
+            head_width : float, optional, default : 0.5
+                Width of the arrow head
 
+            tail_width : float, optional, default : 0.2
+                Width of the arrow tail
             """
 
             self.head_length, self.head_width, self.tail_width = \
@@ -3829,15 +3856,16 @@ class ArrowStyle(_Style):
 
         def __init__(self, head_length=.4, head_width=.4, tail_width=.4):
             """
-            *head_length*
-              length of the arrow head
-
-            *head_with*
-              width of the arrow head
+            Parameters
+            ----------
+            head_length : float, optional, default : 0.4
+                Length of the arrow head
 
-            *tail_width*
-              width of the arrow tail
+            head_width : float, optional, default : 0.4
+                Width of the arrow head
 
+            tail_width : float, optional, default : 0.4
+                Width of the arrow tail
             """
 
             self.head_length, self.head_width, self.tail_width = \
@@ -3929,16 +3957,17 @@ class ArrowStyle(_Style):
         Wedge(?) shape. Only works with a quadratic bezier curve.  The
         begin point has a width of the tail_width and the end point has a
         width of 0. At the middle, the width is shrink_factor*tail_width.
-
         """
 
         def __init__(self, tail_width=.3, shrink_factor=0.5):
             """
-            *tail_width*
-              width of the tail
+            Parameters
+            ----------
+            tail_width : float, optional, default : 0.3
+                Width of the tail
 
-            *shrink_factor*
-              fraction of the arrow width at the middle point
+            shrink_factor : float, optional, default : 0.5
+                Fraction of the arrow width at the middle point
             """
 
             self.tail_width = tail_width
@@ -4286,6 +4315,13 @@ class FancyArrowPatch(Patch):
 
         if self._hatch:
             gc.set_hatch(self._hatch)
+            if self._hatch_color is not None:
+                try:
+                    gc.set_hatch_color(self._hatch_color)
+                except AttributeError:
+                    # if we end up with a GC that does not have this method
+                    warnings.warn("Your backend does not support setting the "
+                                  "hatch color.")
 
         if self.get_sketch_params() is not None:
             gc.set_sketch_params(*self.get_sketch_params())
diff --git a/lib/matplotlib/path.py b/lib/matplotlib/path.py
index 98875a8..e8a7a40 100644
--- a/lib/matplotlib/path.py
+++ b/lib/matplotlib/path.py
@@ -486,13 +486,12 @@ class Path(object):
 
     def contains_point(self, point, transform=None, radius=0.0):
         """
-        Returns *True* if the path contains the given point.
+        Returns whether the (closed) path contains the given point.
 
-        If *transform* is not *None*, the path will be transformed
-        before performing the test.
+        If *transform* is not ``None``, the path will be transformed before
+        performing the test.
 
-        *radius* allows the path to be made slightly larger or
-        smaller.
+        *radius* allows the path to be made slightly larger or smaller.
         """
         if transform is not None:
             transform = transform.frozen()
@@ -502,14 +501,13 @@ class Path(object):
 
     def contains_points(self, points, transform=None, radius=0.0):
         """
-        Returns a bool array which is *True* if the path contains the
-        corresponding point.
+        Returns a bool array which is ``True`` if the (closed) path contains
+        the corresponding point.
 
-        If *transform* is not *None*, the path will be transformed
-        before performing the test.
+        If *transform* is not ``None``, the path will be transformed before
+        performing the test.
 
-        *radius* allows the path to be made slightly larger or
-        smaller.
+        *radius* allows the path to be made slightly larger or smaller.
         """
         if transform is not None:
             transform = transform.frozen()
@@ -518,10 +516,10 @@ class Path(object):
 
     def contains_path(self, path, transform=None):
         """
-        Returns *True* if this path completely contains the given path.
+        Returns whether this (closed) path completely contains the given path.
 
-        If *transform* is not *None*, the path will be transformed
-        before performing the test.
+        If *transform* is not ``None``, the path will be transformed before
+        performing the test.
         """
         if transform is not None:
             transform = transform.frozen()
diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py
index 09e044e..6bb51fd 100644
--- a/lib/matplotlib/pyplot.py
+++ b/lib/matplotlib/pyplot.py
@@ -979,8 +979,8 @@ def subplot(*args, **kwargs):
 
     .. note::
 
-       Creating a new subplot with a position which is entirely inside a
-       pre-existing axes will trigger the larger axes to be deleted::
+       Creating a subplot will delete any pre-existing subplot that overlaps
+       with it beyond sharing a boundary::
 
           import matplotlib.pyplot as plt
           # plot a line, implicitly creating a subplot(111)
@@ -1106,9 +1106,8 @@ def subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True,
         :class:`~matplotlib.gridspec.GridSpec` constructor used to create the
         grid the subplots are placed on.
 
-    fig_kw : dict, optional
-        Dict with keywords passed to the :func:`figure` call.  Note that all
-        keywords not recognized above will be automatically included here.
+    **fig_kw :
+        All additional keyword arguments are passed to the :func:`figure` call.
 
     Returns
     -------
@@ -2214,7 +2213,7 @@ def _setup_pyplot_info_docstrings():
 
     commands = get_plot_commands()
 
-    first_sentence = re.compile("(?:\s*).+?\.(?:\s+|$)", flags=re.DOTALL)
+    first_sentence = re.compile(r"(?:\s*).+?\.(?:\s+|$)", flags=re.DOTALL)
 
     # Collect the first sentence of the docstring for all of the
     # plotting commands.
diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py
index c9d8911..f9f5037 100644
--- a/lib/matplotlib/quiver.py
+++ b/lib/matplotlib/quiver.py
@@ -38,45 +38,57 @@ import math
 _quiver_doc = """
 Plot a 2-D field of arrows.
 
-call signatures::
+Call signatures::
 
   quiver(U, V, **kw)
   quiver(U, V, C, **kw)
   quiver(X, Y, U, V, **kw)
   quiver(X, Y, U, V, C, **kw)
 
-Arguments:
-
-  *X*, *Y*:
-    The x and y coordinates of the arrow locations (default is tail of
-    arrow; see *pivot* kwarg)
-
-  *U*, *V*:
-    Give the x and y components of the arrow vectors
+*U* and *V* are the arrow data, *X* and *Y* set the locaiton of the
+arrows, and *C* sets the color of the arrows. These arguments may be 1-D or
+2-D arrays or sequences.
 
-  *C*:
-    An optional array used to map colors to the arrows
-
-All arguments may be 1-D or 2-D arrays or sequences. If *X* and *Y*
-are absent, they will be generated as a uniform grid.  If *U* and *V*
-are 2-D arrays but *X* and *Y* are 1-D, and if ``len(X)`` and ``len(Y)``
-match the column and row dimensions of *U*, then *X* and *Y* will be
+If *X* and *Y* are absent, they will be generated as a uniform grid.
+If *U* and *V* are 2-D arrays and *X* and *Y* are 1-D, and if ``len(X)`` and
+``len(Y)`` match the column and row dimensions of *U*, then *X* and *Y* will be
 expanded with :func:`numpy.meshgrid`.
 
-*U*, *V*, *C* may be masked arrays, but masked *X*, *Y* are not
-supported at present.
+The default settings auto-scales the length of the arrows to a reasonable size.
+To change this behavior see the *scale* and *scale_units* kwargs.
 
-Keyword arguments:
+The defaults give a slightly swept-back arrow; to make the head a
+triangle, make *headaxislength* the same as *headlength*. To make the
+arrow more pointed, reduce *headwidth* or increase *headlength* and
+*headaxislength*. To make the head smaller relative to the shaft,
+scale down all the head parameters. You will probably do best to leave
+minshaft alone.
+
+*linewidths* and *edgecolors* can be used to customize the arrow
+outlines.
 
-  *units*: [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ]
-    Arrow units; the arrow dimensions *except for length* are in
-    multiples of this unit.
+Parameters
+----------
+X : 1D or 2D array, sequence, optional
+    The x coordinates of the arrow locations
+Y : 1D or 2D array, sequence, optional
+    The y coordinates of the arrow locations
+U : 1D or 2D array or masked array, sequence
+    The x components of the arrow vectors
+V : 1D or 2D array or masked array, sequence
+    The y components of the arrow vectors
+C : 1D or 2D array, sequence, optional
+    The arrow colors
+units : [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ]
+    The arrow dimensions (except for *length*) are measured in multiples of
+    this unit.
 
-    * 'width' or 'height': the width or height of the axes
+    'width' or 'height': the width or height of the axis
 
-    * 'dots' or 'inches': pixels or inches, based on the figure dpi
+    'dots' or 'inches': pixels or inches, based on the figure dpi
 
-    * 'x', 'y', or 'xy': *X*, *Y*, or sqrt(X^2+Y^2) data units
+    'x', 'y', or 'xy': respectively *X*, *Y*, or :math:`\sqrt{X^2 + Y^2}`
+    in data units
 
     The arrows scale differently depending on the units.  For
     'x' or 'y', the arrows get larger as one zooms in; for other
@@ -84,82 +96,82 @@ Keyword arguments:
     'width or 'height', the arrow size increases with the width and
     height of the axes, respectively, when the window is resized;
     for 'dots' or 'inches', resizing does not change the arrows.
+angles : [ 'uv' | 'xy' ], array, optional
+    Method for determining the angle of the arrows. Default is 'uv'.
 
-
-  *angles*: [ 'uv' | 'xy' | array ]
-    With the default 'uv', the arrow axis aspect ratio is 1, so that
+    'uv': the arrow axis aspect ratio is 1 so that
     if *U*==*V* the orientation of the arrow on the plot is 45 degrees
-    CCW from the horizontal axis (positive to the right).
-    With 'xy', the arrow points from (x,y) to (x+u, y+v).
+    counter-clockwise from the horizontal axis (positive to the right).
+
+    'xy': arrows point from (x,y) to (x+u, y+v).
     Use this for plotting a gradient field, for example.
+
     Alternatively, arbitrary angles may be specified as an array
-    of values in degrees, CCW from the horizontal axis.
+    of values in degrees, counter-clockwise from the horizontal axis.
+
     Note: inverting a data axis will correspondingly invert the
-    arrows *only* with `angles='xy'`.
+    arrows only with ``angles='xy'``.
+scale : None, float, optional
+    Number of data units per arrow length unit, e.g., m/s per plot width; a
+    smaller scale parameter makes the arrow longer. Default is *None*.
 
-  *scale*: [ *None* | float ]
-    Data units per arrow length unit, e.g., m/s per plot width; a smaller
-    scale parameter makes the arrow longer.  If *None*, a simple
-    autoscaling algorithm is used, based on the average vector length
-    and the number of vectors.  The arrow length unit is given by
+    If *None*, a simple autoscaling algorithm is used, based on the average
+    vector length and the number of vectors. The arrow length unit is given by
     the *scale_units* parameter
+scale_units : [ 'width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy' ], \
+None, optional
+    If the *scale* kwarg is *None*, the arrow length unit. Default is *None*.
 
-  *scale_units*: *None*, or any of the *units* options.
-    For example, if *scale_units* is 'inches', *scale* is 2.0, and
+    e.g. *scale_units* is 'inches', *scale* is 2.0, and
     ``(u,v) = (1,0)``, then the vector will be 0.5 inches long.
-    If *scale_units* is 'width', then the vector will be half the width
-    of the axes.
+
+    If *scale_units* is 'width'/'height', then the vector will be half the
+    width/height of the axes.
 
     If *scale_units* is 'x' then the vector will be 0.5 x-axis
-    units.  To plot vectors in the x-y plane, with u and v having
+    units. To plot vectors in the x-y plane, with u and v having
     the same units as x and y, use
-    "angles='xy', scale_units='xy', scale=1".
-
-  *width*:
+    ``angles='xy', scale_units='xy', scale=1``.
+width : scalar, optional
     Shaft width in arrow units; default depends on choice of units,
     above, and number of vectors; a typical starting value is about
     0.005 times the width of the plot.
-
-  *headwidth*: scalar
+headwidth : scalar, optional
     Head width as multiple of shaft width, default is 3
-
-  *headlength*: scalar
+headlength : scalar, optional
     Head length as multiple of shaft width, default is 5
-
-  *headaxislength*: scalar
+headaxislength : scalar, optional
     Head length at shaft intersection, default is 4.5
-
-  *minshaft*: scalar
+minshaft : scalar, optional
     Length below which arrow scales, in units of head length. Do not
     set this to less than 1, or small arrows will look terrible!
     Default is 1
-
-  *minlength*: scalar
+minlength : scalar, optional
     Minimum length as a multiple of shaft width; if an arrow length
     is less than this, plot a dot (hexagon) of this diameter instead.
     Default is 1.
-
-  *pivot*: [ 'tail' | 'mid' | 'middle' | 'tip' ]
+pivot : [ 'tail' | 'mid' | 'middle' | 'tip' ], optional
     The part of the arrow that is at the grid point; the arrow rotates
     about this point, hence the name *pivot*.
-
-  *color*: [ color | color sequence ]
+color : [ color | color sequence ], optional
     This is a synonym for the
     :class:`~matplotlib.collections.PolyCollection` facecolor kwarg.
     If *C* has been set, *color* has no effect.
 
-The defaults give a slightly swept-back arrow; to make the head a
-triangle, make *headaxislength* the same as *headlength*. To make the
-arrow more pointed, reduce *headwidth* or increase *headlength* and
-*headaxislength*. To make the head smaller relative to the shaft,
-scale down all the head parameters. You will probably do best to leave
-minshaft alone.
-
-linewidths and edgecolors can be used to customize the arrow
-outlines. Additional :class:`~matplotlib.collections.PolyCollection`
+Notes
+-----
+Additional :class:`~matplotlib.collections.PolyCollection`
 keyword arguments:
 
 %(PolyCollection)s
+
+Examples
+--------
+.. plot:: mpl_examples/pylab_examples/quiver_simple_demo.py
+
+See Also
+--------
+quiverkey : Add a key to a quiver plot
 """ % docstring.interpd.params
 
 _quiverkey_doc = """
diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py
index 762dcd6..8479d46 100644
--- a/lib/matplotlib/rcsetup.py
+++ b/lib/matplotlib/rcsetup.py
@@ -298,8 +298,9 @@ _str_err_msg = ('You must supply exactly {n:d} comma-separated values, '
 
 
 class validate_nseq_float(object):
-    def __init__(self, n=None):
+    def __init__(self, n=None, allow_none=False):
         self.n = n
+        self.allow_none = allow_none
 
     def __call__(self, s):
         """return a seq of n floats or raise"""
@@ -313,7 +314,10 @@ class validate_nseq_float(object):
             raise ValueError(err_msg.format(n=self.n, num=len(s), s=s))
 
         try:
-            return [float(val) for val in s]
+            return [float(val)
+                    if not self.allow_none or val is not None
+                    else val
+                    for val in s]
         except ValueError:
             raise ValueError('Could not convert all entries to floats')
 
@@ -465,6 +469,11 @@ validate_verbose = ValidateInStrings(
     'verbose',
     ['silent', 'helpful', 'debug', 'debug-annoying'])
 
+_validate_alignment = ValidateInStrings(
+    'alignment',
+    ['center', 'top', 'bottom', 'baseline',
+     'center_baseline'])
+
 def validate_whiskers(s):
     if s=='range':
         return 'range'
@@ -690,7 +699,7 @@ def validate_hatch(s):
         raise ValueError("Unknown hatch symbol(s): %s" % list(unknown))
     return s
 validate_hatchlist = _listify_validator(validate_hatch)
-validate_dashlist = _listify_validator(validate_nseq_float())
+validate_dashlist = _listify_validator(validate_nseq_float(allow_none=True))
 
 _prop_validators = {
         'color': _listify_validator(validate_color_for_prop_cycle,
@@ -923,9 +932,10 @@ defaultParams = {
     'lines.solid_joinstyle': ['round', validate_joinstyle],
     'lines.dash_capstyle':   ['butt', validate_capstyle],
     'lines.solid_capstyle':  ['projecting', validate_capstyle],
-    'lines.dashed_pattern':  [[2.8, 1.2], validate_nseq_float()],
-    'lines.dashdot_pattern': [[4.8, 1.2, 0.8, 1.2], validate_nseq_float()],
-    'lines.dotted_pattern':  [[1.1, 1.1], validate_nseq_float()],
+    'lines.dashed_pattern':  [[3.7, 1.6], validate_nseq_float(allow_none=True)],
+    'lines.dashdot_pattern': [[6.4, 1.6, 1, 1.6],
+                              validate_nseq_float(allow_none=True)],
+    'lines.dotted_pattern':  [[1, 1.65], validate_nseq_float(allow_none=True)],
     'lines.scale_dashes':  [True, validate_bool],
 
     # marker props
@@ -1195,6 +1205,7 @@ defaultParams = {
     # fontsize of the xtick labels
     'xtick.labelsize':   ['medium', validate_fontsize],
     'xtick.direction':   ['out', six.text_type],            # direction of xticks
+    'xtick.alignment': ["center", _validate_alignment],
 
     'ytick.left':        [True, validate_bool],  # draw ticks on the left side
     'ytick.right':       [False, validate_bool],  # draw ticks on the right side
@@ -1214,6 +1225,8 @@ defaultParams = {
     # fontsize of the ytick labels
     'ytick.labelsize':   ['medium', validate_fontsize],
     'ytick.direction':   ['out', six.text_type],            # direction of yticks
+    'ytick.alignment': ["center_baseline", _validate_alignment],
+
 
     'grid.color':        ['#b0b0b0', validate_color],  # grid color
     'grid.linestyle':    ['-', six.text_type],      # solid
diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py
index ca0292e..1ef63fe 100644
--- a/lib/matplotlib/scale.py
+++ b/lib/matplotlib/scale.py
@@ -251,7 +251,7 @@ class LogScale(ScaleBase):
         axis.set_minor_locator(LogLocator(self.base, self.subs))
         axis.set_minor_formatter(
             LogFormatterSciNotation(self.base,
-                                    labelOnlyBase=bool(self.subs)))
+                                    labelOnlyBase=(self.subs is not None)))
 
     def get_transform(self):
         """
diff --git a/lib/matplotlib/stackplot.py b/lib/matplotlib/stackplot.py
index 7915396..accbfa9 100644
--- a/lib/matplotlib/stackplot.py
+++ b/lib/matplotlib/stackplot.py
@@ -68,7 +68,8 @@ def stackplot(axes, x, *args, **kwargs):
 
     baseline = kwargs.pop('baseline', 'zero')
     # Assume data passed has not been 'stacked', so stack it here.
-    stack = np.cumsum(y, axis=0)
+    # We'll need a float buffer for the upcoming calculations.
+    stack = np.cumsum(y, axis=0, dtype=np.promote_types(y.dtype, np.float32))
 
     if baseline == 'zero':
         first_line = 0.
@@ -79,7 +80,7 @@ def stackplot(axes, x, *args, **kwargs):
 
     elif baseline == 'wiggle':
         m = y.shape[0]
-        first_line = (y * (m - 0.5 - np.arange(0, m)[:, None])).sum(0)
+        first_line = (y * (m - 0.5 - np.arange(m)[:, None])).sum(0)
         first_line /= -m
         stack += first_line
 
diff --git a/lib/matplotlib/style/core.py b/lib/matplotlib/style/core.py
index b1bc691..e986896 100644
--- a/lib/matplotlib/style/core.py
+++ b/lib/matplotlib/style/core.py
@@ -188,7 +188,14 @@ def read_style_directory(style_dir):
     """Return dictionary of styles defined in `style_dir`."""
     styles = dict()
     for path, name in iter_style_files(style_dir):
-        styles[name] = rc_params_from_file(path, use_default_template=False)
+        with warnings.catch_warnings(record=True) as warns:
+            styles[name] = rc_params_from_file(path,
+                                               use_default_template=False)
+
+        for w in warns:
+            message = 'In %s: %s' % (path, w.message)
+            warnings.warn(message)
+
     return styles
 
 
diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py
index 5927ea8..5e738ad 100644
--- a/lib/matplotlib/testing/decorators.py
+++ b/lib/matplotlib/testing/decorators.py
@@ -12,9 +12,9 @@ import shutil
 import warnings
 import unittest
 
-# Note - don't import nose up here - import it only as needed in functions. This
-# allows other functions here to be used by pytest-based testing suites without
-# requiring nose to be installed.
+# Note - don't import nose up here - import it only as needed in functions.
+# This allows other functions here to be used by pytest-based testing suites
+# without requiring nose to be installed.
 
 import numpy as np
 
@@ -163,7 +163,7 @@ def cleanup(style=None):
         return make_cleanup
     else:
         result = make_cleanup(style)
-        style = 'classic'
+        style = '_classic_test'
         return result
 
 
@@ -268,43 +268,42 @@ class ImageComparisonTest(CleanupTest):
 
 def image_comparison(baseline_images=None, extensions=None, tol=0,
                      freetype_version=None, remove_text=False,
-                     savefig_kwarg=None, style='classic'):
+                     savefig_kwarg=None, style='_classic_test'):
     """
     Compare images generated by the test with those specified in
     *baseline_images*, which must correspond else an
     ImageComparisonFailure exception will be raised.
 
-    Keyword arguments:
+    Arguments
+    ---------
+    baseline_images : list
+        A list of strings specifying the names of the images generated by
+        calls to :meth:`matplotlib.figure.savefig`.
 
-      *baseline_images*: list
-        A list of strings specifying the names of the images generated
-        by calls to :meth:`matplotlib.figure.savefig`.
-
-      *extensions*: [ None | list ]
-
-        If *None*, default to all supported extensions.
+    extensions : [ None | list ]
 
+        If None, defaults to all supported extensions.
         Otherwise, a list of extensions to test. For example ['png','pdf'].
 
-      *tol*: (default 0)
+    tol : float, optional, default: 0
         The RMS threshold above which the test is considered failed.
 
-      *freetype_version*: str or tuple
-        The expected freetype version or range of versions for this
-        test to pass.
+    freetype_version : str or tuple
+        The expected freetype version or range of versions for this test to
+        pass.
 
-      *remove_text*: bool
-        Remove the title and tick text from the figure before
-        comparison.  This does not remove other, more deliberate,
-        text, such as legends and annotations.
+    remove_text : bool
+        Remove the title and tick text from the figure before comparison.
+        This does not remove other, more deliberate, text, such as legends and
+        annotations.
 
-      *savefig_kwarg*: dict
+    savefig_kwarg : dict
         Optional arguments that are passed to the savefig method.
 
-      *style*: string
-        Optional name for the base style to apply to the image
-        test. The test itself can also apply additional styles
-        if desired. Defaults to the 'classic' style.
+    style : string
+        Optional name for the base style to apply to the image test. The test
+        itself can also apply additional styles if desired. Defaults to the
+        '_classic_test' style.
 
     """
     if baseline_images is None:
diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_dash.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_dash.png
index 1b1337a..20a48fb 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_dash.png and b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_dash.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.pdf b/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.pdf
index 9e2b78a..054fe8d 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.pdf and b/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.png b/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.png
index 2af7a6b..cf2ebc3 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.png and b/lib/matplotlib/tests/baseline_images/test_artist/clip_path_clipping.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_artist/hatching.pdf b/lib/matplotlib/tests/baseline_images/test_artist/hatching.pdf
index 7a25631..c812f81 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_artist/hatching.pdf and b/lib/matplotlib/tests/baseline_images/test_artist/hatching.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_artist/hatching.png b/lib/matplotlib/tests/baseline_images/test_artist/hatching.png
index d2bda07..9ecdc73 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_artist/hatching.png and b/lib/matplotlib/tests/baseline_images/test_artist/hatching.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/arrow_simple.png b/lib/matplotlib/tests/baseline_images/test_axes/arrow_simple.png
new file mode 100644
index 0000000..a9731f8
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_axes/arrow_simple.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png b/lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png
new file mode 100644
index 0000000..11523f3
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_axes/bar_tick_label_multiple_old_label_alignment.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.pdf b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.pdf
index 0e1fdc2..57e0fb4 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.pdf and b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.png b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.png
index 79936d3..61507b3 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.png and b/lib/matplotlib/tests/baseline_images/test_axes/boxplot_rc_parameters.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png
index 270f269..19e3731 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custombox.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png
index 495fd66..cced1e5 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_customcap.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png
index ed012ca..c7c22b9 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custommedian.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png
index 857af42..e1aafcd 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_custompatchartist.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png
index 7333ec5..966cc5a 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png and b/lib/matplotlib/tests/baseline_images/test_axes/bxp_withmean_line.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf
new file mode 100644
index 0000000..ea5a6c8
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png
new file mode 100644
index 0000000..07fba85
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg b/lib/matplotlib/tests/baseline_images/test_image/imshow_masked_interpolation.svg
new file mode 100644
index 0000000..af53f58
diff --git a/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png b/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png
index 6433cd3..4474942 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png and b/lib/matplotlib/tests/baseline_images/test_image/mask_image_over_under.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_legend/hatching.pdf b/lib/matplotlib/tests/baseline_images/test_legend/hatching.pdf
new file mode 100644
index 0000000..e345dbf
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_legend/hatching.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_legend/hatching.png b/lib/matplotlib/tests/baseline_images/test_legend/hatching.png
new file mode 100644
index 0000000..9a309c9
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_legend/hatching.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_legend/hatching.svg b/lib/matplotlib/tests/baseline_images/test_legend/hatching.svg
new file mode 100644
index 0000000..a662f64
diff --git a/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.pdf b/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.pdf
index c824433..c644b4c 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.pdf and b/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.png b/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.png
index f75601b..ab63172 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.png and b/lib/matplotlib/tests/baseline_images/test_lines/scaled_lines.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.pdf
new file mode 100644
index 0000000..57557e2
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.png
new file mode 100644
index 0000000..1574167
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_cm_81.svg
new file mode 100644
index 0000000..a8401a2
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.pdf
new file mode 100644
index 0000000..bfecc8a
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.png
new file mode 100644
index 0000000..464ddbb
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavusans_81.svg
new file mode 100644
index 0000000..e1f7760
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.pdf
new file mode 100644
index 0000000..0dcae70
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.png
new file mode 100644
index 0000000..f9726f5
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_dejavuserif_81.svg
new file mode 100644
index 0000000..3e5b53c
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.pdf
new file mode 100644
index 0000000..fa5ae33
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.png
new file mode 100644
index 0000000..7fd3e4d
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix_81.svg
new file mode 100644
index 0000000..c27df7f
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.pdf
new file mode 100644
index 0000000..db90921
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.png
new file mode 100644
index 0000000..d05e3ef
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans_81.svg
new file mode 100644
index 0000000..d8fdb0a
diff --git a/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.pdf b/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.pdf
new file mode 100644
index 0000000..e956cbd
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.png b/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.png
new file mode 100644
index 0000000..21ffd73
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.svg b/lib/matplotlib/tests/baseline_images/test_patches/multi_color_hatch.svg
new file mode 100644
index 0000000..0fde894
diff --git a/lib/matplotlib/tests/baseline_images/test_path/nan_path.eps b/lib/matplotlib/tests/baseline_images/test_path/nan_path.eps
new file mode 100644
index 0000000..48d473a
diff --git a/lib/matplotlib/tests/baseline_images/test_path/nan_path.pdf b/lib/matplotlib/tests/baseline_images/test_path/nan_path.pdf
new file mode 100644
index 0000000..5734691
diff --git a/lib/matplotlib/tests/baseline_images/test_path/nan_path.png b/lib/matplotlib/tests/baseline_images/test_path/nan_path.png
new file mode 100644
index 0000000..1990596
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_path/nan_path.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_path/nan_path.svg b/lib/matplotlib/tests/baseline_images/test_path/nan_path.svg
new file mode 100644
index 0000000..e75b534
diff --git a/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png b/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png
index d4950d5..13a7772 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png and b/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/collection.pdf b/lib/matplotlib/tests/baseline_images/test_patheffects/collection.pdf
index eb8e139..0d23d23 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/collection.pdf and b/lib/matplotlib/tests/baseline_images/test_patheffects/collection.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/collection.png b/lib/matplotlib/tests/baseline_images/test_patheffects/collection.png
index f284835..4fde9d9 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/collection.png and b/lib/matplotlib/tests/baseline_images/test_patheffects/collection.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.pdf b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.pdf
index 7498dbf..8adac0a 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.pdf and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.png b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.png
index 3025a87..3cf4ce9 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.png and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect1.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.pdf b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.pdf
index c6b6a0b..ef1f893 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.pdf and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.png b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.png
index 5b0f42b..44a2a5d 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.png and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect2.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.pdf b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.pdf
index f921494..ad98ff7 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.pdf and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.png b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.png
index f9323ad..879f6ab 100644
Binary files a/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.png and b/lib/matplotlib/tests/baseline_images/test_patheffects/patheffect3.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/stroked_text.png b/lib/matplotlib/tests/baseline_images/test_patheffects/stroked_text.png
new file mode 100644
index 0000000..3119754
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_patheffects/stroked_text.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_text/font_scaling.pdf b/lib/matplotlib/tests/baseline_images/test_text/font_scaling.pdf
new file mode 100644
index 0000000..72b73eb
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_text/font_scaling.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.pdf b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.pdf
new file mode 100644
index 0000000..c694c84
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.pdf differ
diff --git a/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png
new file mode 100644
index 0000000..2d63e69
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.png differ
diff --git a/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.svg b/lib/matplotlib/tests/baseline_images/test_tightlayout/tight_layout9.svg
new file mode 100644
index 0000000..ea6a6ea
diff --git a/lib/matplotlib/tests/baseline_images/test_widgets/check_radio_buttons.png b/lib/matplotlib/tests/baseline_images/test_widgets/check_radio_buttons.png
new file mode 100644
index 0000000..c1ed743
Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_widgets/check_radio_buttons.png differ
diff --git a/lib/matplotlib/tests/test_afm.py b/lib/matplotlib/tests/test_afm.py
new file mode 100644
index 0000000..ca8583d
diff --git a/lib/matplotlib/tests/test_marker.py b/lib/matplotlib/tests/test_marker.py
new file mode 100644
index 0000000..42790f7
diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py
index 1fc3de7..34bc85e 100644
--- a/lib/matplotlib/ticker.py
+++ b/lib/matplotlib/ticker.py
@@ -197,16 +197,7 @@ def _divmod(x, y):
 
 
 def _mathdefault(s):
-    """
-    For backward compatibility, in classic mode we display
-    sub/superscripted text in a mathdefault block.  As of 2.0, the
-    math font already matches the default font, so we don't need to do
-    that anymore.
-    """
-    if rcParams['_internal.classic_mode']:
-        return '\\mathdefault{%s}' % s
-    else:
-        return '{%s}' % s
+    return '\\mathdefault{%s}' % s
 
 
 class _DummyAxis(object):
@@ -958,7 +949,8 @@ class LogFormatter(Formatter):
             s = '%1.0e' % x
         else:
             s = self.pprint_val(x, vmax - vmin)
-
+        return s
+   
     def __call__(self, x, pos=None):
         """
         Return the format for tick val `x`.
@@ -1979,8 +1971,6 @@ class LogLocator(Locator):
                     return np.array([])  # no minor or major ticks
                 else:
                     subs = np.array([1.0])  # major ticks
-            elif numdec > 5 and b >= 6:
-                subs = np.arange(_first, b, 2.0)
             else:
                 subs = np.arange(_first, b)
         else:
@@ -1996,17 +1986,25 @@ class LogLocator(Locator):
             while numdec // stride + 1 > numticks:
                 stride += 1
 
+        # Does subs include anything other than 1?
+        have_subs = len(subs) > 1 or (len(subs == 1) and subs[0] != 1.0)
+
         decades = np.arange(math.floor(vmin) - stride,
                             math.ceil(vmax) + 2 * stride, stride)
+
         if hasattr(self, '_transform'):
             ticklocs = self._transform.inverted().transform(decades)
-            if len(subs) > 1 or (len(subs == 1) and subs[0] != 1.0):
-                ticklocs = np.ravel(np.outer(subs, ticklocs))
+            if have_subs:
+                if stride == 1:
+                    ticklocs = np.ravel(np.outer(subs, ticklocs))
+                else:
+                    ticklocs = []
         else:
-            if len(subs) > 1 or (len(subs == 1) and subs[0] != 1.0):
+            if have_subs:
                 ticklocs = []
-                for decadeStart in b ** decades:
-                    ticklocs.extend(subs * decadeStart)
+                if stride == 1:
+                    for decadeStart in b ** decades:
+                        ticklocs.extend(subs * decadeStart)
             else:
                 ticklocs = b ** decades
 
diff --git a/lib/matplotlib/tight_layout.py b/lib/matplotlib/tight_layout.py
index 18a1937..f9caddf 100644
--- a/lib/matplotlib/tight_layout.py
+++ b/lib/matplotlib/tight_layout.py
@@ -123,7 +123,11 @@ def auto_adjust_subplotpars(fig, renderer,
     for subplots, ax_bbox, (num1, num2) in zip(subplot_list,
                                                ax_bbox_list,
                                                num1num2_list):
-        tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots])
+        if all([not ax.get_visible() for ax in subplots]):
+            continue
+
+        tight_bbox_raw = union([ax.get_tightbbox(renderer) for ax in subplots
+                                if ax.get_visible()])
         tight_bbox = TransformedBbox(tight_bbox_raw,
                                      fig.transFigure.inverted())
 
diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py
index a002a66..6451899 100644
--- a/lib/matplotlib/widgets.py
+++ b/lib/matplotlib/widgets.py
@@ -539,9 +539,8 @@ class CheckButtons(AxesWidget):
             w, h = dy / 2., dy / 2.
             x, y = 0.05, y - h / 2.
 
-            p = Rectangle(xy=(x, y), width=w, height=h,
-                          facecolor=axcolor,
-                          transform=ax.transAxes)
+            p = Rectangle(xy=(x, y), width=w, height=h, edgecolor='black',
+                          facecolor=axcolor, transform=ax.transAxes)
 
             l1 = Line2D([x, x + w], [y + h, y], **lineparams)
             l2 = Line2D([x, x + w], [y, y + h], **lineparams)
@@ -686,8 +685,8 @@ class RadioButtons(AxesWidget):
             else:
                 facecolor = axcolor
 
-            p = Circle(xy=(0.15, y), radius=0.05, facecolor=facecolor,
-                       transform=ax.transAxes)
+            p = Circle(xy=(0.15, y), radius=0.05, edgecolor='black',
+                       facecolor=facecolor, transform=ax.transAxes)
 
             self.labels.append(t)
             self.circles.append(p)
@@ -1758,8 +1757,8 @@ class RectangleSelector(_SelectorWidget):
                                  alpha=0.2, fill=True)
             rectprops['animated'] = self.useblit
             self.rectprops = rectprops
-            self.to_draw = self._shape_klass((0, 0),
-                                     0, 1, visible=False, **self.rectprops)
+            self.to_draw = self._shape_klass((0, 0), 0, 1, visible=False,
+                                             **self.rectprops)
             self.ax.add_patch(self.to_draw)
         if drawtype == 'line':
             if lineprops is None:
@@ -2170,9 +2169,9 @@ class LassoSelector(_SelectorWidget):
     """
 
     def __init__(self, ax, onselect=None, useblit=True, lineprops=None,
-            button=None):
+                 button=None):
         _SelectorWidget.__init__(self, ax, onselect, useblit=useblit,
-            button=button)
+                                 button=button)
 
         self.verts = None
 
diff --git a/lib/mpl_toolkits/axes_grid1/axes_rgb.py b/lib/mpl_toolkits/axes_grid1/axes_rgb.py
index b4a76eb..e62d4f0 100644
--- a/lib/mpl_toolkits/axes_grid1/axes_rgb.py
+++ b/lib/mpl_toolkits/axes_grid1/axes_rgb.py
@@ -202,23 +202,20 @@ class RGBAxesBase(object):
         g : matplotlib.image.AxesImage
         b : matplotlib.image.AxesImage
         """
-        ny, nx = r.shape
-        if not ((nx, ny) == g.shape == b.shape):
+        if not (r.shape == g.shape == b.shape):
             raise ValueError('Input shapes do not match.'
-                             '\nr.shape = {0}'
-                             '\ng.shape = {1}'
-                             '\nb.shape = {2}'
-                             ''.format(r.shape, g.shape, b.shape))
-
-        R = np.zeros([ny, nx, 3], dtype="d")
+                             '\nr.shape = {}'
+                             '\ng.shape = {}'
+                             '\nb.shape = {}'
+                             .format(r.shape, g.shape, b.shape))
+        RGB = np.dstack([r, g, b])
+        R = np.zeros_like(RGB)
         R[:,:,0] = r
-        G = np.zeros_like(R)
+        G = np.zeros_like(RGB)
         G[:,:,1] = g
-        B = np.zeros_like(R)
+        B = np.zeros_like(RGB)
         B[:,:,2] = b
 
-        RGB = R + G + B
-
         im_rgb = self.RGB.imshow(RGB, **kwargs)
         im_r = self.R.imshow(R, **kwargs)
         im_g = self.G.imshow(G, **kwargs)
diff --git a/matplotlibrc.template b/matplotlibrc.template
index f5dce98..d1e2e8c 100644
--- a/matplotlibrc.template
+++ b/matplotlibrc.template
@@ -399,10 +399,10 @@ backend      : $TEMPLATE_BACKEND
 #ytick.labelsize      : medium # fontsize of the tick labels
 #ytick.direction      : out    # direction: in, out, or inout
 #ytick.minor.visible  : False  # visibility of minor ticks on y-axis
-#xtick.major.left     : True   # draw y axis left major ticks
-#xtick.major.right    : True   # draw y axis right major ticks
-#xtick.minor.left     : True   # draw y axis left minor ticks
-#xtick.minor.right    : True   # draw y axis right minor ticks
+#ytick.major.left     : True   # draw y axis left major ticks
+#ytick.major.right    : True   # draw y axis right major ticks
+#ytick.minor.left     : True   # draw y axis left minor ticks
+#ytick.minor.right    : True   # draw y axis right minor ticks
 
 
 ### GRIDS
diff --git a/setup.cfg.template b/setup.cfg.template
index d2e7db4..e8ba468 100644
--- a/setup.cfg.template
+++ b/setup.cfg.template
@@ -18,7 +18,7 @@
 [status]
 # To suppress display of the dependencies and their versions
 # at the top of the build log, uncomment the following line:
-#suppress = False
+#suppress = True 
 
 [packages]
 # There are a number of subpackages of Matplotlib that are considered
diff --git a/src/ft2font.cpp b/src/ft2font.cpp
index ffcddf4..3aa58d8 100644
--- a/src/ft2font.cpp
+++ b/src/ft2font.cpp
@@ -280,9 +280,8 @@ int FT2Font::get_path_count()
             }
         }
 
-        count++;
-
     Count_Close:
+        count++;
         first = last + 1;
     }
 
@@ -478,11 +477,10 @@ void FT2Font::get_path(double *outpoints, unsigned char *outcodes)
             }
         }
 
+    Close:
         (*outpoints++) = 0.0;
         (*outpoints++) = 0.0;
         (*outcodes++) = ENDPOLY;
-
-    Close:
         first = last + 1;
     }
 }
diff --git a/src/path_converters.h b/src/path_converters.h
index d19b17d..3150b18 100644
--- a/src/path_converters.h
+++ b/src/path_converters.h
@@ -343,6 +343,7 @@ class PathClipper : public EmbeddedQueue<3>
     unsigned vertex(double *x, double *y)
     {
         unsigned code;
+        bool emit_moveto = false;
 
         if (m_do_clipping) {
             /* This is the slow path where we actually do clipping */
@@ -352,6 +353,8 @@ class PathClipper : public EmbeddedQueue<3>
             }
 
             while ((code = m_source->vertex(x, y)) != agg::path_cmd_stop) {
+                emit_moveto = false;
+
                 switch (code) {
                 case (agg::path_cmd_end_poly | agg::path_flags_close):
                     if (m_has_init) {
@@ -363,10 +366,30 @@ class PathClipper : public EmbeddedQueue<3>
                     goto exit_loop;
 
                 case agg::path_cmd_move_to:
+
+                    // was the last command a moveto (and we have
+                    // seen at least one command ?
+                    // if so, shove it in the queue if in clip box
+                    if (m_moveto && m_has_init &&
+                        m_lastX >= m_cliprect.x1 &&
+                        m_lastX <= m_cliprect.x2 &&
+                        m_lastY >= m_cliprect.y1 &&
+                        m_lastY <= m_cliprect.y2) {
+                        // push the last moveto onto the queue
+                        queue_push(agg::path_cmd_move_to, m_lastX, m_lastY);
+                        // flag that we need to emit it
+                        emit_moveto = true;
+                    }
+                    // update the internal state for this moveto
                     m_initX = m_lastX = *x;
                     m_initY = m_lastY = *y;
                     m_has_init = true;
                     m_moveto = true;
+                    // if the last command was moveto exit the loop to emit the code
+                    if (emit_moveto) {
+                        goto exit_loop;
+                    }
+                    // else, break and get the next point
                     break;
 
                 case agg::path_cmd_line_to:

--- End Message ---
--- Begin Message ---
Hi,

On Fri, Jun 02, 2017 at 09:33:17AM -0400, Sandro Tosi wrote:
> > I know it's late in the release, but 2.0.0 was a big milestone for upstream, so
> > some adjustments/bug fixes were expected. matplotlib is continuosly tested via
> > travis[1] and you can see there how the 2.0.x branch is passing the upstream
> > very extensive test suite.
> >
> > [1] https://travis-ci.org/matplotlib/matplotlib/branches
> >
> > An upsteam source diff is attached, filtering out doc/tests/examples; a full
> > diff is available at [2] or via git.
> >
> > [2] https://anonscm.debian.org/cgit/python-modules/packages/matplotlib.git/commit/?h=upstream&id=4816639bd3468d3e9f9cc9fed76324fdc8e0c9b6
> >
> > let me know if it's possible for me to proceed with an upload.
> 
> Any word on this?

I'm sorry, but we're very close to the release and this change is rather
large, so I'm going to have to deny this request.

Cheers,

Ivo

--- End Message ---

Reply to: