This library does not contain any files from the matplotlib project, nor
does it make any changes to it. On the other hand, the code contained herein
is perfectly useless without a separate installation of matplotlib.
I don't know enough about US copyright law to decide whether this implies
that this library "uses" or is "based on" matplotlib.
In any case, matplotlib comes with the following license:

License agreement for matplotlib 1.4.3
1. This LICENSE AGREEMENT is between the Matplotlib Development Team (“MDT”),
   and the Individual or Organization (“Licensee”) accessing and otherwise
   using matplotlib software in source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, MDT hereby grants
   Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze,
   test, perform and/or display publicly, prepare derivative works, distribute, and
   otherwise use matplotlib 1.4.3 alone or in any derivative version, provided, however,
   that MDT’s License Agreement and MDT’s notice of copyright, i.e.,
   “Copyright (c) 2012-2013 Matplotlib Development Team; All Rights Reserved” are retained
   in matplotlib 1.4.3 alone or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on or incorporates
   matplotlib 1.4.3 or any part thereof, and wants to make the derivative work available
   to others as provided herein, then Licensee hereby agrees to include in any such work a
   brief summary of the changes made to matplotlib 1.4.3.

4. MDT is making matplotlib 1.4.3 available to Licensee on an “AS IS” basis. MDT MAKES NO
   REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION,
   MDT MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
   FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 1.4.3 WILL NOT INFRINGE ANY
   THIRD PARTY RIGHTS.

5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 1.4.3 FOR ANY
   INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING,
   DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 1.4.3, OR ANY DERIVATIVE THEREOF,
   EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material breach of
   its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any relationship of
   agency, partnership, or joint venture between MDT and Licensee. This License
   Agreement does not grant permission to use MDT trademarks or trade name in a
   trademark sense to endorse or promote products or services of Licensee, or any
   third party.

8. By copying, installing or otherwise using matplotlib 1.4.3, Licensee agrees to be
   bound by the terms and conditions of this License Agreement.
