From 0157212ca40327e1c28519fb9f7a718981549ab2 Mon Sep 17 00:00:00 2001 From: "Jonathan A. Gross" Date: Wed, 19 Nov 2014 19:09:52 -0700 Subject: [PATCH 01/61] from __future__ import print_function so print works same for Python 2 & 3 --- AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb | 73 +++++++++++-------- AnatomyOfMatplotlib-Part1-pyplot.ipynb | 8 +- AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb | 6 +- AnatomyOfMatplotlib-Part3-Artists.ipynb | 6 +- 4 files changed, 55 insertions(+), 38 deletions(-) diff --git a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb index c146d40..b0797f4 100644 --- a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb +++ b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb @@ -1,13 +1,24 @@ { "metadata": { "name": "", - "signature": "sha256:90ccb5909624353434d7af8f1073a89ba8f8f43775a430cf536d07701670eb19" + "signature": "sha256:291c02e0eda1008690ba35d47865fd743d899737c6c702e384430e08988052a0" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -39,9 +50,9 @@ "collapsed": false, "input": [ "a = np.array([1, 2, 3])\n", - "print a.shape\n", - "print a.size\n", - "print a.ndim" + "print(a.shape)\n", + "print(a.size)\n", + "print(a.ndim)" ], "language": "python", "metadata": {}, @@ -52,9 +63,9 @@ "collapsed": false, "input": [ "x = np.arange(100)\n", - "print x.shape\n", - "print x.size\n", - "print x.ndim" + "print(x.shape)\n", + "print(x.size)\n", + "print(x.ndim)" ], "language": "python", "metadata": {}, @@ -65,9 +76,9 @@ "collapsed": false, "input": [ "y = np.random.rand(5, 80)\n", - "print y.shape\n", - "print y.size\n", - "print y.ndim" + "print(y.shape)\n", + "print(y.size)\n", + "print(y.ndim)" ], "language": "python", "metadata": {}, @@ -86,7 +97,7 @@ "collapsed": false, "input": [ "x.shape = (20, 5)\n", - "print x" + "print(x)" ], "language": "python", "metadata": {}, @@ -104,7 +115,7 @@ "collapsed": false, "input": [ "y.shape = (4, 20, -1)\n", - "print y.shape" + "print(y.shape)" ], "language": "python", "metadata": {}, @@ -122,7 +133,7 @@ "collapsed": false, "input": [ "# Scalar Indexing\n", - "print x[2]" + "print(x[2])" ], "language": "python", "metadata": {}, @@ -133,7 +144,7 @@ "collapsed": false, "input": [ "# Slicing\n", - "print x[2:5]" + "print(x[2:5])" ], "language": "python", "metadata": {}, @@ -144,10 +155,10 @@ "collapsed": false, "input": [ "# Advanced slicing\n", - "print \"First 5 rows\\n\", x[:5]\n", - "print \"Row 18 to the end\\n\", x[18:]\n", - "print \"Last 5 rows\\n\", x[-5:]\n", - "print \"Reverse the rows\\n\", x[::-1]" + "print(\"First 5 rows\\n\", x[:5])\n", + "print(\"Row 18 to the end\\n\", x[18:])\n", + "print(\"Last 5 rows\\n\", x[-5:])\n", + "print(\"Reverse the rows\\n\", x[::-1])" ], "language": "python", "metadata": {}, @@ -158,7 +169,7 @@ "collapsed": false, "input": [ "# Boolean Indexing\n", - "print x[(x % 2) == 0]" + "print(x[(x % 2) == 0])" ], "language": "python", "metadata": {}, @@ -169,7 +180,7 @@ "collapsed": false, "input": [ "# Fancy Indexing -- Note the use of a list, not tuple!\n", - "print x[[1, 3, 8, 9, 2]]" + "print(x[[1, 3, 8, 9, 2]])" ], "language": "python", "metadata": {}, @@ -187,8 +198,8 @@ "cell_type": "code", "collapsed": true, "input": [ - "print \"Shape of X:\", x.shape\n", - "print \"Shape of Y:\", y.shape" + "print(\"Shape of X:\", x.shape)\n", + "print(\"Shape of Y:\", y.shape)" ], "language": "python", "metadata": {}, @@ -206,13 +217,13 @@ "collapsed": false, "input": [ "a = x + y\n", - "print a.shape\n", + "print(a.shape)\n", "b = x[np.newaxis, :, :] + y\n", - "print b.shape\n", + "print(b.shape)\n", "c = np.tile(x, (4, 1, 1)) + y\n", - "print c.shape\n", - "print \"Are a and b identical?\", np.all(a == b)\n", - "print \"Are a and c identical?\", np.all(a == c)" + "print(c.shape)\n", + "print(\"Are a and b identical?\", np.all(a == b))\n", + "print(\"Are a and c identical?\", np.all(a == c))" ], "language": "python", "metadata": {}, @@ -231,9 +242,9 @@ "input": [ "x = np.arange(-5, 5, 0.1)\n", "y = np.arange(-8, 8, 0.25)\n", - "print x.shape, y.shape\n", + "print(x.shape, y.shape)\n", "z = x[np.newaxis, :] * y[:, np.newaxis]\n", - "print z.shape" + "print(z.shape)" ], "language": "python", "metadata": {}, @@ -245,9 +256,9 @@ "input": [ "# More concisely\n", "y, x = np.ogrid[-8:8:0.25, -5:5:0.1]\n", - "print x.shape, y.shape\n", + "print(x.shape, y.shape)\n", "z = x * y\n", - "print z.shape" + "print(z.shape)" ], "language": "python", "metadata": {}, diff --git a/AnatomyOfMatplotlib-Part1-pyplot.ipynb b/AnatomyOfMatplotlib-Part1-pyplot.ipynb index d7d75cb..023072a 100644 --- a/AnatomyOfMatplotlib-Part1-pyplot.ipynb +++ b/AnatomyOfMatplotlib-Part1-pyplot.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:c7159e6f4ecac56d72f7333ed9bb24bbfeb4c66fba3000a1b2cb3c382fd148fd" + "signature": "sha256:6302a88e9db31d8d9cfae2b0103e57708f94b802a561930d11298cd246e9d590" }, "nbformat": 3, "nbformat_minor": 0, @@ -12,6 +12,8 @@ "cell_type": "code", "collapsed": false, "input": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n", "# Turning on inline plots -- just for use in ipython notebooks.\n", "%matplotlib inline" ], @@ -64,8 +66,8 @@ "collapsed": false, "input": [ "import matplotlib\n", - "print matplotlib.__version__\n", - "print matplotlib.get_backend()" + "print(matplotlib.__version__)\n", + "print(matplotlib.get_backend())" ], "language": "python", "metadata": {}, diff --git a/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb index 7375057..68db2a5 100644 --- a/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:e1f772cda181207fb767d95705c04a7a3d95f8d83188cf282ca42ddd7bde2d9c" + "signature": "sha256:fd78007a40ee7741b1dcfaa7d2433f856d967b938376774e12322eeccaf2f9ec" }, "nbformat": 3, "nbformat_minor": 0, @@ -12,6 +12,8 @@ "cell_type": "code", "collapsed": false, "input": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n", "# Turning on inline plots -- just for use in ipython notebooks.\n", "%matplotlib inline\n", "import numpy as np\n", @@ -574,7 +576,7 @@ "collapsed": false, "input": [ "import matplotlib\n", - "print matplotlib.matplotlib_fname()" + "print(matplotlib.matplotlib_fname())" ], "language": "python", "metadata": {}, diff --git a/AnatomyOfMatplotlib-Part3-Artists.ipynb b/AnatomyOfMatplotlib-Part3-Artists.ipynb index 125dc6b..6fa83d8 100644 --- a/AnatomyOfMatplotlib-Part3-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part3-Artists.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:8e508bf3316b2a5e920e25f9597d595277a37bede03ba337428c5c16762373a7" + "signature": "sha256:0ed463ce3e3c15589941f95292232da728af5c8fd4698e2ece99a953d2619171" }, "nbformat": 3, "nbformat_minor": 0, @@ -12,6 +12,8 @@ "cell_type": "code", "collapsed": false, "input": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n", "# Turning on inline plots -- just for use in ipython notebooks.\n", "%matplotlib inline\n", "import numpy as np\n", @@ -171,7 +173,7 @@ "collapsed": false, "input": [ "fig, ax = plt.subplots(1, 1)\n", - "print plt.getp(fig.patch)" + "print(plt.getp(fig.patch))" ], "language": "python", "metadata": {}, From 1b793826317cdbdd2fdb08ff8a30adf050ea03c6 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 21 Jun 2015 22:08:24 -0500 Subject: [PATCH 02/61] Overhaul of Part 1 --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 979 ++++++++++++++++++ AnatomyOfMatplotlib-Part1-pyplot.ipynb | 846 --------------- exercises/1.1-limits.py | 3 - exercises/1.1-subplots_and_basic_plotting.py | 11 + exercises/1.2-legends_and_scaling.py | 15 + exercises/1.2-spines.py | 23 - .../1.3-spines_ticks_and_subplot_spacing.py | 9 + images/exercise_1-1.png | Bin 0 -> 41356 bytes images/exercise_1-2.png | Bin 0 -> 39667 bytes images/exercise_1.3.png | Bin 0 -> 22841 bytes images/figure_axes_axis_labeled.png | Bin 0 -> 185257 bytes solutions/1.1-limits.py | 3 - solutions/1.1-subplots_and_basic_plotting.py | 14 + solutions/1.2-legends_and_scaling.py | 18 + solutions/1.2-spines.py | 12 - .../1.3-spines_ticks_and_subplot_spacing.py | 25 + 16 files changed, 1071 insertions(+), 887 deletions(-) create mode 100644 AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb delete mode 100644 AnatomyOfMatplotlib-Part1-pyplot.ipynb delete mode 100644 exercises/1.1-limits.py create mode 100644 exercises/1.1-subplots_and_basic_plotting.py create mode 100644 exercises/1.2-legends_and_scaling.py delete mode 100644 exercises/1.2-spines.py create mode 100644 exercises/1.3-spines_ticks_and_subplot_spacing.py create mode 100644 images/exercise_1-1.png create mode 100644 images/exercise_1-2.png create mode 100644 images/exercise_1.3.png create mode 100644 images/figure_axes_axis_labeled.png delete mode 100644 solutions/1.1-limits.py create mode 100644 solutions/1.1-subplots_and_basic_plotting.py create mode 100644 solutions/1.2-legends_and_scaling.py delete mode 100644 solutions/1.2-spines.py create mode 100644 solutions/1.3-spines_ticks_and_subplot_spacing.py diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb new file mode 100644 index 0000000..fd48d10 --- /dev/null +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -0,0 +1,979 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "# Matplotlib\n", + "## Introduction\n", + "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Online Documentation\n", + "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", + "\n", + "## Gallery\n", + "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", + "\n", + "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", + "\n", + "## Mailing Lists and StackOverflow\n", + "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](http://sourceforge.net/mail/?group_id=80706). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "\n", + "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too!\n", + "\n", + "## Github repository\n", + "### Location\n", + "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", + "\n", + "### Bug Reports and feature requests\n", + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://github.com/matplotlib/matplotlib/wiki))." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quick note on \"backends\" and IPython notebooks\n", + "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.4.3\n", + "Qt4Agg\n" + ] + } + ], + "source": [ + "import matplotlib\n", + "print(matplotlib.__version__)\n", + "print(matplotlib.get_backend())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", + "\n", + "Inside of IPython, it's often easiest to use the IPython ``nbagg`` backend. This allows plots to be displayed and interacted with inline in the browser in an IPython notebook. Otherwise, figures will pop up in a separate gui window.\n", + "\n", + "We can do this in two ways:\n", + "\n", + "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", + " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", + " \n", + "2. ``matplotlib.use(\"backend_name\")``\n", + " - Figures will only be shown when you call ``plt.show()``.\n", + "\n", + "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", + "\n", + "One final note: You need to do this before you ``import matplotlib.pyplot``." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "matplotlib.use('nbagg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On with the show!\n", + "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", + "\n", + "###Anatomy of a \"Plot\"\n", + "\n", + "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", + "\n", + "\n", + "\n", + "\n", + "The ``Figure`` is the top-level container in this hirearchy. It's the overall window/page that everything is drawn on. You can have multiple independent figures, but they can't contain another figure. However, ``Figure``s can contain multiple ``Axes``. \n", + "\n", + "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an axes with a call to ``subplot`` (which places axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of thse.\n", + "\n", + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from. Each ``Axes`` has two ``Axis`` instances.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Getting Started\n", + "\n", + "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Figures\n", + "\n", + "Now let's create a figure..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Awww, nothing happened! This is because by default mpl will not show anything until told to do so, as we mentioned earlier in the \"backend\" discussion.\n", + "\n", + "Instead, we'll need to call ``plt.show()``" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, a blank figure! Not terribly useful yet.\n", + "\n", + "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", + "\n", + "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Twice as tall as it is wide:\n", + "fig = plt.figure(figsize=plt.figaspect(2.0))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axes\n", + "\n", + "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object.\n", + "\n", + "Typically, you'll set up a `Figure`, and then add an `Axes` to it. \n", + "\n", + "You can use `fig.add_axes`, but in most cases, you'll find that adding a subplot will fit your needs perfectly. (Again a \"subplot\" is just an axes on a grid system.) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", + "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. (This dates from a time before Python's ``property``.) \n", + "\n", + "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", + "\n", + "For example, we could have written the third line above as:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ax.set_xlim([0.5, 4.5])\n", + "ax.set_ylim([-2, 8])\n", + "ax.set_title('An Example Axes')\n", + "ax.set_ylabel('Y-Axis')\n", + "ax.set_xlabel('X-Axis')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Clearly this can get repitive quickly. Therefore, Matplotlib's `set` method can be very handy. It takes each kwarg you pass it and tries to call the corresponding \"setter\". For example, `foo.set(bar='blah')` would call `foo.set_bar('blah')`.\n", + "\n", + "Note that the `set` method doesn't just apply to `Axes`; it applies to more-or-less all matplotlib objects.\n", + "\n", + "However, there are cases where you'll want to use things like `ax.set_xlabel('Some Label', size=25)` to control other options for a particular function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Basic Plotting\n", + "\n", + "Most plotting happens on an `Axes`. Therefore, if you're plotting something on an axes, then you'll use one of its methods.\n", + "\n", + "We'll talk about different plotting methods in more depth in the next section. For now, let's focus on two methods: `plot` and `scatter`.\n", + "\n", + "`plot` draws points with lines connecting them. `scatter` draws unconnected points, optionally scaled or colored by additional variables.\n", + "\n", + "As a basic example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "ax.set_xlim(0.5, 4.5)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Axes methods vs. pyplot\n", + "\n", + "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "plt.xlim(0.5, 4.5)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", + "\n", + "\"Explicit is better than implicit\"\n", + "\n", + "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon.\n", + "\n", + "The advantage of keeping which axes we're working with very clear in our code will become more obvious when we start to have multiple axes in one figure." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple Axes\n", + "\n", + "We've mentioned before that a figure can have more than one `Axes` on it. If you want your axes to be on a regular grid system, then it's easiest to use `plt.subplots(...)` to create a figure and add the axes to it automatically.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`plt.subplots(...)` created a new figure and added 4 subplots to it. The `axes` object that was returned is a 2D numpy object array. Each item in the array is one of the subplots. They're laid out as you see them on the figure. \n", + "\n", + "Therefore, when we want to work with one of these axes, we can index the `axes` array and use that item's methods.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "axes[0,0].set(title='Upper Left')\n", + "axes[0,1].set(title='Upper Right')\n", + "axes[1,0].set(title='Lower Left')\n", + "axes[1,1].set(title='Lower Right')\n", + "\n", + "# To iterate over all items in a multidimensional numpy array, use the `flat` attribute\n", + "for ax in axes.flat:\n", + " # Remove all xticks and yticks...\n", + " ax.set(xticks=[], yticks=[])\n", + " \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One really nice thing about `plt.subplots()` is that when it's called with no arguments, it creates a new figure with a single subplot. \n", + "\n", + "Any time you see something like\n", + "\n", + "```\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "```\n", + "\n", + "You can replace it with:\n", + "\n", + "```\n", + "fig, ax = plt.subplots()\n", + "```\n", + "\n", + "We'll be using that approach for the rest of the examples. It's much cleaner. \n", + "\n", + "However, keep in mind that we're still creating a figure and adding axes to it. We we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Quick Exercise: Exercise 1.1\n", + "--------------\n", + "\n", + "Let's use some of what we've been talking about. Can you reproduce this figure?\n", + "\n", + "\n", + "\n", + "Here's the data and some code to get you started." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Our data...\n", + "x = np.linspace(0, 10, 100)\n", + "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", + "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", + "\n", + "# Can you figure out what to do next to plot x vs y1, y2, and y3?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits and autoscaling\n", + "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###`ax.margins(...)`\n", + "\n", + "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", + "\n", + "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", + "ax2.margins(0.05) # 5% padding in all directions\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `ax.axis(...)`\n", + "\n", + "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", + "\n", + "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", + "\n", + " xmin, xmax, ymin, ymax = ax.axis()\n", + " \n", + "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", + "\n", + " ax.axis([xmin, xmax, ymin, ymax])\n", + " \n", + "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", + "\n", + " * *tight*: Set axes limits to the exact range of the data\n", + " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", + " \n", + "And as an example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=3)\n", + "\n", + "for ax in axes:\n", + " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", + "\n", + "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", + "axes[1].axis('tight')\n", + "\n", + "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", + "axes[2].axis('equal')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Manually setting only one limit\n", + "\n", + "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Good -- setting limits after plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Bad -- Setting limits before plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Legends\n", + "\n", + "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", + "\n", + "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", + "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", + "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", + "ax.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", + "\n", + " ax.legend(loc=\"best\")\n", + " \n", + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", + "\n", + "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", + "ax.legend(loc='best')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 1.2\n", + "\n", + "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", + "\n", + "\n", + "\n", + "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "t = np.linspace(0, 2 * np.pi, 150)\n", + "x1, y1 = np.cos(t), np.sin(t)\n", + "x2, y2 = 2 * x1, 2 * y1\n", + "\n", + "colors = ['darkred', 'darkgreen']\n", + "\n", + "# Try to plot the two circles, scale the axes as shown and add a legend\n", + "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dealing with the boundaries: Layout, ticks, spines, etc\n", + "\n", + "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", + "\n", + "## Ticks, Tick Lines, Tick Labels and Tickers\n", + "This is a constant source of confusion:\n", + "\n", + "* A Tick is the *location* of a Tick Label.\n", + "* A Tick Line is the line that denotes the location of the tick.\n", + "* A Tick Label is the text that is displayed at that tick.\n", + "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", + "\n", + "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", + "\n", + "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", + "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", + "\n", + "# Make the y-ticks a bit longer and go both in and out...\n", + "ax.tick_params(axis='y', direction='inout', length=10)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", + " \n", + "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", + "fruit, value = zip(*data)\n", + "\n", + "fig, ax = plt.subplots()\n", + "x = np.arange(len(fruit))\n", + "ax.bar(x, value, align='center', color='gray')\n", + "ax.set(xticks=x, xticklabels=fruit)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subplot Spacing\n", + "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", + "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", + " left=0.125, right=0.9,\n", + " top=0.9, bottom=0.1)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", + "\n", + "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", + "\n", + "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def example_plot(ax):\n", + " ax.plot([1, 2])\n", + " ax.set_xlabel('x-label', fontsize=16)\n", + " ax.set_ylabel('y-label', fontsize=8)\n", + " ax.set_title('Title', fontsize=24)\n", + "\n", + "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", + "example_plot(ax1)\n", + "example_plot(ax2)\n", + "example_plot(ax3)\n", + "example_plot(ax4)\n", + "\n", + "# Try enabling fig.tight_layout to compare...\n", + "#fig.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GridSpec\n", + "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sharing axes\n", + "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## \"Twinning\" axes\n", + "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax1 = plt.subplots(1, 1)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2 = ax1.twinx()\n", + "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", + "ax1.set_xlabel('X')\n", + "ax1.set_ylabel('First scale')\n", + "ax2.set_ylabel('Other scale')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axis Spines\n", + "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", + "ax.spines['top'].set_visible(False)\n", + "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", + "ax.spines['right'].set_visible(False)\n", + "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", + "\n", + "# \"outward\"\n", + "# Move the two remaining spines \"out\" away from the plot by 10 points\n", + "ax.spines['bottom'].set_position(('outward', 10))\n", + "ax.spines['left'].set_position(('outward', 10))\n", + "\n", + "# \"data\"\n", + "# Have the spines stay intersected at (0,0)\n", + "#ax.spines['bottom'].set_position(('data', 0))\n", + "#ax.spines['left'].set_position(('data', 0))\n", + "\n", + "# \"axes\"\n", + "# Have the two remaining spines placed at a fraction of the axes\n", + "#ax.spines['bottom'].set_position(('axes', 0.75))\n", + "#ax.spines['left'].set_position(('axes', 0.25))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 1.3\n", + "\n", + "This one is a bit trickier. Once again, try to reproduce the figure below:\n", + "\n", + "\n", + "\n", + "\n", + "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", + "\n", + "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/1.2-spines.py" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/AnatomyOfMatplotlib-Part1-pyplot.ipynb b/AnatomyOfMatplotlib-Part1-pyplot.ipynb deleted file mode 100644 index 023072a..0000000 --- a/AnatomyOfMatplotlib-Part1-pyplot.ipynb +++ /dev/null @@ -1,846 +0,0 @@ -{ - "metadata": { - "name": "", - "signature": "sha256:6302a88e9db31d8d9cfae2b0103e57708f94b802a561930d11298cd246e9d590" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n", - "# Turning on inline plots -- just for use in ipython notebooks.\n", - "%matplotlib inline" - ], - "language": "python", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "# Matplotlib\n", - "## Introduction\n", - "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", - "\n", - "## Online Documentation\n", - "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", - "\n", - "## Gallery\n", - "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", - "\n", - "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", - "\n", - "## Mailing Lists and StackOverflow\n", - "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](http://sourceforge.net/mail/?group_id=80706). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", - "\n", - "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too!\n", - "\n", - "# Github repository\n", - "## Location\n", - "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", - "\n", - "## Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://github.com/matplotlib/matplotlib/wiki)).\n", - "\n", - "## What is this \"backend\" thing I keep hearing about?\n", - "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. However, bugs do occur, and so two of the most important pieces of information you can provide in a bug report is which version of matplotlib, and which backend." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib\n", - "print(matplotlib.__version__)\n", - "print(matplotlib.get_backend())" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On with the show!\n", - "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", - "\n", - "We start with the most important import statements you will ever need for matplotlib" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# pyplot\n", - "The pyplot module is where everything in matplotlib comes together. It is the launching point for (1) preparing your figures, (2) making plots, and (3) doing any modifications and decorations you want. It all comes together here. Let us take a look at those three catagories of pyplot functions.\n", - "\n", - "## Plotting Preparation\n", - "\n", - "Function | Description \n", - ":-----------------|:----------------------------------------------------------\n", - "`autoscale` | Autoscale the axis view to the data (toggle).\n", - "`axes` | Add an axes to the figure. \n", - "`axis` | Convenience method to get or set axis properties.\n", - "`cla` | Clear the current axes. \n", - "`clf` | Clear the current figure. \n", - "`clim` | Set the color limits of the current image. \n", - "`delaxes` | Remove an axes from the current figure. \n", - "`locator_params` | Control behavior of tick locators. \n", - "`margins` | Set or retrieve autoscaling margins.\n", - "`figure` | Creates a new figure. \n", - "`gca` | Return the current axis instance. \n", - "`gcf` | Return a reference to the current figure. \n", - "`gci` | Get the current colorable artist. \n", - "`hold` | Set the hold state. \n", - "`ioff` | Turn interactive mode off. \n", - "`ion` | Turn interactive mode on. \n", - "`ishold` | Return the hold status of the current axes. \n", - "`isinteractive` | Return status of interactive mode. \n", - "`rc` | Set the current rc params. \n", - "`rc_context` | Return a context manager for managing rc settings. \n", - "`rcdefaults` | Restore the default rc params. \n", - "`savefig` | Save the current figure. \n", - "`sca` | Set the current Axes instance. \n", - "`sci` | Set the current image. \n", - "`set_cmap` | Set the default colormap\n", - "`setp` | Set a property on an artist object\n", - "`show` | Display a figure\n", - "`subplot` | Return a subplot axes positioned by the given grid definition. \n", - "`subplot2grid` | Create a subplot in a grid. \n", - "`subplot_tool` | Launch a subplot tool window for a figure. \n", - "`subplots` | Create a figure with a set of subplots already made. \n", - "`subplots_adjust` | Tune the subplot layout. \n", - "`switch_backend` | Switch the default backend. \n", - "`tick_params` | Change the appearance of ticks and tick labels. \n", - "`ticklabel_format`| Change the ScalarFormatter used by default for linear axes. \n", - "`tight_layout` | Automatically adjust subplot parameters to give specified padding. \n", - "`xkcd` | Turns on [XKCD](http://xkcd.com/) sketch-style drawing mode. \n", - "`xlabel` | Set the *x* axis label of the current axis. \n", - "`xlim` | Get or set the *x* limits of the current axes. \n", - "`xscale` | Set the scaling of the *x*-axis. \n", - "`xticks` | Get or set the *x*-limits of the current tick locations and labels. \n", - "`ylabel` | Set the *y* axis label of the current axis. \n", - "`ylim` | Get or set the *y*-limits of the current axes. \n", - "`yscale` | Set the scaling of the *y*-axis. \n", - "`yticks` | Get or set the *y*-limits of the current tick locations and labels. \n", - "\n", - "## Plotting Functions\n", - "\n", - "Function | Description\n", - ":-----------------|:--------------------------------------------\n", - "`acorr` | Plot the autocorrelation of *x*\n", - "`bar` | Make a bar plot\n", - "`barbs` | Plot a 2-D field of barbs\n", - "`barh` | Make a horizontal bar plot\n", - "`boxplot` | Make a box and whisker plot\n", - "`broken_barh` | Plot horizontal bars\n", - "`cohere` | Plot the coherence between *x* and *y*\n", - "`contour` | Plot contours\n", - "`contourf` | Plot filled contours\n", - "`csd` | Plot cross-spectral density\n", - "`errorbar` | Plot an errorbar graph\n", - "`eventplot` | Plot identical parallel lines at specific positions\n", - "`fill` | Plot filled polygons\n", - "`fill_between` | Make filled polygons between two curves\n", - "`fill_betweenx` | Make filled polygons between two horizontal curves\n", - "`hexbin` | Make a hexagonal binning plot\n", - "`hist` | Plot a histogram\n", - "`hist2d` | Make a 2D histogram plot\n", - "`imshow` | Display an image on the axes\n", - "`loglog` | Make a plot with log scaling on both the *x* and *y* axis\n", - "`matshow` | Display an array as a matrix in a new figure window\n", - "`pcolor` | Create a pseudocolor plot of a 2-D array\n", - "`pcolormesh` | Plot a quadrilateral mesh\n", - "`pie` | Plot a pie chart\n", - "`plot` | Plot lines and/or markers\n", - "`plot_date` | Plot with data with dates\n", - "`polar` | Make a polar plot\n", - "`psd` | Plot the power spectral density\n", - "`quiver` | Plot a 2-D field of arrows\n", - "`scatter` | Make a scatter plot of x vs y\n", - "`semilogx` | Make a plot with log scaling on the *x* axis \n", - "`semilogy` | Make a plot with log scaling on the *y* axis\n", - "`specgram` | Plot a spectrogram\n", - "`spy` | Plot the sparsity pattern on a 2-D array\n", - "`stackplot` | Draws a stacked area plot\n", - "`stem` | Create a stem plot\n", - "`step` | Make a step plot\n", - "`streamplot` | Draws streamlines of a vector flow\n", - "`tricontour` | Draw contours on an unstructured triangular grid\n", - "`tricontourf` | Draw filled contours on an unstructured triangular grid\n", - "`tripcolor` | Create a pseudocolor plot of an unstructured triangular grid\n", - "`triplot` | Draw a unstructured triangular grid as lines and/or markers\n", - "`xcorr` | Plot the cross-correlation between *x* and *y*\n", - "\n", - "## Plot modifiers\n", - "\n", - "Function | Description \n", - ":-----------------|:---------------------------------------------------------------------\n", - "`annotate` | Create an annotation: a piece of text referring to a data point\n", - "`arrow` | Add an arrow to the axes\n", - "`axhline` | Add a horizontal line across the axis\n", - "`axhspan` | Add a horizontal span (rectangle) across the axis\n", - "`axvline` | Add a vertical line across the axes\n", - "`axvspan` | Add a vertical span (rectangle) across the axes\n", - "`box` | Turn the axes box on or off\n", - "`clabel` | Label a contour plot\n", - "`colorbar` | Add a colorbar to a plot\n", - "`grid` | Turn the axes grids on or off\n", - "`hlines` | Plot horizontal lines\n", - "`legend` | Place a legend on the current axes\n", - "`minorticks_off` | Remove minor ticks from the current plot\n", - "`minorticks_on` | Display minor ticks on the current plot\n", - "`quiverkey` | Add a key to a quiver plot\n", - "`rgrids` | Get or set the radial gridlines on a polar plot\n", - "`suptitle` | Add a centered title to the figure\n", - "`table` | Add a table to the current axes\n", - "`text` | Add text to the axes\n", - "`title` | Set a title of the current axes\n", - "`vlines` | Plot vertical lines\n", - "`xlabel` | Set the *x* axis label of the current axis\n", - "`ylabel` | Set the *y* axis label of the current axis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Figure\n", - "## Introduction\n", - "All plotting is done through the [`Figure`](http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure) object. You can create as many figures as you need. Figures can't do much by themselves, but no plotting can happen without them. They are, literally, the \"canvas\" of your plot." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Awww, nothing happened! This is because by default mpl will not show anything until told to do so. In other words, the \"interactive mode\" is turned off. This is very useful for scripting where we would not ever want to see the intermediate results. For those who wishes to experiment and want to see their plot as they issue commands, there is the \"plt.ion()\" command they can issue before creating their first figure of their session. For the purpoase of this tutorial, we will leave interactivity off.\n", - "\n", - "## Figure properties\n", - "* figsize : tuple of integers, width, height in inches.\n", - " \n", - "* dpi : integer, esolution of the figure in dots per inch." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure(figsize=(10, 4))\n", - "fig.gca() # needed for the ipython-inline to display anything\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Twice as tall\n", - "fig = plt.figure(figsize=plt.figaspect(2.0))\n", - "fig.gca()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Breakdown of a figure\n", - "Open the file \"plot_demo.svg\" included with this notebook in a new tab." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axes\n", - "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "ax.set_xlim(0.5, 4.5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "plt.xlim(0.5, 4.5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", - "\n", - "\"Explicit is better than implicit\"\n", - "\n", - "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Limits and autoscaling\n", - "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib to autoscale the rest of it." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Good -- setting limits after plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Bad -- Setting limits before plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercise 1.1\n", - "How would you make a plot with a y-axis such that it starts at 1000 at the bottom, and goes to 500 at the top?\n", - "\n", - "Hint: [`set_ylim`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_ylim)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/1.1-limits.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Labels and Legends\n", - "You can label just about anything in mpl. You can provide a label to your plot, which allows your legend to automatically build itself. The X and Y axis can also be labeled, as well as the subplot itself via the title." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", - "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", - "ax.set_ylabel('Temperature (deg C)')\n", - "ax.set_xlabel('Time')\n", - "ax.set_title(\"A tale of two cities\")\n", - "ax.legend()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\"." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\")\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label=\"_nolegend_\")\n", - "ax.legend()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Ticks, Tick Lines, Tick Labels and Tickers\n", - "This is a constant source of confusion:\n", - "\n", - "* A Tick is the *location* of a Tick Label.\n", - "* A Tick Line is the line that denotes the location of the tick.\n", - "* A Tick Label is the text that is displayed at that tick.\n", - "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", - "\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "ax.xaxis.set_ticks(range(1, 5)) # Set ticks at 1, 2, 3, 4\n", - "ax.xaxis.set_ticklabels([3, 100, -12, \"foo\"]) # Label ticks as \"3\", \"100\", \"-12\", and \"foo\"\n", - "ax.tick_params(axis='y', direction='inout', length=10)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Subplots\n", - "While an *Axes* object can only belong to one *Figure*, A *Figure* can have many *Axes* objects. These are typically called \"subaxes\" or \"subplots\". They act just like regular *Axes*." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure(figsize=(10, 5))\n", - "ax = fig.add_subplot(121)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", - "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", - "ax.set_title('A tale of two cities')\n", - "ax.legend()\n", - "\n", - "t = np.linspace(0, 7, 25)\n", - "z = 2 * np.sin(t) + 5\n", - "ax = fig.add_subplot(122)\n", - "ax.scatter(t, z, label='Philadelphia')\n", - "ax.set_title(\"Observed Tide\")\n", - "ax.legend()\n", - "\n", - "fig.suptitle('A title for the whole figure')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are many ways to add and modify subplots in a figure.\n", - "\n", - "* [`plt.subplots()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots)\n", - "* [`plt.subplot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot) and [`fig.add_subplot()`](http://matplotlib.org/api/figure_api.html?#matplotlib.figure.Figure.add_subplot) Which should be familiar to all Matlab users\n", - "* [`plt.axes()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.axes)\n", - "* [`plt.subplot2grid()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplot2grid)\n", - "* `plt.subplot_tool()` Interactive modification of subplot spacing.\n", - "\n", - "## Spacing\n", - "The spacing between the subplots can be adjusted using [`plt.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", - "plt.subplots_adjust(wspace=0.5, hspace=0.3,\n", - " left=0.125, right=0.9,\n", - " top=0.9, bottom=0.1)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A common complaint with matplotlib users is that the labels do not fit with the subplots, or the label of one subplot spills onto another subplot's area. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", - "\n", - "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def example_plot(ax):\n", - " ax.plot([1, 2])\n", - " ax.set_xlabel('x-label', fontsize=16)\n", - " ax.set_ylabel('y-label', fontsize=8)\n", - " ax.set_title('Title', fontsize=24)\n", - "\n", - "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", - "example_plot(ax1)\n", - "example_plot(ax2)\n", - "example_plot(ax3)\n", - "example_plot(ax4)\n", - "#plt.tight_layout()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a last bit of an FAQ, this \"tight_layout\" feature is unrelated to the so-called \"bbox_inches='tight'\" feature that will be discussed separately." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GridSpec\n", - "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sharing axes\n", - "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# going out of inline mode to demonstrate the zooming and panning\n", - "%matplotlib\n", - "\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Go back to inline mode\n", - "%matplotlib inline" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## \"Twinning\" axes\n", - "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax1 = plt.subplots(1, 1)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2 = ax1.twinx()\n", - "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", - "ax1.set_xlabel('X')\n", - "ax1.set_ylabel('First scale')\n", - "ax2.set_ylabel('Other scale')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axis Spines\n", - "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", - "ax.spines['top'].set_visible(False)\n", - "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", - "ax.spines['right'].set_visible(False)\n", - "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", - "\n", - "# \"outward\"\n", - "# Move the two remaining spines \"out\" away from the plot by 10 points\n", - "ax.spines['bottom'].set_position(('outward', 10))\n", - "ax.spines['left'].set_position(('outward', 10))\n", - "\n", - "# \"data\"\n", - "# Have the spines stay intersected at (0,0)\n", - "#ax.spines['bottom'].set_position(('data', 0))\n", - "#ax.spines['left'].set_position(('data', 0))\n", - "\n", - "# \"axes\"\n", - "# Have the two remaining spines placed at a fraction of the axes\n", - "#ax.spines['bottom'].set_position(('axes', 0.75))\n", - "#ax.spines['left'].set_position(('axes', 0.25))\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 1.2\n", - "Create a plot that have outward spines on the left and bottom with tick labels, and \"centered\" spines with no tick labels and tickmarks *through* the spines.\n", - "\n", - "Hints:\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params)\n", - "[`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/1.2-spines.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Colorbars\n", - "Colorbars are much like legends because they help to describe the data being displayed. While legends describe plots, i.e., plot(), scatter(), hist(), stem(), colorbars describe images. To be really specific and technical, they can be used for any \"ScalarMappable\", which will be discussed in the `Artists` section. Let us take a look at a very simple example of a colorbar for a simple 2D image." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "y, x = np.ogrid[-6:6:20j, -10:10:30j]\n", - "z = np.hypot(x, y)\n", - "plt.imshow(z)\n", - "plt.colorbar()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.imshow(z)\n", - "plt.colorbar(orientation='horizontal', shrink=0.75) # We can make colorbars do all sorts of things!\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.imshow(z)\n", - "cbar = plt.colorbar(extend='both', aspect=10)\n", - "cbar.set_label('distance') # And we can even add a label to it\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Colorbars in matplotlib can be difficult at times, and the documentation can sometimes be a bit unhelpful (patches welcome!). One of the most common problems that come up is when mixing subplots with a single colorbar:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2)\n", - "ax1.imshow(z)\n", - "im = ax2.imshow(z) # Note, due to a bug, you will need to save the\n", - " # returned image object when calling imshow() from an Axes\n", - " # and pass that to plt.colorbar() so that it knows what\n", - " # image to build a colorbar from. This will be fixed for v1.3.1.\n", - "plt.colorbar(im)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks terrible, right? What is happening is that a colorbar in matplotlib is just a very squashed subplot with an image of the colormap and axis ticks and labels. When told to create a colorbar for an image, matplotlib will simply \"steal\" space from that image's subplot and create a new subplot. There are a couple ways to deal with this issue. First, if you preallocate space for the colorbar (by creating your own Axes object to add to the Figure), you can pass that preallocated Axes to the \"cax\" argument of [`plt.colorbar()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.colorbar), and it won't have to steal any space. The easier option is to pass a list of all the axes objects to `plt.colorbar(..., ax)`, and it will steal space equally from them." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2)\n", - "ax1.imshow(z)\n", - "im = ax2.imshow(z)\n", - "plt.colorbar(im, ax=[ax1, ax2], shrink=0.5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is also a third, very powerful, option called [`axes_grid1`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html), which we will discuss in the `mpl_toolkits` section." - ] - } - ], - "metadata": {} - } - ] -} \ No newline at end of file diff --git a/exercises/1.1-limits.py b/exercises/1.1-limits.py deleted file mode 100644 index 73d5015..0000000 --- a/exercises/1.1-limits.py +++ /dev/null @@ -1,3 +0,0 @@ -fig, ax = plt.subplots(1, 1) -ax.set_ylim( ) -plt.show() diff --git a/exercises/1.1-subplots_and_basic_plotting.py b/exercises/1.1-subplots_and_basic_plotting.py new file mode 100644 index 0000000..1ff79ca --- /dev/null +++ b/exercises/1.1-subplots_and_basic_plotting.py @@ -0,0 +1,11 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Try to reproduce the figure shown in images/exercise_1-1.png + +# Our data... +x = np.linspace(0, 10, 100) +y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2) +names = ['Signal 1', 'Signal 2', 'Signal 3'] + +# Can you figure out what to do next to plot x vs y1, y2, and y3 on one figure? diff --git a/exercises/1.2-legends_and_scaling.py b/exercises/1.2-legends_and_scaling.py new file mode 100644 index 0000000..8d200f9 --- /dev/null +++ b/exercises/1.2-legends_and_scaling.py @@ -0,0 +1,15 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Try to reproduce the figure shown in images/exercise_1-2.png +# Here's the data and colors used. + +t = np.linspace(0, 2 * np.pi, 150) +x1, y1 = np.cos(t), np.sin(t) +x2, y2 = 2 * x1, 2 * y1 + +colors = ['darkred', 'darkgreen'] + +# Try to plot the two circles, scale the axes as shown and add a legend +# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale +# the axes diff --git a/exercises/1.2-spines.py b/exercises/1.2-spines.py deleted file mode 100644 index 6abdb53..0000000 --- a/exercises/1.2-spines.py +++ /dev/null @@ -1,23 +0,0 @@ -fig, ax = plt.subplots(1, 1) -ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5]) -ax.spines['top'].set_visible(False) -ax.xaxis.set_ticks_position('bottom') # no ticklines at the top -ax.spines['right'].set_visible(False) -ax.yaxis.set_ticks_position('left') # no ticklines on the right - -# "outward" -# Move the two remaining spines "out" away from the plot by 10 points -ax.spines['bottom'].set_position(('outward', 10)) -ax.spines['left'].set_position(('outward', 10)) - -# "data" -# Have the spines stay intersected at (0,0) -#ax.spines['bottom'].set_position(('data', 0)) -#ax.spines['left'].set_position(('data', 0)) - -# "axes" -# Have the two remaining spines placed at a fraction of the axes -#ax.spines['bottom'].set_position(('axes', 0.75)) -#ax.spines['left'].set_position(('axes', 0.25)) - -plt.show() diff --git a/exercises/1.3-spines_ticks_and_subplot_spacing.py b/exercises/1.3-spines_ticks_and_subplot_spacing.py new file mode 100644 index 0000000..d8133aa --- /dev/null +++ b/exercises/1.3-spines_ticks_and_subplot_spacing.py @@ -0,0 +1,9 @@ +import matplotlib.pyplot as plt +import numpy as np + +# Try to reproduce the figure shown in images/exercise_1.3.png +# This one is a bit trickier! + +# Here's the data... +data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)] +animals, friendliness, popularity = zip(*data) diff --git a/images/exercise_1-1.png b/images/exercise_1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b64ffea491f1b0f345deed6c9c91a73da14ede21 GIT binary patch literal 41356 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π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 literal 0 HcmV?d00001 diff --git a/images/exercise_1-2.png b/images/exercise_1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a981f2c5b15e515b6585a3090d74922b67c808a7 GIT binary patch literal 39667 zcmeFZ^rshRu?-Ru1JZMtjF#7@y+u#GSK-U3 zM@dyOsUie~GBkl}NR99Ew0}vsOwH=BziW)ct8cJfEPH)7`?Vy3`d4T^LsQ2GY!Y;g zs3?v^+}}6hm37mcC`3rDvNc?QcX<_ z0WB@32M$q2a4<3sE^c>R-l(25;*m%&Ma8bkN$ov~CwvF5wNL)%-FwUV1_x(%cM>tQ z(wSZMPp^JkJYob7xF%OrRQ!RgrWNExAo{<)ri6)wj~||vM!qxkE!uVCPoB@&&Ji3A zQ&EYT8U1frunwat<&neohd8&*p}c^H`x29ONg`t6YO6u2rlzKq+pE(OgT{&(!brr& zwW3f9QB<=t7ZvZVDN!?$1kx7SY*N`OIoIT@f0em5TC{zj^uKY)k8&ua5H}$9Nu)OaCd>Ja2p5BaDmZ3;UezbSG^mEtp0m37Kfj=4~;qLIy z%#%b{>`c)4!ZF=L)&4hpiAf187LPRYwzl5J&`Z&A8Z`VmTJ7qNlY^nGOk&4wa_2Jf zN)Wyr%l&?R+MSd?JYF+)1ldI8bLC4&Owxc~Oc&*gY}@X34*bL++u$%Ydy@wr#@c}X z{4;mZ^iN$nOdt9h2)QgJg}EZ`}l~qxNirMa~m^oaNwk-ram;^gNK{h z+CtNDsRS^B(Qu)^(_w}GYFulb*N<@xUo?eL$2*dw#G((=Gc+>j?s+joDjD!Ek`C7W z$NY-=-_^gsI_4$`*6EI51LrLL?$4X3-gfNg?9=*>o`>fuO0m+3b98c5AE% z8*vX{pNyQGxYgCwRn^s3e=GfZ<7j89Ey7Jxb8_x~Ul>dQ_pbW%iN^hKiPrOQNnTw& zVT`^(nA7A34Hp*|R7nxGqr{cAZuUnG)}y%gx>FFw^8K3spFR$7*{2y#h%oC4UneLR zj(oJ0d6AD=s)fZFsWWPb_skXBH8CkS7;H_--#_eqU4y;CE~m$;q2DL_brsvbo{cp5 zSO_%uooUP#)+oCsS|#+q=~Gi96Abwg*TWf7~Iw-5r$76_xJCcy@h6C ziTCF)b#;Qddb?uhtYCEf&gEr#IyyQEVMiLrrSFkl;rLAA;xvtpi$S5G@}n&_Ha5;~ zZe5dQx`?PUTA(P$lC-)tT0kN0#e?{~_vt@2@t$V4%_`H5$90a2R2Drk9jBYac?AWp zI8175gaf%ve&FcpPMbGB)F7Ogl#Hx%e4Ln^%P_FLT`E)1j>Y2%L{rX2-$o?hL40UQ zEZXg2h*4aKW_z~#0q+wGBE!6{TqRH)QdG+PHC^We_{I^#VQOyr*h0c0og)1wY#F8J zy7Jz!+zE%+k9cc)%WuTu_nVr0zLRSvF)8Yd<_x7lW%-l-H&3it*zfqaEs5xgBxGgG zIurxGxi-^O|E`WujqC2PLy!J9^>6Bdgz>P(irb4SxqjnXOwpA+C+j~!oxWo zRp#<3;yOx77zne-^}jBCE97-#+SJ-=alF>8j2!_M^cWd=^oQR~{%pB^ZI$z??Cssf z^5sG6Vbs4Q7S&Fm#_G4D5S1*UZ*Oz5vZ9UKe9Z1|uePQu>8S+XGI+&U^v0RpU7uZ^ z^m9iamlb{d^;k3Li&}P6U?390yg(Z3ZE%=J=?}-Fg=+Fapx@r`Q67l5oqn}nkP5H$ z9A48|`)1zkBxfWyQLaUNPP!j0Y0qJAOo~hVLQ9~cq-LGDP?HVE9oO`;-H}EkcQWbP zc66~<`Ypk6>9JS($D z1`mT7ovOQ%0ocya)D)T2{bhmaROu^Ltuh_l)zwvHCw}J@X_+gez{(%jSlHxTBnvFh zo>7AIAqSLzvVn{QhrsmDEAZm}soP?}f&JFlC}83eD1*N+&jb z`@G)N(h8NGpIt!Ft!P(#*ekB&*Hf5Oq=J??Nq!ED5z33@^4oG5moMupwEZ>Xo`3mgmnKGeeW%fB|7`XeHu ze{O`QC1zw@8DHG+Y%qQw_U^j*Bpj&Q>QG-fPDeLHw`JJKKM*?*eP_oA#T^(JNFJ)M zuV40AB(Q88o$^0BsjWK7tvzIZc&HWt8|1W@2}x8+$SA#ZyRJyOQQz)*EDO`>1h&K_ z-V_)-jkh*4Xwd{e8bhb&s3`sx-qR2}ny-LeSLO79r9suy!Ew-YNh&BWhmmSlK$a;> zfnx4+mc6ZRIt{oX5eAPL@`PyG2V<>DXO%p!w<=H77N3QVh~;_RpIikjz04~oFyl4Dh{o)S@#8mrwS;E0>nX3hS>f#Fe6wX? zT;l#wsR$~DWH>HpH-)2FN|KkCXRgRdY6>6^l!e>Pcx`L2U?#v@3eQLiE@S=mtGy;= zu9#okFs+m#@DTNHzJfo>Sos_{9R%uZBEp1ldGoqZKqg*L{vP_uQ*Cu({}o0vaZq7Q z;lua%a5nsEt~az(q2B9rbYQr!}E}?uCC71&W>G82`a?F0E6W+unS|OL-2oY=HtgLik~l$-|~+LN@u-x zFiycM9$qz^%m^(=PEsx^(XFT3(f$^Gyx%LwmBw`aTtE$${d09UoX}T{;@QQ|0=>>FE@=x2MB1E$`T0 z*V~5vNnu|FijsxFP<;LT^rZ!mK>0O_{_*!4jAq&(U3 z;?X2VewPxzp0fY#`EwEkeYTd)mb5H#fF1~dIN=raoq2ZQM?4#=22MAS8~ITeCaW;3 zt;G^yGy%FmJUrUZ1xDiJ>P(uXk+A$Dw5XcdRtjqB^@-9~GgW5DzP`RyPRo*i|Ni|s zHbzu$JJ}gU%05zU(YqF-21)GeZn5WL^YXJCL||s+Em+Y=tfFw$*@DicAzVh*w)6es zmkc9*xZ?zM8`YUCZNDhXKSNo4Ds{1oj#LVZ!i%Hjshd@I zcN)o_{=k5mq6)PzY;~cScBG*zmgvcO@xF@Rmlb5*>x!E6i7Y*TdXo9pTAoP+xd7=uUa404%i>Yil zX2i?L-h+t6Bisvlukw@VO3S}*Oy#!F>@gORHop!Xxt?~8Sjl;JJcno+0O7U%$uldM z8TE+*Mfq=*x_uic=P8^ez_F9W8JZe`Dl27v1=uuw%m(X=duC8pyyMy-e*lPz7Y3EW zu6LvFeA~|K1{Q>gP3o_(*5_lx-+9}S7PCOE1rYaU`Mu%#DMm6dY(PIem(e!pZffv8}cE>JT2AiJO8%8p8 zE(NJ+|MUqnqRe?=az;VI(Qu%ee7+(OciwX!cIOvFFEwXrzl+|vY#E%UIGcT{B~)6T zAEGq{fPH?YoeBKiesoAOioIkjWkBu~HGYnix?ZEYPDJ*qST)#%%sIjCLcFAr;d=U) z8!uo*nefFj0>aXEkRWaeZ_#ZZ^r(@AaeVEr5|o}CIiE`h>LMKswufiX@#{+}2~2H# zJGN+~ce!Y6#rQ;mfo~n(Sn>Y2Lmp>IghDW&B(lE4ZrS?;1p=vd2JUH7_c!hLCDSE- zxn%S8x0^|1=}=cv#I7SmuPS?6+!+EpWJysTEp=pd|2mJ^n7h#PmAI_xYR~G;h9z4$ zA~W^e#Pn8%`*(Y0w|7lD{P_217pC>~znd3M3~1d}J)mplYS7l=5BS?%frK6ZPHt*- z^$@?h>QFWnA9}Wr--s z(lasw$kSG4xt02rU%6;PAdHB6V*u;cb9X1) zvzjwI|1j$$kzMg#!t>K7A0qOArU?IvJ1+%x&G&P!=e9QI@QaIc6^`mmo1QhX8F34; zlY$k7?c*45h}RJ4H%GNP5fYX@1}ZMC|8z@Jj`KQ_ir>!kdTCqfw~B_IA~ez5dAy_P z`c#`H!wY4fcJ9=6tk4A%26K}(;l!_At_;BWw=^rG$IixT$9dhBRVMDMh3>I#uu(%% zp=!!7OIpOOnKM+-4r`Z6&g3{%=AK~=^X0G^4cA7pIu5l(?wdF&2HWClefp?G!)e#> zYc(>Q@Lo>DM{uvmJzLQxo~P$M4%L7|AhIsLG*?=g2s2@dHt>@|54GM;3bj{*Jig=3 zPYPL{8Wrny8Ap7g#ayoRT~+Uv>BfvyMxcZ0fLnjqP#i2^`d)duImHWG;$bUND0*&X zZ?P7trUbJjL`WEm{v4lYW%$wCwh}?e8YH=5eRc0c1U*v~xEg@C%C!(!(JQ~*>lr~0 za;`fsOj=qosL>{Tas2Jsdv^GJf$#zAqOOZ9G#0Q9Jg$G0CQ3Ar!@|ON1O?>*WA1Xc+Q z%UZvRFedsqmmUPIzlvjW)?@&HqQsrHz0BYFdKRfx}r*xIN^7v1|eMdCXFBVo#Gz6>0MS4-_ZtbXhD644Vi z1T?AUtV1?^6?RYS|%tXgA$444im}6#pUgE1?}3} z+Q=7GYET%g03J@n>xf}tak1L}&L@VFUt!e+kP5*Cit(LYUC7J6r?}wLOQ$A*S|0$@ zryR>P9lw&bzx;F$@8tCb+G2InviU@HdBL11%rdYvk1h2*7XnkP)OTU$d4?RCZ<78s z>qtbM@i3#F!qpG2IBShcu7fKLsVEe&rN9P{>}UBw#iwU~;du?WL6Yu``}0!gC^I#c zY++$xWqm!k)_T}~!ch-=>j5l46jnrRY;30}a2Z8kUvYrhcuju>=6eI42QUTUn8Ylf z!Jd?8J--yEdFF}|j!&;ptd=b)LY^Y-7!QGrGJj$2bZcW3*YSSJNna10?5zIX>-=*U zsUKYf)2+cnp|6hMGUoV0N=8cO$z`&ayTKx^$?X~HN0X?V11Zw>U%y~T(g2t(HCNQv z3nG!sQ&umLP*O&YjHtu+=XHV2{hXK}ar-wQqox)&7QFiYeDC*(MwAOM^GF4jBr^ab z24;kjw`aGp`rp;L^VIgM48YSd0e&VVB1%yuibM&{#FcGCTjV)h5$C{vUE$mf2Ot!3 zWW_Lrryu>J!cSgVITO$$Zb*T3bpit!{EBAYnwmsN3{a@Dnf~|})fWQPepDbW5Xt*0 ziz_(NMG|YUCUZHxYQ>$xHyVz{Ad2kMTc(J<=7i31?hfWo114?caM*uqcZ@s$=L#8M ztmx$AsOX|1=KO+!<=qyV=G+9UfQYr{QRW<0H?y1Jw-Nit;`swJ#i%RFu)VyNvWS+;&*R^{)!PFsDzk#} ztJa+8q;-0e^O#Id7wm*xJbCG7%U30PRUQ0}3HU3C9On{hNyt|BtkT%%Kb@ypz`m5$)8g=T(` zBZ`jnXvI7b3F~Mh%_JX0avmX}u;%7xJ@NGTNJq!VAF{Hj72@e)waaw!Y{tLv@bk;b z%034CYFL)A(;9-6*GqIVF8wbe6A|At(BKBxl+^iZJ=J}5)3e`|s$rlf88M;7oTPko z_lNwZeYO&g1mBS9AGP=A2io`%tyYuV()5zFZP<%YTPNi`y;3T^MS4AykFWu&IhBE7YtGLaY z*uUXgEjPlR#%&T-R>sa{)Ph1zPF}rE;3oj;J8f2-)mDjR#&#YPGwwkYJhdAmS|oHrcg^iqw6&Q?5n<+ zmH|B%`tKM_EB=Zn+|p^!>a2MPy~C#~6DMh?B1-&+SchlJ^%0cnVUA++Ap4b`Q1K1T z-n9?;pY1eapn_6%emVZj_={d{i2w~fG7{2|RBVGanK5L-kAxb}*VX1=@La&|NFxj@ zF^MsqdYiK2eX{U%6P%C@TrCD5TW-r83i=Cl-{TANzTd-augOv-o8O5(uzYfJ2UJ6?f`(`xdA0T_T-NGB3#v*8m>2v z42lra!6d$qBmU3d+f&w~=BV~+cI4LuCNj}cb&IDpXJqV`a1E3~Z4nM_Avg)#P>>ke1FBP=qRTgl|0&(3N zNbOy$t|@W!q>y?YX^AI29=@+SfOwMN9w2|WM%a-aUU!Ca3LIv{MPKnry9ybw z2R{xnf_y#>UQWV&vc|6Z5WApe&~)kifghYzkfroHBI16uzzm-z+nuE6x+mzW8=ZXA zN`qQl*$;8!YYJc;mRbNL&2c$K8$>puxY@bch4_>IvGWC0*jR;{7|Kg*g;3YdSAolb z3_X7_x9&0r`VD|NF@MAe4W@e{A)O`fKyb>Tz|&Y?CBNmFSEAjVig@nQP<;zKLXP_8 zdQ-Yn4m8IXiwWtePZ5tLKs;7uV4R}PXp9VmupsY2WkJGgzo&c9xk%!eh%E^OOv>1{ zR&RB6=(s&kns+wX2`lE#iAs)%SR%*9(4ahF*nTv}Z4(dhX~#l!6q9T_wtW4`Bn&7T zeh<1R1mc_&^-#>lDFvy>uz4b3kOfo<-@xFKAV&X*P%MofG1EsES0<(_-!`12WE_`O z?=Fu*$SwIPC4)4m7`4EvC^P8l+b;veqYGo6AQs&Uf?LX?=akR4n#!5z!~+=8TW6XW zyk7G_Gqi}nW{mch*&35}yb3lm88zlV{!wc5t8QGZj>pi=M!UQP-YZlN_ z^T+eKA0-AMiFlyQKud8XnE}vS9Ec~c=`QArf;A($$fk5;#9KPp1tqXVh|Fp;pL(jwCX&q@6ChWKDZE^?rYJ8Eo< z#4wPvDH{D~03V0q21-_pOd^yU<#VTIX2QhlGL34q$E>KGzkb4amMIztrLOLtXhI>^ z!T`DB@;@B;-oCr$?il#>6XiqFqYHCEg0Y>Z{PJpsSik{Uh^5jY_2v5x<1LoKf7)?do=LwDZt|B;37d?J2J;uhjsqDs5)n zemP=kNgf*Qpt{BLC`nX}h>es`W1F|%g6zk;8y%h(zg1)|CKnTPQn)ms`8CmCO|h2$ ztnzPm4kBK}5f8i<+zYitPK`{CiYReURC=Pf+Wc68`kZ8-AQ#r<7R*{nC|hU_oXb|3 zE6oC)ItrRm1Or)smOSU3&jS+=U|%%0nNpOi9pFNU6p)U-g!5}+5yU5XEg^)2rOdsl zrq-8g9Rn3Xv;ZQQmRLUpy2u|Z`{e(O=14S9xhDnX6oIvd6QmGVodcIB&0BAbv*=l( z49Y0|z=royBu1GfWyzHt0{QBwLF>PM2YL|f>F@WCI)9fWL5d(y1EBVafxE(+Bf~?? z3_~3Ogyyft(DAfsU@8i*LOPJeewuWJlG}48ljbky-Z@Kc{{ZU!g9l7Q@MA_+p4@3SI`K~uFlBj=lo4q?!^jHDs#L#p>%ltU@88XcYrT;|G2m_$fu6NX@~yQ*-5^uaL8 z_1!E!bn?>oMq%0XMNJz+JNFUzkO+(KnCL}Fj91J(LpRW#@%`W!jvFfJ) z2^l=wh6N-9P5Z&$f+7Uo(mcB>GmmP;ts;{nB9z=XK^mLhsR){_h%nM~bB$Gsj1V9O z(Uk4o#ww}GJijVW*;_+G14W0>RIL{XzsY=IqDbG`zJv=PONZ}Vj*U27NC^cnloVOe zRx@7-`_RYUM?BC5_^K#7WJmCy_t9p-n9W{k+1m|WTu!4O78RwFlTVVZUT^E6v9vT zM#o3H5cXgEjWr#AS%9WAqZFZ89E4^=fM#`-86nHH8p!}?b@zOgDFe3w<6I2D1HFG)g}yrVuf6-9WDJFz0n>QG2Pzrv zwsx40M~mqXP{HUW*AjpbLD*&ma>H(T1^EDiRbH|dul%S6Cj|1q8UT|()9eD{p`P=7 z>Lawr1}Jfe&v+mUGEd!=ddI-SSE+NOC06k6SvPnymIw?A!3qG{9^)T%n1eJRC4u4~`Hj_2t@Do1Mw8&I zm;Q$rU>`MK0%byG11zQROr$u{ah-T+K#f5B-@T))iC?H)5VcnRL$vehs48M5_+TZ4Wo6OIDaP5H!JC+@E0Y%;O%Cho z>U!z|Nq-fWOR%zlk^W3ug&I@`yo~zbf9U{6UoikanG07 zR?D9EboHEe|1DZlXYuR1V?XOv%BrCJpp}406JTmPG6s7{FiUx5E37a3IV|b3+ErZ~ z@%o6+WgP15-RF1w_=?*^R!1Gl+l=uqALX0SP|$4}nVJr7`0%I>einT{#2HX{VC6IL zE7i>arT0vARuJ{zYyp9=&H3`j5GhCA>Snm-G;J8QRxo(_r}VTmc{lAbh`#3P1Yt1R3N+Gw)>!oOl(8?HLNpOj2Nf}#ASL%e zGT$ull#!d$l}!5wMt{E)r}eG>J~>T1gR|A-NZt*f z!GS%67BKx06Z!nTfC(yW8=}m`H6qN2IAphsP!Qx&~`%XG^7eZyHxuo8+` zJ7SKzHk8R3{B-W!9&m-7V5m1 zt;A@c$q_XBcbFAH2P6_{=syA5;=WI{7DunRaJ;UBfh{M~;A0}dDae9W%F7#Zeuj#) zm64fmyE|1f)xc>l_D&Yn+WMeH9y;Flg|Nq02<-v;#$?p~CUpPu%cAgG{o104-&?Pq zzDK@1+30tE_l}e;(F){Gs0`?iyz+cWIsi>B3#2^Y2Z7A;xxWsXIWjWg`eyh{fnws> z-mKzsnw9}IOG5)snFg|gj?PovBCHq=PBX0{EF2Dw&vxb~J6$srEj>L6J6qC_6xpvu zsF7M&%_?C*3x*{B{(fd)MMu@w?|ZH)@8Qbls;QX(EUujOl3!e_fT@KF<~(VNR}7fv&z)!5s! z58ve^y{F%N%Jt5%Oy4rmlUAMq^K1#JsbRhG^vFn{TM`)l(4N&5f=O&@ZVs^$hnlrQ zJiu(5Ay3x01)d77>ar_#{>!ABHPnOaD@Lma|6gcm{zp1^4t{=m6J_C1XS)UFch^lBXJ1rV(J6{B>^; zm^0#cgfe;LC*6KF4bZxYh>k`M%=eT6coj4xK|n*Irq0TLXW}&0>b_0n*)fI$W<{JY ze?J1#RPwcRDR%2UpQuMhr>^1+i2Tw!Z+(B!iG`Io%sWpHMf`?aSJNj6M z)1dRKJa%&BtIedSFeu5tjn%7IYA+(f53J z?PQ_1=t!KXq6m4HqIJ1RF>z6AIZ5CZ?vKwPtvLmNR>1 zed!_^s27{)dHjgSibwRl+a-9vHzPKk_SUAOMU{GDXA)bm#UnJMtqn^v>IInC zc?QM0z^CoJlM6rEg4^_AV=sG)%@1X-^0`3vL_Nb`P;D8_F)iR@740o+wzre{`d|v7 zN#all!78gLbbt7N$HG$rQ)JjtftFI?2AwA|^qhwqFASHP2nqYs+E3k^H60vgT3QP{ zmVZ>^yn?ei9xlaZWeKfrZ}fwqjvvj>3|Z7dfD9wT!nzu=V(C|~$M;GRW ztN{ECxW4@)rAeiqsG|i7)QUY=2kQ?484NE5kns|h77SPq6NtZq-do#6pSItfPo3mB zImY$8DmI_kpQmuW7pID)A3iyzkAdojMW>O68MTCPR~X7LaaT5`Mt_>n`jpL&PW@F^ zai(0q&*$E-+va)p^Cv_cTeZ?W?^BO)%GAn<*g*Z%0U&(LSj||KxRO`s>3zkWMy0Jp zB2i+?Z?)$#;My6z0yHj8gYzl=*ZM*>k1qzZj?W4d-!{I%{4-tgZLM&pQnM>;tI9|4 zhd&%6Ti6i>B6890hUJ@;&LGsw+;5y}54Zd$e2B@3iAn2v$>8wXaMOmT&WW8|Eig-5 z04sT46V}O^?e@N0^d|!Ajt=@nV|aPzc{@CWM^45e?QaDJEB4;Qe|{b>=7q1xPf$zV z23M5H{Mn|U_~{LQixVI7E0CB~y}&>iJlEQ4?e@F(Wp0}USEc@`@ic_-`rEWq(C~Qe zc(st%Hzk`0Wq?ug%|E85gptayqwqW4ef9)(eN&q?zRIPD&|@5Ch@F|)??sVR5)|^GWXm7?=V1J`!-bCF#z)=zb-IcGFe04hAUj!+3Y*X&f-_S0ZMP zqOkY__oDqFEVQ5igRTEd)X>n@!EUsMhKBR?8g^0fhH9%PzCRe+HJPrUcV~n_-&=VP z5c%dLCx*1EJuquhL5@KsLmCXoKCq;V)U=GqSL4N9^WCVJW@gIME))V7OiqikX{uSK zIt5`-#A9|FyAvOJQ#mR8_o;w-)mw&wnG~y#+Y_&D_V` z2XJR%6F})v9br|t3)eD-8}|?GdblQaO55GXdwyOm6UR2r)Mbk$+&yS6BCs^ z`+W$>!;SXm*WoXv@_2G@u8CK`_zD=~MXkLG-#k^Z)%pi&OuwLnc}7I{#Z+kHlnqjp zH}(YJrui)4UJ$)VQ@1nIKcDu*9^qhq2n`O#*e(&#c6ROjS;bQaP7BOA8K%i|C9U38 zws$tZvnyO|W!030awa>VHj{W_S|8*Pg1r|3doS5hv)+%AJFi=(2-;He%5p{Wb(P%T zjSLe=C`+pbzR01+H2KpG6)3uSvg1M~$AWeXpHsNpiI&edXzS&8tv>!vEhrm9@7c(< zdo6qrPemGP-C*FSc^r!cQ3WL&w2u!NF*Z z4;wE!_#BXto4&mcz3+|d_|>CO7@{>cu(!{<@(Z)hxJi9=CgFPw&gI2HY?Xd3!z))b z0Vp*%=5SLEf54rNps>8NOVJu7fyQ!e+

T}5V*%!i-R0H3Zxmsx$-Ae|+ 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%0A)g@P7@89)Zv4H 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 literal 0 HcmV?d00001 diff --git a/solutions/1.1-limits.py b/solutions/1.1-limits.py deleted file mode 100644 index 37bf892..0000000 --- a/solutions/1.1-limits.py +++ /dev/null @@ -1,3 +0,0 @@ -fig, ax = plt.subplots(1, 1) -ax.set_ylim(1000, 500) -plt.show() diff --git a/solutions/1.1-subplots_and_basic_plotting.py b/solutions/1.1-subplots_and_basic_plotting.py new file mode 100644 index 0000000..4a641d6 --- /dev/null +++ b/solutions/1.1-subplots_and_basic_plotting.py @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib.pyplot as plt + +x = np.linspace(0, 10, 100) +y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2) +names = ['Signal 1', 'Signal 2', 'Signal 3'] + +fig, axes = plt.subplots(nrows=3) + +for ax, y, name in zip(axes, [y1, y2, y3], names): + ax.plot(x, y, color='black') + ax.set(xticks=[], yticks=[], title=name) + +plt.show() diff --git a/solutions/1.2-legends_and_scaling.py b/solutions/1.2-legends_and_scaling.py new file mode 100644 index 0000000..2dda763 --- /dev/null +++ b/solutions/1.2-legends_and_scaling.py @@ -0,0 +1,18 @@ +import numpy as np +import matplotlib.pyplot as plt + +t = np.linspace(0, 2 * np.pi, 150) +x1, y1 = np.cos(t), np.sin(t) +x2, y2 = 2 * x1, 2 * y1 + +colors = ['darkred', 'darkgreen'] + +fig, ax = plt.subplots() +ax.plot(x1, y1, color=colors[0], label='Inner', linewidth=3) +ax.plot(x2, y2, color=colors[1], label='Outer', linewidth=3) +ax.legend() + +ax.axis('equal') +ax.margins(0.05) + +plt.show() diff --git a/solutions/1.2-spines.py b/solutions/1.2-spines.py deleted file mode 100644 index ae58e32..0000000 --- a/solutions/1.2-spines.py +++ /dev/null @@ -1,12 +0,0 @@ -fig, ax = plt.subplots(1, 1) -ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5]) - -ax.spines['top'].set_position('center') -ax.spines['right'].set_position('center') -ax.tick_params(axis='both', direction='inout', length=10) - -# Move the two remaining spines "out" away from the plot by 10 points -ax.spines['bottom'].set_position(('outward', 10)) -ax.spines['left'].set_position(('outward', 10)) - -plt.show() diff --git a/solutions/1.3-spines_ticks_and_subplot_spacing.py b/solutions/1.3-spines_ticks_and_subplot_spacing.py new file mode 100644 index 0000000..088d47b --- /dev/null +++ b/solutions/1.3-spines_ticks_and_subplot_spacing.py @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt +import numpy as np + +data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)] +animals, friendliness, popularity = zip(*data) + + +def plot_and_setup_spines(ax, animals, y, ylabel): + x = np.arange(len(animals)) + ax.bar(x, y, align='center', color='gray') + ax.set(xticks=x, xticklabels=animals, ylabel=ylabel) + + ax.xaxis.set_ticks_position('bottom') + ax.yaxis.set_ticks_position('left') + ax.spines['bottom'].set_position(('data', 0)) + ax.tick_params(axis='x', direction='inout', length=8) + ax.margins(0.05) + +fig, axes = plt.subplots(nrows=2) +fig.subplots_adjust(hspace=0.0) + +plot_and_setup_spines(axes[0], animals, friendliness, 'Friendliness') +plot_and_setup_spines(axes[1], animals, popularity, 'Popularity') + +plt.show() From 94a09561805330274fa3308971b7c75149301434 Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 10:53:49 -0500 Subject: [PATCH 03/61] Fix broken links Joe introduced in the last commit --- AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index fd48d10..ed25e49 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -443,7 +443,7 @@ "\n", "Let's use some of what we've been talking about. Can you reproduce this figure?\n", "\n", - "\n", + "\n", "\n", "Here's the data and some code to get you started." ] @@ -675,7 +675,7 @@ "\n", "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", "\n", - "\n", + "\n", "\n", "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" ] diff --git a/README.md b/README.md index e40f6c2..28bfa1e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Cheers! [Part 0: Introduction To NumPy]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb -[Part 1: PyPlot]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-pyplot.ipynb +[Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb [Part 2: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb [Part 3: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-Artists.ipynb [Part 4: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-mpl_toolkits.ipynb From 5ef249b3649785363defe9c194ba55658bba4d4a Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 11:46:53 -0500 Subject: [PATCH 04/61] Reverted Part1 to nbformat 3.0 for compatibility with IPython 1.x and 2.x --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 1927 +++++++++-------- 1 file changed, 967 insertions(+), 960 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index ed25e49..0c88701 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -1,960 +1,4 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "# Matplotlib\n", - "## Introduction\n", - "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Online Documentation\n", - "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", - "\n", - "## Gallery\n", - "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", - "\n", - "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", - "\n", - "## Mailing Lists and StackOverflow\n", - "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](http://sourceforge.net/mail/?group_id=80706). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", - "\n", - "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too!\n", - "\n", - "## Github repository\n", - "### Location\n", - "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", - "\n", - "### Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://github.com/matplotlib/matplotlib/wiki))." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quick note on \"backends\" and IPython notebooks\n", - "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.4.3\n", - "Qt4Agg\n" - ] - } - ], - "source": [ - "import matplotlib\n", - "print(matplotlib.__version__)\n", - "print(matplotlib.get_backend())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", - "\n", - "Inside of IPython, it's often easiest to use the IPython ``nbagg`` backend. This allows plots to be displayed and interacted with inline in the browser in an IPython notebook. Otherwise, figures will pop up in a separate gui window.\n", - "\n", - "We can do this in two ways:\n", - "\n", - "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", - " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", - " \n", - "2. ``matplotlib.use(\"backend_name\")``\n", - " - Figures will only be shown when you call ``plt.show()``.\n", - "\n", - "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", - "\n", - "One final note: You need to do this before you ``import matplotlib.pyplot``." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "matplotlib.use('nbagg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On with the show!\n", - "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", - "\n", - "###Anatomy of a \"Plot\"\n", - "\n", - "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", - "\n", - "\n", - "\n", - "\n", - "The ``Figure`` is the top-level container in this hirearchy. It's the overall window/page that everything is drawn on. You can have multiple independent figures, but they can't contain another figure. However, ``Figure``s can contain multiple ``Axes``. \n", - "\n", - "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an axes with a call to ``subplot`` (which places axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of thse.\n", - "\n", - "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from. Each ``Axes`` has two ``Axis`` instances.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Getting Started\n", - "\n", - "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Figures\n", - "\n", - "Now let's create a figure..." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig = plt.figure()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Awww, nothing happened! This is because by default mpl will not show anything until told to do so, as we mentioned earlier in the \"backend\" discussion.\n", - "\n", - "Instead, we'll need to call ``plt.show()``" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, a blank figure! Not terribly useful yet.\n", - "\n", - "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", - "\n", - "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Twice as tall as it is wide:\n", - "fig = plt.figure(figsize=plt.figaspect(2.0))\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axes\n", - "\n", - "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object.\n", - "\n", - "Typically, you'll set up a `Figure`, and then add an `Axes` to it. \n", - "\n", - "You can use `fig.add_axes`, but in most cases, you'll find that adding a subplot will fit your needs perfectly. (Again a \"subplot\" is just an axes on a grid system.) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", - "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. (This dates from a time before Python's ``property``.) \n", - "\n", - "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", - "\n", - "For example, we could have written the third line above as:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "ax.set_xlim([0.5, 4.5])\n", - "ax.set_ylim([-2, 8])\n", - "ax.set_title('An Example Axes')\n", - "ax.set_ylabel('Y-Axis')\n", - "ax.set_xlabel('X-Axis')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Clearly this can get repitive quickly. Therefore, Matplotlib's `set` method can be very handy. It takes each kwarg you pass it and tries to call the corresponding \"setter\". For example, `foo.set(bar='blah')` would call `foo.set_bar('blah')`.\n", - "\n", - "Note that the `set` method doesn't just apply to `Axes`; it applies to more-or-less all matplotlib objects.\n", - "\n", - "However, there are cases where you'll want to use things like `ax.set_xlabel('Some Label', size=25)` to control other options for a particular function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Basic Plotting\n", - "\n", - "Most plotting happens on an `Axes`. Therefore, if you're plotting something on an axes, then you'll use one of its methods.\n", - "\n", - "We'll talk about different plotting methods in more depth in the next section. For now, let's focus on two methods: `plot` and `scatter`.\n", - "\n", - "`plot` draws points with lines connecting them. `scatter` draws unconnected points, optionally scaled or colored by additional variables.\n", - "\n", - "As a basic example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", - "ax.set_xlim(0.5, 4.5)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Axes methods vs. pyplot\n", - "\n", - "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", - "plt.xlim(0.5, 4.5)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", - "\n", - "\"Explicit is better than implicit\"\n", - "\n", - "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon.\n", - "\n", - "The advantage of keeping which axes we're working with very clear in our code will become more obvious when we start to have multiple axes in one figure." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple Axes\n", - "\n", - "We've mentioned before that a figure can have more than one `Axes` on it. If you want your axes to be on a regular grid system, then it's easiest to use `plt.subplots(...)` to create a figure and add the axes to it automatically.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(nrows=2, ncols=2)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`plt.subplots(...)` created a new figure and added 4 subplots to it. The `axes` object that was returned is a 2D numpy object array. Each item in the array is one of the subplots. They're laid out as you see them on the figure. \n", - "\n", - "Therefore, when we want to work with one of these axes, we can index the `axes` array and use that item's methods.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(nrows=2, ncols=2)\n", - "axes[0,0].set(title='Upper Left')\n", - "axes[0,1].set(title='Upper Right')\n", - "axes[1,0].set(title='Lower Left')\n", - "axes[1,1].set(title='Lower Right')\n", - "\n", - "# To iterate over all items in a multidimensional numpy array, use the `flat` attribute\n", - "for ax in axes.flat:\n", - " # Remove all xticks and yticks...\n", - " ax.set(xticks=[], yticks=[])\n", - " \n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One really nice thing about `plt.subplots()` is that when it's called with no arguments, it creates a new figure with a single subplot. \n", - "\n", - "Any time you see something like\n", - "\n", - "```\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "```\n", - "\n", - "You can replace it with:\n", - "\n", - "```\n", - "fig, ax = plt.subplots()\n", - "```\n", - "\n", - "We'll be using that approach for the rest of the examples. It's much cleaner. \n", - "\n", - "However, keep in mind that we're still creating a figure and adding axes to it. We we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Quick Exercise: Exercise 1.1\n", - "--------------\n", - "\n", - "Let's use some of what we've been talking about. Can you reproduce this figure?\n", - "\n", - "\n", - "\n", - "Here's the data and some code to get you started." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Our data...\n", - "x = np.linspace(0, 10, 100)\n", - "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", - "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", - "\n", - "# Can you figure out what to do next to plot x vs y1, y2, and y3?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Limits and autoscaling\n", - "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###`ax.margins(...)`\n", - "\n", - "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", - "\n", - "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", - "ax2.margins(0.05) # 5% padding in all directions\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `ax.axis(...)`\n", - "\n", - "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", - "\n", - "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", - "\n", - " xmin, xmax, ymin, ymax = ax.axis()\n", - " \n", - "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", - "\n", - " ax.axis([xmin, xmax, ymin, ymax])\n", - " \n", - "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", - "\n", - " * *tight*: Set axes limits to the exact range of the data\n", - " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", - " \n", - "And as an example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(nrows=3)\n", - "\n", - "for ax in axes:\n", - " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", - "\n", - "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", - "axes[1].axis('tight')\n", - "\n", - "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", - "axes[2].axis('equal')\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Manually setting only one limit\n", - "\n", - "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Good -- setting limits after plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Bad -- Setting limits before plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Legends\n", - "\n", - "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", - "\n", - "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", - "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", - "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", - "ax.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", - "\n", - " ax.legend(loc=\"best\")\n", - " \n", - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", - "\n", - "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", - "ax.legend(loc='best')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 1.2\n", - "\n", - "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", - "\n", - "\n", - "\n", - "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "t = np.linspace(0, 2 * np.pi, 150)\n", - "x1, y1 = np.cos(t), np.sin(t)\n", - "x2, y2 = 2 * x1, 2 * y1\n", - "\n", - "colors = ['darkred', 'darkgreen']\n", - "\n", - "# Try to plot the two circles, scale the axes as shown and add a legend\n", - "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dealing with the boundaries: Layout, ticks, spines, etc\n", - "\n", - "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", - "\n", - "## Ticks, Tick Lines, Tick Labels and Tickers\n", - "This is a constant source of confusion:\n", - "\n", - "* A Tick is the *location* of a Tick Label.\n", - "* A Tick Line is the line that denotes the location of the tick.\n", - "* A Tick Label is the text that is displayed at that tick.\n", - "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", - "\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "\n", - "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", - "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", - "\n", - "# Make the y-ticks a bit longer and go both in and out...\n", - "ax.tick_params(axis='y', direction='inout', length=10)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", - " \n", - "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", - "fruit, value = zip(*data)\n", - "\n", - "fig, ax = plt.subplots()\n", - "x = np.arange(len(fruit))\n", - "ax.bar(x, value, align='center', color='gray')\n", - "ax.set(xticks=x, xticklabels=fruit)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Subplot Spacing\n", - "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", - "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", - " left=0.125, right=0.9,\n", - " top=0.9, bottom=0.1)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", - "\n", - "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", - "\n", - "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "def example_plot(ax):\n", - " ax.plot([1, 2])\n", - " ax.set_xlabel('x-label', fontsize=16)\n", - " ax.set_ylabel('y-label', fontsize=8)\n", - " ax.set_title('Title', fontsize=24)\n", - "\n", - "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", - "example_plot(ax1)\n", - "example_plot(ax2)\n", - "example_plot(ax3)\n", - "example_plot(ax4)\n", - "\n", - "# Try enabling fig.tight_layout to compare...\n", - "#fig.tight_layout()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GridSpec\n", - "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sharing axes\n", - "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## \"Twinning\" axes\n", - "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, ax1 = plt.subplots(1, 1)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2 = ax1.twinx()\n", - "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", - "ax1.set_xlabel('X')\n", - "ax1.set_ylabel('First scale')\n", - "ax2.set_ylabel('Other scale')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axis Spines\n", - "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "fig, ax = plt.subplots()\n", - "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", - "ax.spines['top'].set_visible(False)\n", - "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", - "ax.spines['right'].set_visible(False)\n", - "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", - "\n", - "# \"outward\"\n", - "# Move the two remaining spines \"out\" away from the plot by 10 points\n", - "ax.spines['bottom'].set_position(('outward', 10))\n", - "ax.spines['left'].set_position(('outward', 10))\n", - "\n", - "# \"data\"\n", - "# Have the spines stay intersected at (0,0)\n", - "#ax.spines['bottom'].set_position(('data', 0))\n", - "#ax.spines['left'].set_position(('data', 0))\n", - "\n", - "# \"axes\"\n", - "# Have the two remaining spines placed at a fraction of the axes\n", - "#ax.spines['bottom'].set_position(('axes', 0.75))\n", - "#ax.spines['left'].set_position(('axes', 0.25))\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 1.3\n", - "\n", - "This one is a bit trickier. Once again, try to reproduce the figure below:\n", - "\n", - "\n", - "\n", - "\n", - "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", - "\n", - "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%load exercises/1.2-spines.py" - ] - } - ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -972,8 +16,971 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" - } + }, + "name": "" }, - "nbformat": 4, - "nbformat_minor": 0 -} + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n" + ], + "language": "python", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "# Matplotlib\n", + "## Introduction\n", + "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Online Documentation\n", + "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", + "\n", + "## Gallery\n", + "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", + "\n", + "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", + "\n", + "## Mailing Lists and StackOverflow\n", + "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](http://sourceforge.net/mail/?group_id=80706). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "\n", + "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too!\n", + "\n", + "## Github repository\n", + "### Location\n", + "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", + "\n", + "### Bug Reports and feature requests\n", + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://github.com/matplotlib/matplotlib/wiki))." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quick note on \"backends\" and IPython notebooks\n", + "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import matplotlib\n", + "print(matplotlib.__version__)\n", + "print(matplotlib.get_backend())" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1.4.3\n", + "Qt4Agg\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", + "\n", + "Inside of IPython, it's often easiest to use the IPython ``nbagg`` backend. This allows plots to be displayed and interacted with inline in the browser in an IPython notebook. Otherwise, figures will pop up in a separate gui window.\n", + "\n", + "We can do this in two ways:\n", + "\n", + "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", + " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", + " \n", + "2. ``matplotlib.use(\"backend_name\")``\n", + " - Figures will only be shown when you call ``plt.show()``.\n", + "\n", + "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", + "\n", + "One final note: You need to do this before you ``import matplotlib.pyplot``." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "matplotlib.use('nbagg')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On with the show!\n", + "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", + "\n", + "###Anatomy of a \"Plot\"\n", + "\n", + "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", + "\n", + "\n", + "\n", + "\n", + "The ``Figure`` is the top-level container in this hirearchy. It's the overall window/page that everything is drawn on. You can have multiple independent figures, but they can't contain another figure. However, ``Figure``s can contain multiple ``Axes``. \n", + "\n", + "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an axes with a call to ``subplot`` (which places axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of thse.\n", + "\n", + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from. Each ``Axes`` has two ``Axis`` instances.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Getting Started\n", + "\n", + "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Figures\n", + "\n", + "Now let's create a figure..." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig = plt.figure()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Awww, nothing happened! This is because by default mpl will not show anything until told to do so, as we mentioned earlier in the \"backend\" discussion.\n", + "\n", + "Instead, we'll need to call ``plt.show()``" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, a blank figure! Not terribly useful yet.\n", + "\n", + "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", + "\n", + "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Twice as tall as it is wide:\n", + "fig = plt.figure(figsize=plt.figaspect(2.0))\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axes\n", + "\n", + "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object.\n", + "\n", + "Typically, you'll set up a `Figure`, and then add an `Axes` to it. \n", + "\n", + "You can use `fig.add_axes`, but in most cases, you'll find that adding a subplot will fit your needs perfectly. (Again a \"subplot\" is just an axes on a grid system.) " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", + "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. (This dates from a time before Python's ``property``.) \n", + "\n", + "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", + "\n", + "For example, we could have written the third line above as:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "ax.set_xlim([0.5, 4.5])\n", + "ax.set_ylim([-2, 8])\n", + "ax.set_title('An Example Axes')\n", + "ax.set_ylabel('Y-Axis')\n", + "ax.set_xlabel('X-Axis')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Clearly this can get repitive quickly. Therefore, Matplotlib's `set` method can be very handy. It takes each kwarg you pass it and tries to call the corresponding \"setter\". For example, `foo.set(bar='blah')` would call `foo.set_bar('blah')`.\n", + "\n", + "Note that the `set` method doesn't just apply to `Axes`; it applies to more-or-less all matplotlib objects.\n", + "\n", + "However, there are cases where you'll want to use things like `ax.set_xlabel('Some Label', size=25)` to control other options for a particular function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Basic Plotting\n", + "\n", + "Most plotting happens on an `Axes`. Therefore, if you're plotting something on an axes, then you'll use one of its methods.\n", + "\n", + "We'll talk about different plotting methods in more depth in the next section. For now, let's focus on two methods: `plot` and `scatter`.\n", + "\n", + "`plot` draws points with lines connecting them. `scatter` draws unconnected points, optionally scaled or colored by additional variables.\n", + "\n", + "As a basic example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "ax.set_xlim(0.5, 4.5)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###Axes methods vs. pyplot\n", + "\n", + "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "plt.xlim(0.5, 4.5)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", + "\n", + "\"Explicit is better than implicit\"\n", + "\n", + "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon.\n", + "\n", + "The advantage of keeping which axes we're working with very clear in our code will become more obvious when we start to have multiple axes in one figure." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple Axes\n", + "\n", + "We've mentioned before that a figure can have more than one `Axes` on it. If you want your axes to be on a regular grid system, then it's easiest to use `plt.subplots(...)` to create a figure and add the axes to it automatically.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`plt.subplots(...)` created a new figure and added 4 subplots to it. The `axes` object that was returned is a 2D numpy object array. Each item in the array is one of the subplots. They're laid out as you see them on the figure. \n", + "\n", + "Therefore, when we want to work with one of these axes, we can index the `axes` array and use that item's methods.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "axes[0,0].set(title='Upper Left')\n", + "axes[0,1].set(title='Upper Right')\n", + "axes[1,0].set(title='Lower Left')\n", + "axes[1,1].set(title='Lower Right')\n", + "\n", + "# To iterate over all items in a multidimensional numpy array, use the `flat` attribute\n", + "for ax in axes.flat:\n", + " # Remove all xticks and yticks...\n", + " ax.set(xticks=[], yticks=[])\n", + " \n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One really nice thing about `plt.subplots()` is that when it's called with no arguments, it creates a new figure with a single subplot. \n", + "\n", + "Any time you see something like\n", + "\n", + "```\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "```\n", + "\n", + "You can replace it with:\n", + "\n", + "```\n", + "fig, ax = plt.subplots()\n", + "```\n", + "\n", + "We'll be using that approach for the rest of the examples. It's much cleaner. \n", + "\n", + "However, keep in mind that we're still creating a figure and adding axes to it. We we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Quick Exercise: Exercise 1.1\n", + "--------------\n", + "\n", + "Let's use some of what we've been talking about. Can you reproduce this figure?\n", + "\n", + "\n", + "\n", + "Here's the data and some code to get you started." + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Our data...\n", + "x = np.linspace(0, 10, 100)\n", + "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", + "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", + "\n", + "# Can you figure out what to do next to plot x vs y1, y2, and y3?" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits and autoscaling\n", + "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###`ax.margins(...)`\n", + "\n", + "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", + "\n", + "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", + "ax2.margins(0.05) # 5% padding in all directions\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `ax.axis(...)`\n", + "\n", + "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", + "\n", + "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", + "\n", + " xmin, xmax, ymin, ymax = ax.axis()\n", + " \n", + "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", + "\n", + " ax.axis([xmin, xmax, ymin, ymax])\n", + " \n", + "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", + "\n", + " * *tight*: Set axes limits to the exact range of the data\n", + " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", + " \n", + "And as an example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(nrows=3)\n", + "\n", + "for ax in axes:\n", + " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", + "\n", + "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", + "axes[1].axis('tight')\n", + "\n", + "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", + "axes[2].axis('equal')\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Manually setting only one limit\n", + "\n", + "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Good -- setting limits after plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Bad -- Setting limits before plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Legends\n", + "\n", + "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", + "\n", + "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", + "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", + "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", + "ax.legend()\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", + "\n", + " ax.legend(loc=\"best\")\n", + " \n", + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", + "\n", + "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots(1, 1)\n", + "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", + "ax.legend(loc='best')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 1.2\n", + "\n", + "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", + "\n", + "\n", + "\n", + "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "t = np.linspace(0, 2 * np.pi, 150)\n", + "x1, y1 = np.cos(t), np.sin(t)\n", + "x2, y2 = 2 * x1, 2 * y1\n", + "\n", + "colors = ['darkred', 'darkgreen']\n", + "\n", + "# Try to plot the two circles, scale the axes as shown and add a legend\n", + "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dealing with the boundaries: Layout, ticks, spines, etc\n", + "\n", + "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", + "\n", + "## Ticks, Tick Lines, Tick Labels and Tickers\n", + "This is a constant source of confusion:\n", + "\n", + "* A Tick is the *location* of a Tick Label.\n", + "* A Tick Line is the line that denotes the location of the tick.\n", + "* A Tick Label is the text that is displayed at that tick.\n", + "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", + "\n", + "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", + "\n", + "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", + "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", + "\n", + "# Make the y-ticks a bit longer and go both in and out...\n", + "ax.tick_params(axis='y', direction='inout', length=10)\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", + " \n", + "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", + "fruit, value = zip(*data)\n", + "\n", + "fig, ax = plt.subplots()\n", + "x = np.arange(len(fruit))\n", + "ax.bar(x, value, align='center', color='gray')\n", + "ax.set(xticks=x, xticklabels=fruit)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subplot Spacing\n", + "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", + "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", + " left=0.125, right=0.9,\n", + " top=0.9, bottom=0.1)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", + "\n", + "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", + "\n", + "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def example_plot(ax):\n", + " ax.plot([1, 2])\n", + " ax.set_xlabel('x-label', fontsize=16)\n", + " ax.set_ylabel('y-label', fontsize=8)\n", + " ax.set_title('Title', fontsize=24)\n", + "\n", + "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", + "example_plot(ax1)\n", + "example_plot(ax2)\n", + "example_plot(ax3)\n", + "example_plot(ax4)\n", + "\n", + "# Try enabling fig.tight_layout to compare...\n", + "#fig.tight_layout()\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GridSpec\n", + "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sharing axes\n", + "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## \"Twinning\" axes\n", + "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax1 = plt.subplots(1, 1)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2 = ax1.twinx()\n", + "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", + "ax1.set_xlabel('X')\n", + "ax1.set_ylabel('First scale')\n", + "ax2.set_ylabel('Other scale')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axis Spines\n", + "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", + "ax.spines['top'].set_visible(False)\n", + "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", + "ax.spines['right'].set_visible(False)\n", + "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", + "\n", + "# \"outward\"\n", + "# Move the two remaining spines \"out\" away from the plot by 10 points\n", + "ax.spines['bottom'].set_position(('outward', 10))\n", + "ax.spines['left'].set_position(('outward', 10))\n", + "\n", + "# \"data\"\n", + "# Have the spines stay intersected at (0,0)\n", + "#ax.spines['bottom'].set_position(('data', 0))\n", + "#ax.spines['left'].set_position(('data', 0))\n", + "\n", + "# \"axes\"\n", + "# Have the two remaining spines placed at a fraction of the axes\n", + "#ax.spines['bottom'].set_position(('axes', 0.75))\n", + "#ax.spines['left'].set_position(('axes', 0.25))\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 1.3\n", + "\n", + "This one is a bit trickier. Once again, try to reproduce the figure below:\n", + "\n", + "\n", + "\n", + "\n", + "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", + "\n", + "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", + "\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load exercises/1.2-spines.py" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + } + ], + "metadata": {} + } + ] +} \ No newline at end of file From 5572564ca7cf50fa7f7440745c88f3ee0e761e9c Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 10:58:44 -0500 Subject: [PATCH 05/61] Added .gitignore for ipython checkpoints, .pyc, etc --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a85a0f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.swp +.ipynb_checkpoints From d516ed489549c44947c484f665b0f2606fa48782 Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 13:30:31 -0500 Subject: [PATCH 06/61] Split Part 1 into two pieces and updated names/links. No content changes --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 487 ---------------- ...lib-Part2-Limits_Legends_and_Layouts.ipynb | 527 ++++++++++++++++++ ...tomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 0 ...=> AnatomyOfMatplotlib-Part4-Artists.ipynb | 0 ...atomyOfMatplotlib-Part5-mpl_toolkits.ipynb | 0 README.md | 16 +- ..._scaling.py => 2.1-legends_and_scaling.py} | 0 ...> 2.2-spines_ticks_and_subplot_spacing.py} | 0 exercises/{2.1-colors.py => 3.1-colors.py} | 0 exercises/{2.2-markers.py => 3.2-markers.py} | 0 .../{2.3-properties.py => 3.3-properties.py} | 0 exercises/{2.4-arrows.py => 3.4-arrows.py} | 0 .../{3.1-goldstar.py => 4.1-goldstar.py} | 0 images/{exercise_1-2.png => exercise_2-1.png} | Bin images/{exercise_1.3.png => exercise_2-2.png} | Bin ..._scaling.py => 2.1-legends_and_scaling.py} | 0 ...> 2.2-spines_ticks_and_subplot_spacing.py} | 0 solutions/{2.1-colors.py => 3.1-colors.py} | 0 solutions/{2.2-markers.py => 3.2-markers.py} | 0 .../{2.3-properties.py => 3.3-properties.py} | 0 solutions/{2.4-arrows.py => 3.4-arrows.py} | 0 .../{3.1-goldstar.py => 4.1-goldstar.py} | 0 22 files changed, 536 insertions(+), 494 deletions(-) create mode 100644 AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb rename AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb => AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb (100%) rename AnatomyOfMatplotlib-Part3-Artists.ipynb => AnatomyOfMatplotlib-Part4-Artists.ipynb (100%) rename AnatomyOfMatplotlib-Part4-mpl_toolkits.ipynb => AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb (100%) rename exercises/{1.2-legends_and_scaling.py => 2.1-legends_and_scaling.py} (100%) rename exercises/{1.3-spines_ticks_and_subplot_spacing.py => 2.2-spines_ticks_and_subplot_spacing.py} (100%) rename exercises/{2.1-colors.py => 3.1-colors.py} (100%) rename exercises/{2.2-markers.py => 3.2-markers.py} (100%) rename exercises/{2.3-properties.py => 3.3-properties.py} (100%) rename exercises/{2.4-arrows.py => 3.4-arrows.py} (100%) rename exercises/{3.1-goldstar.py => 4.1-goldstar.py} (100%) rename images/{exercise_1-2.png => exercise_2-1.png} (100%) rename images/{exercise_1.3.png => exercise_2-2.png} (100%) rename solutions/{1.2-legends_and_scaling.py => 2.1-legends_and_scaling.py} (100%) rename solutions/{1.3-spines_ticks_and_subplot_spacing.py => 2.2-spines_ticks_and_subplot_spacing.py} (100%) rename solutions/{2.1-colors.py => 3.1-colors.py} (100%) rename solutions/{2.2-markers.py => 3.2-markers.py} (100%) rename solutions/{2.3-properties.py => 3.3-properties.py} (100%) rename solutions/{2.4-arrows.py => 3.4-arrows.py} (100%) rename solutions/{3.1-goldstar.py => 4.1-goldstar.py} (100%) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index 0c88701..d5357f4 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -491,493 +491,6 @@ "metadata": {}, "outputs": [], "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Limits and autoscaling\n", - "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###`ax.margins(...)`\n", - "\n", - "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", - "\n", - "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", - "ax2.margins(0.05) # 5% padding in all directions\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `ax.axis(...)`\n", - "\n", - "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", - "\n", - "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", - "\n", - " xmin, xmax, ymin, ymax = ax.axis()\n", - " \n", - "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", - "\n", - " ax.axis([xmin, xmax, ymin, ymax])\n", - " \n", - "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", - "\n", - " * *tight*: Set axes limits to the exact range of the data\n", - " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", - " \n", - "And as an example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(nrows=3)\n", - "\n", - "for ax in axes:\n", - " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", - "\n", - "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", - "axes[1].axis('tight')\n", - "\n", - "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", - "axes[2].axis('equal')\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Manually setting only one limit\n", - "\n", - "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Good -- setting limits after plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Bad -- Setting limits before plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Legends\n", - "\n", - "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", - "\n", - "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", - "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", - "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", - "ax.legend()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", - "\n", - " ax.legend(loc=\"best\")\n", - " \n", - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", - "\n", - "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", - "ax.legend(loc='best')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 1.2\n", - "\n", - "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", - "\n", - "\n", - "\n", - "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" - ] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "t = np.linspace(0, 2 * np.pi, 150)\n", - "x1, y1 = np.cos(t), np.sin(t)\n", - "x2, y2 = 2 * x1, 2 * y1\n", - "\n", - "colors = ['darkred', 'darkgreen']\n", - "\n", - "# Try to plot the two circles, scale the axes as shown and add a legend\n", - "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dealing with the boundaries: Layout, ticks, spines, etc\n", - "\n", - "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", - "\n", - "## Ticks, Tick Lines, Tick Labels and Tickers\n", - "This is a constant source of confusion:\n", - "\n", - "* A Tick is the *location* of a Tick Label.\n", - "* A Tick Line is the line that denotes the location of the tick.\n", - "* A Tick Label is the text that is displayed at that tick.\n", - "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", - "\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "\n", - "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", - "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", - "\n", - "# Make the y-ticks a bit longer and go both in and out...\n", - "ax.tick_params(axis='y', direction='inout', length=10)\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", - " \n", - "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", - "fruit, value = zip(*data)\n", - "\n", - "fig, ax = plt.subplots()\n", - "x = np.arange(len(fruit))\n", - "ax.bar(x, value, align='center', color='gray')\n", - "ax.set(xticks=x, xticklabels=fruit)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Subplot Spacing\n", - "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", - "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", - " left=0.125, right=0.9,\n", - " top=0.9, bottom=0.1)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", - "\n", - "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", - "\n", - "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def example_plot(ax):\n", - " ax.plot([1, 2])\n", - " ax.set_xlabel('x-label', fontsize=16)\n", - " ax.set_ylabel('y-label', fontsize=8)\n", - " ax.set_title('Title', fontsize=24)\n", - "\n", - "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", - "example_plot(ax1)\n", - "example_plot(ax2)\n", - "example_plot(ax3)\n", - "example_plot(ax4)\n", - "\n", - "# Try enabling fig.tight_layout to compare...\n", - "#fig.tight_layout()\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GridSpec\n", - "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sharing axes\n", - "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## \"Twinning\" axes\n", - "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax1 = plt.subplots(1, 1)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2 = ax1.twinx()\n", - "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", - "ax1.set_xlabel('X')\n", - "ax1.set_ylabel('First scale')\n", - "ax2.set_ylabel('Other scale')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axis Spines\n", - "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", - "ax.spines['top'].set_visible(False)\n", - "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", - "ax.spines['right'].set_visible(False)\n", - "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", - "\n", - "# \"outward\"\n", - "# Move the two remaining spines \"out\" away from the plot by 10 points\n", - "ax.spines['bottom'].set_position(('outward', 10))\n", - "ax.spines['left'].set_position(('outward', 10))\n", - "\n", - "# \"data\"\n", - "# Have the spines stay intersected at (0,0)\n", - "#ax.spines['bottom'].set_position(('data', 0))\n", - "#ax.spines['left'].set_position(('data', 0))\n", - "\n", - "# \"axes\"\n", - "# Have the two remaining spines placed at a fraction of the axes\n", - "#ax.spines['bottom'].set_position(('axes', 0.75))\n", - "#ax.spines['left'].set_position(('axes', 0.25))\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 1.3\n", - "\n", - "This one is a bit trickier. Once again, try to reproduce the figure below:\n", - "\n", - "\n", - "\n", - "\n", - "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", - "\n", - "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", - "\n" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/1.2-spines.py" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": null } ], "metadata": {} diff --git a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb new file mode 100644 index 0000000..ec6f09b --- /dev/null +++ b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb @@ -0,0 +1,527 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + }, + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits and autoscaling\n", + "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "###`ax.margins(...)`\n", + "\n", + "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", + "\n", + "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", + "ax2.margins(0.05) # 5% padding in all directions\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `ax.axis(...)`\n", + "\n", + "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", + "\n", + "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", + "\n", + " xmin, xmax, ymin, ymax = ax.axis()\n", + " \n", + "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", + "\n", + " ax.axis([xmin, xmax, ymin, ymax])\n", + " \n", + "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", + "\n", + " * *tight*: Set axes limits to the exact range of the data\n", + " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", + " \n", + "And as an example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(nrows=3)\n", + "\n", + "for ax in axes:\n", + " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", + "\n", + "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", + "axes[1].axis('tight')\n", + "\n", + "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", + "axes[2].axis('equal')\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Manually setting only one limit\n", + "\n", + "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Good -- setting limits after plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Bad -- Setting limits before plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Legends\n", + "\n", + "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", + "\n", + "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", + "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", + "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", + "ax.legend()\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", + "\n", + " ax.legend(loc=\"best\")\n", + " \n", + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", + "\n", + "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots(1, 1)\n", + "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", + "ax.legend(loc='best')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 2.1\n", + "\n", + "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", + "\n", + "\n", + "\n", + "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "t = np.linspace(0, 2 * np.pi, 150)\n", + "x1, y1 = np.cos(t), np.sin(t)\n", + "x2, y2 = 2 * x1, 2 * y1\n", + "\n", + "colors = ['darkred', 'darkgreen']\n", + "\n", + "# Try to plot the two circles, scale the axes as shown and add a legend\n", + "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dealing with the boundaries: Layout, ticks, spines, etc\n", + "\n", + "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", + "\n", + "## Ticks, Tick Lines, Tick Labels and Tickers\n", + "This is a constant source of confusion:\n", + "\n", + "* A Tick is the *location* of a Tick Label.\n", + "* A Tick Line is the line that denotes the location of the tick.\n", + "* A Tick Label is the text that is displayed at that tick.\n", + "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", + "\n", + "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", + "\n", + "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", + "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", + "\n", + "# Make the y-ticks a bit longer and go both in and out...\n", + "ax.tick_params(axis='y', direction='inout', length=10)\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", + " \n", + "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", + "fruit, value = zip(*data)\n", + "\n", + "fig, ax = plt.subplots()\n", + "x = np.arange(len(fruit))\n", + "ax.bar(x, value, align='center', color='gray')\n", + "ax.set(xticks=x, xticklabels=fruit)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subplot Spacing\n", + "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", + "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", + " left=0.125, right=0.9,\n", + " top=0.9, bottom=0.1)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", + "\n", + "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", + "\n", + "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "def example_plot(ax):\n", + " ax.plot([1, 2])\n", + " ax.set_xlabel('x-label', fontsize=16)\n", + " ax.set_ylabel('y-label', fontsize=8)\n", + " ax.set_title('Title', fontsize=24)\n", + "\n", + "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", + "example_plot(ax1)\n", + "example_plot(ax2)\n", + "example_plot(ax3)\n", + "example_plot(ax4)\n", + "\n", + "# Try enabling fig.tight_layout to compare...\n", + "#fig.tight_layout()\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GridSpec\n", + "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sharing axes\n", + "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## \"Twinning\" axes\n", + "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax1 = plt.subplots(1, 1)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2 = ax1.twinx()\n", + "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", + "ax1.set_xlabel('X')\n", + "ax1.set_ylabel('First scale')\n", + "ax2.set_ylabel('Other scale')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axis Spines\n", + "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", + "ax.spines['top'].set_visible(False)\n", + "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", + "ax.spines['right'].set_visible(False)\n", + "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", + "\n", + "# \"outward\"\n", + "# Move the two remaining spines \"out\" away from the plot by 10 points\n", + "ax.spines['bottom'].set_position(('outward', 10))\n", + "ax.spines['left'].set_position(('outward', 10))\n", + "\n", + "# \"data\"\n", + "# Have the spines stay intersected at (0,0)\n", + "#ax.spines['bottom'].set_position(('data', 0))\n", + "#ax.spines['left'].set_position(('data', 0))\n", + "\n", + "# \"axes\"\n", + "# Have the two remaining spines placed at a fraction of the axes\n", + "#ax.spines['bottom'].set_position(('axes', 0.75))\n", + "#ax.spines['left'].set_position(('axes', 0.25))\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 2.2\n", + "\n", + "This one is a bit trickier. Once again, try to reproduce the figure below:\n", + "\n", + "\n", + "\n", + "\n", + "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", + "\n", + "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", + "\n" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# %load exercises/2.2-spines_ticks_and_subplot_spacing.py\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Try to reproduce the figure shown in images/exercise_1.3.png\n", + "# This one is a bit trickier!\n", + "\n", + "# Here's the data...\n", + "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", + "animals, friendliness, popularity = zip(*data)\n" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb similarity index 100% rename from AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb rename to AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb diff --git a/AnatomyOfMatplotlib-Part3-Artists.ipynb b/AnatomyOfMatplotlib-Part4-Artists.ipynb similarity index 100% rename from AnatomyOfMatplotlib-Part3-Artists.ipynb rename to AnatomyOfMatplotlib-Part4-Artists.ipynb diff --git a/AnatomyOfMatplotlib-Part4-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb similarity index 100% rename from AnatomyOfMatplotlib-Part4-mpl_toolkits.ipynb rename to AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb diff --git a/README.md b/README.md index 28bfa1e..8ff2237 100644 --- a/README.md +++ b/README.md @@ -9,16 +9,18 @@ for conferences and other opportunities for training. The tutorial can be viewed on [nbviewer](http://nbviewer.ipython.org): * [Part 0: Introduction To NumPy] -* [Part 1: PyPlot] -* [Part 2: How To Speak MPL] -* [Part 3: Artists] -* [Part 4: mpl_toolkits] +* [Part 1: Overview of Matplotlib] +* [Part 2: Limits, Legends, and Layouts] +* [Part 3: How To Speak MPL] +* [Part 4: Artists] +* [Part 5: mpl_toolkits] Cheers! [Part 0: Introduction To NumPy]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb [Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb -[Part 2: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-HowToSpeakMPL.ipynb -[Part 3: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-Artists.ipynb -[Part 4: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-mpl_toolkits.ipynb +[Part 2: Limits, Legends and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +[Part 3: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +[Part 4: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Artists.ipynb +[Part 5: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb diff --git a/exercises/1.2-legends_and_scaling.py b/exercises/2.1-legends_and_scaling.py similarity index 100% rename from exercises/1.2-legends_and_scaling.py rename to exercises/2.1-legends_and_scaling.py diff --git a/exercises/1.3-spines_ticks_and_subplot_spacing.py b/exercises/2.2-spines_ticks_and_subplot_spacing.py similarity index 100% rename from exercises/1.3-spines_ticks_and_subplot_spacing.py rename to exercises/2.2-spines_ticks_and_subplot_spacing.py diff --git a/exercises/2.1-colors.py b/exercises/3.1-colors.py similarity index 100% rename from exercises/2.1-colors.py rename to exercises/3.1-colors.py diff --git a/exercises/2.2-markers.py b/exercises/3.2-markers.py similarity index 100% rename from exercises/2.2-markers.py rename to exercises/3.2-markers.py diff --git a/exercises/2.3-properties.py b/exercises/3.3-properties.py similarity index 100% rename from exercises/2.3-properties.py rename to exercises/3.3-properties.py diff --git a/exercises/2.4-arrows.py b/exercises/3.4-arrows.py similarity index 100% rename from exercises/2.4-arrows.py rename to exercises/3.4-arrows.py diff --git a/exercises/3.1-goldstar.py b/exercises/4.1-goldstar.py similarity index 100% rename from exercises/3.1-goldstar.py rename to exercises/4.1-goldstar.py diff --git a/images/exercise_1-2.png b/images/exercise_2-1.png similarity index 100% rename from images/exercise_1-2.png rename to images/exercise_2-1.png diff --git a/images/exercise_1.3.png b/images/exercise_2-2.png similarity index 100% rename from images/exercise_1.3.png rename to images/exercise_2-2.png diff --git a/solutions/1.2-legends_and_scaling.py b/solutions/2.1-legends_and_scaling.py similarity index 100% rename from solutions/1.2-legends_and_scaling.py rename to solutions/2.1-legends_and_scaling.py diff --git a/solutions/1.3-spines_ticks_and_subplot_spacing.py b/solutions/2.2-spines_ticks_and_subplot_spacing.py similarity index 100% rename from solutions/1.3-spines_ticks_and_subplot_spacing.py rename to solutions/2.2-spines_ticks_and_subplot_spacing.py diff --git a/solutions/2.1-colors.py b/solutions/3.1-colors.py similarity index 100% rename from solutions/2.1-colors.py rename to solutions/3.1-colors.py diff --git a/solutions/2.2-markers.py b/solutions/3.2-markers.py similarity index 100% rename from solutions/2.2-markers.py rename to solutions/3.2-markers.py diff --git a/solutions/2.3-properties.py b/solutions/3.3-properties.py similarity index 100% rename from solutions/2.3-properties.py rename to solutions/3.3-properties.py diff --git a/solutions/2.4-arrows.py b/solutions/3.4-arrows.py similarity index 100% rename from solutions/2.4-arrows.py rename to solutions/3.4-arrows.py diff --git a/solutions/3.1-goldstar.py b/solutions/4.1-goldstar.py similarity index 100% rename from solutions/3.1-goldstar.py rename to solutions/4.1-goldstar.py From 9a412628c621ef2f7059b2ff53d4f40b617ed4d6 Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 13:53:24 -0500 Subject: [PATCH 07/61] Added imports and a short intro to Part2 --- ...lib-Part2-Limits_Legends_and_Layouts.ipynb | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb index ec6f09b..56c6bef 100644 --- a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb @@ -24,11 +24,38 @@ "worksheets": [ { "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from __future__ import print_function\n", + "\n", + "# Import conventions we'll be using here. See Part 1\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits, Legends, and Layouts\n", + "\n", + "In this section, we'll focus on what happens around the edges of the axes: Ticks, ticklabels, limits, layouts, and legends." + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Limits and autoscaling\n", + "\n", "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." ] }, From 01d72022e46b2e1fa69be03f2326801c9b98fc6e Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Fri, 26 Jun 2015 16:23:36 -0500 Subject: [PATCH 08/61] Fix exercise references --- ...lib-Part2-Limits_Legends_and_Layouts.ipynb | 2 +- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 93 +++++++++++++------ AnatomyOfMatplotlib-Part4-Artists.ipynb | 51 +++++++--- 3 files changed, 103 insertions(+), 43 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb index 56c6bef..ff9fce8 100644 --- a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb @@ -535,7 +535,7 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", - "# Try to reproduce the figure shown in images/exercise_1.3.png\n", + "# Try to reproduce the figure shown in images/exercise_2.2.png\n", "# This one is a bit trickier!\n", "\n", "# Here's the data...\n", diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 68db2a5..a9ab5be 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -1,7 +1,23 @@ { "metadata": { - "name": "", - "signature": "sha256:fd78007a40ee7741b1dcfaa7d2433f856d967b938376774e12322eeccaf2f9ec" + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + }, + "name": "" }, "nbformat": 3, "nbformat_minor": 0, @@ -15,13 +31,15 @@ "# Let printing work the same in Python 2 and 3\n", "from __future__ import print_function\n", "# Turning on inline plots -- just for use in ipython notebooks.\n", - "%matplotlib inline\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -69,7 +87,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Exercise 2.1\n", + "## Exercise 3.1\n", "Try out some different string representations of colors (you can't do RGB[A] tuples here)." ] }, @@ -77,11 +95,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/2.1-colors.py" + "%load exercises/3.1-colors.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -124,13 +143,14 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Exercise 2.2\n", + "## Exercise 3.2\n", "Try out some different markers and colors" ] }, @@ -138,11 +158,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/2.2-markers.py" + "%load exercises/3.2-markers.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -174,7 +195,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -193,7 +215,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -214,7 +237,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -246,7 +270,7 @@ "|visible | [`True` `False`]\n", "|zorder | any number\n", "\n", - "## Exercise 2.3\n", + "## Exercise 3.3\n", "Make a plot that has a dotted red line, with large yellow diamond markers that have a green edge" ] }, @@ -254,11 +278,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/2.3-properties.py" + "%load exercises/3.3-properties.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -280,7 +305,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "code", @@ -368,7 +394,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -389,7 +416,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -409,7 +437,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -435,7 +464,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -492,13 +522,14 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Exercise 2.4\n", + "## Exercise 3.4\n", "Point out a local minimum with a fancy red arrow." ] }, @@ -506,11 +537,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/2.4-arrows.py" + "%load exercises/3.4-arrows.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -545,7 +577,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -580,7 +613,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -609,7 +643,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", diff --git a/AnatomyOfMatplotlib-Part4-Artists.ipynb b/AnatomyOfMatplotlib-Part4-Artists.ipynb index 6fa83d8..4d61195 100644 --- a/AnatomyOfMatplotlib-Part4-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part4-Artists.ipynb @@ -1,7 +1,23 @@ { "metadata": { - "name": "", - "signature": "sha256:0ed463ce3e3c15589941f95292232da728af5c8fd4698e2ece99a953d2619171" + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + }, + "name": "" }, "nbformat": 3, "nbformat_minor": 0, @@ -15,13 +31,15 @@ "# Let printing work the same in Python 2 and 3\n", "from __future__ import print_function\n", "# Turning on inline plots -- just for use in ipython notebooks.\n", - "%matplotlib inline\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -136,7 +154,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -159,7 +178,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -177,7 +197,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -205,7 +226,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "code", @@ -225,7 +247,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -253,13 +276,14 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Exercise 3.1\n", + "## Exercise 4.1\n", "Give yourselves 4 gold stars!\n", "\n", "Hint: [StarPolygonCollection](http://matplotlib.org/api/collections_api.html#matplotlib.collections.StarPolygonCollection)" @@ -269,11 +293,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/3.1-goldstar.py" + "%load exercises/4.1-goldstar.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null } ], "metadata": {} From d2190bdb0cf2baebafc66f3b592357f7f5ad6414 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sat, 27 Jun 2015 11:12:34 -0400 Subject: [PATCH 09/61] Fix some typos, and cleared cell outputs. --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 63 ++++++------------- ...lib-Part2-Limits_Legends_and_Layouts.ipynb | 55 ++++++---------- README.md | 2 +- 3 files changed, 40 insertions(+), 80 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index d5357f4..90ba626 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -37,8 +37,7 @@ "slide_type": "-" } }, - "outputs": [], - "prompt_number": 1 + "outputs": [] }, { "cell_type": "markdown", @@ -97,17 +96,7 @@ ], "language": "python", "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "1.4.3\n", - "Qt4Agg\n" - ] - } - ], - "prompt_number": 2 + "outputs": [] }, { "cell_type": "markdown", @@ -138,8 +127,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": 3 + "outputs": [] }, { "cell_type": "markdown", @@ -155,11 +143,11 @@ "\n", "\n", "\n", - "The ``Figure`` is the top-level container in this hirearchy. It's the overall window/page that everything is drawn on. You can have multiple independent figures, but they can't contain another figure. However, ``Figure``s can contain multiple ``Axes``. \n", + "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures. However, ``Figure``s can contain multiple ``Axes``. \n", "\n", - "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an axes with a call to ``subplot`` (which places axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of thse.\n", + "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of these.\n", "\n", - "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from. Each ``Axes`` has two ``Axis`` instances.\n" + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" ] }, { @@ -180,8 +168,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -200,8 +187,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -220,8 +206,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -244,8 +229,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -271,15 +255,14 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", - "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. (This dates from a time before Python's ``property``.) \n", + "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. \n", "\n", "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", "\n", @@ -298,8 +281,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -340,8 +322,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -363,8 +344,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -399,8 +379,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -432,8 +411,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -456,7 +434,7 @@ "\n", "We'll be using that approach for the rest of the examples. It's much cleaner. \n", "\n", - "However, keep in mind that we're still creating a figure and adding axes to it. We we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." + "However, keep in mind that we're still creating a figure and adding axes to it. When we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." ] }, { @@ -489,11 +467,10 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb index ff9fce8..affc830 100644 --- a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb @@ -38,8 +38,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": 3 + "outputs": [] }, { "cell_type": "markdown", @@ -72,8 +71,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -102,8 +100,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -150,8 +147,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -176,8 +172,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "code", @@ -193,8 +188,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -220,8 +214,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -242,14 +235,13 @@ "input": [ "fig, ax = plt.subplots(1, 1)\n", "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='darkred', label=\"_nolegend_\", marker='o')\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label=\"_nolegend_\", marker='o', color='darkred')\n", "ax.legend(loc='best')\n", "plt.show()" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -282,8 +274,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": 5 + "outputs": [] }, { "cell_type": "markdown", @@ -321,8 +312,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -350,8 +340,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -373,8 +362,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -410,8 +398,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -440,8 +427,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -466,8 +452,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -507,8 +492,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -544,11 +528,10 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 8ff2237..7e4c822 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Cheers! [Part 0: Introduction To NumPy]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb [Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb -[Part 2: Limits, Legends and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +[Part 2: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb [Part 3: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb [Part 4: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Artists.ipynb [Part 5: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb From f15e164e8b6949248b050a4c1520dbf7df35a2a3 Mon Sep 17 00:00:00 2001 From: joferkingtton Date: Sat, 27 Jun 2015 21:39:21 -0500 Subject: [PATCH 10/61] Fixes Issue #10 by reducing image size --- images/figure_axes_axis_labeled.png | Bin 185257 -> 121920 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/figure_axes_axis_labeled.png b/images/figure_axes_axis_labeled.png index 6470c6279fe9ece662f08877496b3aa11eee9d4e..fc3a2f1d036e2b84ebc9e7a19ce584e884a429bb 100644 GIT binary patch literal 121920 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

tcK?V&vVh-y1#sqDm>ACh;nK15HG6oF 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 B1atrZ literal 185257 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%0D1EWrv>nkUwfj3o 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

T}5V*%!i-R0H3Zxmsx$-Ae|+ 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%0A)g@P7@89)Zv4H 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 From 28ae690df8d033250f83f682a006b2920565e07b Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sat, 4 Jul 2015 15:17:51 -0500 Subject: [PATCH 11/61] Renaming and updating references to make room for new Part2 --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 4 +- ...lib-Part4-Limits_Legends_and_Layouts.ipynb | 117 +++++++++++++----- ...=> AnatomyOfMatplotlib-Part5-Artists.ipynb | 4 +- README.md | 14 ++- ..._scaling.py => 4.1-legends_and_scaling.py} | 2 +- ...> 4.2-spines_ticks_and_subplot_spacing.py} | 2 +- .../{4.1-goldstar.py => 5.1-goldstar.py} | 0 images/{exercise_2-1.png => exercise_4-1.png} | Bin images/{exercise_2-2.png => exercise_4-2.png} | Bin ..._scaling.py => 4.1-legends_and_scaling.py} | 0 ...> 4.2-spines_ticks_and_subplot_spacing.py} | 0 .../{4.1-goldstar.py => 5.1-goldstar.py} | 0 12 files changed, 97 insertions(+), 46 deletions(-) rename AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb => AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb (90%) rename AnatomyOfMatplotlib-Part4-Artists.ipynb => AnatomyOfMatplotlib-Part5-Artists.ipynb (99%) rename exercises/{2.1-legends_and_scaling.py => 4.1-legends_and_scaling.py} (85%) rename exercises/{2.2-spines_ticks_and_subplot_spacing.py => 4.2-spines_ticks_and_subplot_spacing.py} (78%) rename exercises/{4.1-goldstar.py => 5.1-goldstar.py} (100%) rename images/{exercise_2-1.png => exercise_4-1.png} (100%) rename images/{exercise_2-2.png => exercise_4-2.png} (100%) rename solutions/{2.1-legends_and_scaling.py => 4.1-legends_and_scaling.py} (100%) rename solutions/{2.2-spines_ticks_and_subplot_spacing.py => 4.2-spines_ticks_and_subplot_spacing.py} (100%) rename solutions/{4.1-goldstar.py => 5.1-goldstar.py} (100%) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index a9ab5be..e756d09 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -46,11 +46,11 @@ "metadata": {}, "source": [ "# How to speak \"MPL\"\n", - "In the previous part, you learned how matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many kinds of figures that matplotlib can generate. With all that knowledge, you should be off making great and wonderful figures. Why are you still here?\n", + "In the previous parts, you learned how matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many plotting methods that matplotlib has to draw on those axes. With all that knowledge, you should be off making great and wonderful figures. Why are you still here?\n", "\n", "\"We don't know how to control our plots and figures!\" says some random voice in the back of the room.\n", "\n", - "Of course! While the previous section may have taught you some of the structure and syntax of matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of matplotlib.\n", + "Of course! While the previous sections may have taught you some of the structure and syntax of matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of matplotlib.\n", "\n", "# Colors\n", "This is, perhaps, the most important piece of vocabulary in matplotlib. Given that matplotlib is a plotting library, colors are associated with everything that is plotted in your figures. Matplotlib supports a [very robust language](http://matplotlib.org/api/colors_api.html#module-matplotlib.colors) for specifying colors that should be familiar to a wide variety of users.\n", diff --git a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb similarity index 90% rename from AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb rename to AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index affc830..7972659 100644 --- a/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -38,7 +38,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -71,7 +72,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -100,7 +102,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -147,7 +150,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -172,7 +176,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "code", @@ -188,7 +193,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -214,7 +220,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -224,9 +231,7 @@ "\n", " ax.legend(loc=\"best\")\n", " \n", - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". \n", - "\n", - "On a side note, we're going to briefly introduce the `ax.bar` plotting method here. Unsurprisingly, it draws bars (vertical, by default)." + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". " ] }, { @@ -241,17 +246,18 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Exercise 2.1\n", + "# Exercise 4.1\n", "\n", "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", "\n", - "\n", + "\n", "\n", "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" ] @@ -274,7 +280,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -312,7 +319,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -340,7 +348,51 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another common " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(4, 4, sharex=True, sharey=True)\n", + "for ax in axes.flat:\n", + " ax.set(xlim=[-20, 20], ylim=[-1, 1])\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `ax.locator_params` to reduce the density" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, axes = plt.subplots(4, 4, sharex=True, sharey=True)\n", + "for ax in axes.flat:\n", + " ax.set(xlim=[-20, 20], ylim=[-1, 1])\n", + " ax.locator_params(nbins=4, prune='both')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 27 }, { "cell_type": "markdown", @@ -362,7 +414,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -398,7 +451,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -427,7 +481,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -452,7 +507,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -492,7 +548,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": null }, { "cell_type": "markdown", @@ -502,7 +559,7 @@ "\n", "This one is a bit trickier. Once again, try to reproduce the figure below:\n", "\n", - "\n", + "\n", "\n", "\n", "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", @@ -515,23 +572,15 @@ "cell_type": "code", "collapsed": false, "input": [ - "# %load exercises/2.2-spines_ticks_and_subplot_spacing.py\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "# Try to reproduce the figure shown in images/exercise_2.2.png\n", - "# This one is a bit trickier!\n", - "\n", - "# Here's the data...\n", - "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", - "animals, friendliness, popularity = zip(*data)\n" + "%load exercises/4.2-spines_ticks_and_subplot_spacing.py" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": 5 } ], "metadata": {} } ] -} +} \ No newline at end of file diff --git a/AnatomyOfMatplotlib-Part4-Artists.ipynb b/AnatomyOfMatplotlib-Part5-Artists.ipynb similarity index 99% rename from AnatomyOfMatplotlib-Part4-Artists.ipynb rename to AnatomyOfMatplotlib-Part5-Artists.ipynb index 4d61195..307dd1f 100644 --- a/AnatomyOfMatplotlib-Part4-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part5-Artists.ipynb @@ -283,7 +283,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Exercise 4.1\n", + "## Exercise 5.1\n", "Give yourselves 4 gold stars!\n", "\n", "Hint: [StarPolygonCollection](http://matplotlib.org/api/collections_api.html#matplotlib.collections.StarPolygonCollection)" @@ -293,7 +293,7 @@ "cell_type": "code", "collapsed": false, "input": [ - "%load exercises/4.1-goldstar.py" + "%load exercises/5.1-goldstar.py" ], "language": "python", "metadata": {}, diff --git a/README.md b/README.md index 7e4c822..74791c2 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,19 @@ for conferences and other opportunities for training. The tutorial can be viewed on [nbviewer](http://nbviewer.ipython.org): * [Part 0: Introduction To NumPy] * [Part 1: Overview of Matplotlib] -* [Part 2: Limits, Legends, and Layouts] +* [Part 2: Plotting Methods] * [Part 3: How To Speak MPL] -* [Part 4: Artists] -* [Part 5: mpl_toolkits] +* [Part 4: Limits, Legends, and Layouts] +* [Part 5: Artists] +* [Part 6: mpl_toolkits] Cheers! [Part 0: Introduction To NumPy]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb [Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb -[Part 2: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +[Part 2: Plotting Methods]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb [Part 3: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb -[Part 4: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Artists.ipynb -[Part 5: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb +[Part 4: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb +[Part 5: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Artists.ipynb +[Part 6: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb diff --git a/exercises/2.1-legends_and_scaling.py b/exercises/4.1-legends_and_scaling.py similarity index 85% rename from exercises/2.1-legends_and_scaling.py rename to exercises/4.1-legends_and_scaling.py index 8d200f9..a413272 100644 --- a/exercises/2.1-legends_and_scaling.py +++ b/exercises/4.1-legends_and_scaling.py @@ -1,7 +1,7 @@ import numpy as np import matplotlib.pyplot as plt -# Try to reproduce the figure shown in images/exercise_1-2.png +# Try to reproduce the figure shown in images/exercise_4-1.png # Here's the data and colors used. t = np.linspace(0, 2 * np.pi, 150) diff --git a/exercises/2.2-spines_ticks_and_subplot_spacing.py b/exercises/4.2-spines_ticks_and_subplot_spacing.py similarity index 78% rename from exercises/2.2-spines_ticks_and_subplot_spacing.py rename to exercises/4.2-spines_ticks_and_subplot_spacing.py index d8133aa..2f607c0 100644 --- a/exercises/2.2-spines_ticks_and_subplot_spacing.py +++ b/exercises/4.2-spines_ticks_and_subplot_spacing.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt import numpy as np -# Try to reproduce the figure shown in images/exercise_1.3.png +# Try to reproduce the figure shown in images/exercise_4.2.png # This one is a bit trickier! # Here's the data... diff --git a/exercises/4.1-goldstar.py b/exercises/5.1-goldstar.py similarity index 100% rename from exercises/4.1-goldstar.py rename to exercises/5.1-goldstar.py diff --git a/images/exercise_2-1.png b/images/exercise_4-1.png similarity index 100% rename from images/exercise_2-1.png rename to images/exercise_4-1.png diff --git a/images/exercise_2-2.png b/images/exercise_4-2.png similarity index 100% rename from images/exercise_2-2.png rename to images/exercise_4-2.png diff --git a/solutions/2.1-legends_and_scaling.py b/solutions/4.1-legends_and_scaling.py similarity index 100% rename from solutions/2.1-legends_and_scaling.py rename to solutions/4.1-legends_and_scaling.py diff --git a/solutions/2.2-spines_ticks_and_subplot_spacing.py b/solutions/4.2-spines_ticks_and_subplot_spacing.py similarity index 100% rename from solutions/2.2-spines_ticks_and_subplot_spacing.py rename to solutions/4.2-spines_ticks_and_subplot_spacing.py diff --git a/solutions/4.1-goldstar.py b/solutions/5.1-goldstar.py similarity index 100% rename from solutions/4.1-goldstar.py rename to solutions/5.1-goldstar.py From 5501a7a12830594e83ce8f08d9a6ddb952fdb0c5 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sat, 4 Jul 2015 15:19:41 -0500 Subject: [PATCH 12/61] New Part2: Overview of plotting methods --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 408 ++++++++++++++++++ examples/.example_utils.py.swo | Bin 0 -> 4096 bytes examples/bar_example.py | 45 ++ examples/contour_example.py | 26 ++ examples/example_utils.py | 23 + examples/fill_example.py | 77 ++++ examples/imshow_example.py | 45 ++ examples/pcolor_example.py | 42 ++ examples/plot_example.py | 27 ++ examples/scatter_example.py | 30 ++ examples/statistical_example.py | 77 ++++ examples/vector_example.py | 39 ++ exercises/2.1-bar_and_fill_between.py | 24 ++ .../2.2-vmin_vmax_imshow_and_colorbars.py | 15 + images/bar_example.png | Bin 0 -> 17795 bytes images/contour_example.png | Bin 0 -> 46642 bytes images/exercise_2.1-bar_and_fill_between.png | Bin 0 -> 37883 bytes ...ise_2.2-vmin_vmax_imshow_and_colorbars.png | Bin 0 -> 13142 bytes images/fill_example.png | Bin 0 -> 64477 bytes images/imshow_example.png | Bin 0 -> 103163 bytes images/pcolor_example.png | Bin 0 -> 55697 bytes images/plot_example.png | Bin 0 -> 37578 bytes images/scatter_example.png | Bin 0 -> 53488 bytes images/statistical_example.png | Bin 0 -> 29378 bytes images/vector_example.png | Bin 0 -> 118327 bytes solutions/2.1-bar_and_fill_between.py | 37 ++ .../2.2-vmin_vmax_imshow_and_colorbars.py | 20 + 27 files changed, 935 insertions(+) create mode 100644 AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb create mode 100644 examples/.example_utils.py.swo create mode 100644 examples/bar_example.py create mode 100644 examples/contour_example.py create mode 100644 examples/example_utils.py create mode 100644 examples/fill_example.py create mode 100644 examples/imshow_example.py create mode 100644 examples/pcolor_example.py create mode 100644 examples/plot_example.py create mode 100644 examples/scatter_example.py create mode 100644 examples/statistical_example.py create mode 100644 examples/vector_example.py create mode 100644 exercises/2.1-bar_and_fill_between.py create mode 100644 exercises/2.2-vmin_vmax_imshow_and_colorbars.py create mode 100644 images/bar_example.png create mode 100644 images/contour_example.png create mode 100644 images/exercise_2.1-bar_and_fill_between.png create mode 100644 images/exercise_2.2-vmin_vmax_imshow_and_colorbars.png create mode 100644 images/fill_example.png create mode 100644 images/imshow_example.png create mode 100644 images/pcolor_example.png create mode 100644 images/plot_example.png create mode 100644 images/scatter_example.png create mode 100644 images/statistical_example.png create mode 100644 images/vector_example.png create mode 100644 solutions/2.1-bar_and_fill_between.py create mode 100644 solutions/2.2-vmin_vmax_imshow_and_colorbars.py diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb new file mode 100644 index 0000000..f3462f4 --- /dev/null +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -0,0 +1,408 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + }, + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 2: Visual Overview of Plotting Functions\n", + "\n", + "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and matplotlib gallery is a great place to get examples of all of them. \n", + "\n", + "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down a bit, give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", + "\n", + "Here's a simplified visual overview of matplotlib's most commonly used plot types. Let's browse through these, and then we'll go over a few in more detail. Clicking on any of these images will take you to the code that generated them. We'll skip that for now, but feel browse through it later." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Basics: 1D series/points\n", + "### What we've mentioned so far\n", + "\n", + "\n", + "### Other common plot types\n", + "\n", + "\n", + "\n", + "## 2D Arrays and Images\n", + "\n", + "\n", + "\n", + "\n", + "## Vector Fields\n", + "\n", + "\n", + "## Data Distributions\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "heading", + "level": 1, + "metadata": {}, + "source": [ + "Detailed Examples (of a few of these)" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Let's get our standard imports out of the way\n", + "from __future__ import print_function\n", + "import numpy as np\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import matplotlib.pyplot as plt" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Input Data: 1D Series\n", + "\n", + "We've briefly mentioned `ax.plot(x, y)` and `ax.scatter(x, y)` to draw lines and points, respectively. We'll cover some of their options (markers, colors, linestyles, etc) in the next section.\n", + "\n", + "Rather than revisiting `plot` and `scatter`, let's move on to a couple of other common plot styles.\n", + "\n", + "### Bar Plots: `ax.bar(...)` and `ax.barh(...)`\n", + "\n", + "\n", + "Bar plots are one of the most common plot types. Matplotlib's `ax.bar(...)` method can also plot general rectangles, but the default is optimized for a simple sequence of x, y values, where the rectangles have a constant width. There's also `ax.barh(...)`, which makes a constant-height assumption instead of a constant-width assumption." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "np.random.seed(1)\n", + "x = np.arange(5)\n", + "y = np.random.randn(5)\n", + "\n", + "fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(0.4))\n", + "\n", + "vert_bars = axes[0].bar(x, y, color='lightblue', align='center')\n", + "horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')\n", + "\n", + "# I'll also introduce axhline & axvline to draw a line all the way across the axes\n", + "axes[0].axhline(0, color='gray', linewidth=2)\n", + "axes[1].axvline(0, color='gray', linewidth=2)\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 73 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort.\n", + "\n", + "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus `for bar in vert_bars`)." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "vert_bars = ax.bar(x, y, color='lightblue', align='center')\n", + "\n", + "# We could do this with two separate calls to `ax.bar` and numpy boolean indexing, as well.\n", + "for bar in vert_bars:\n", + " if bar.xy[1] < 0:\n", + " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Keep in mind that any plotting method in matplotlib returns the artists that are plotted. We'll use it again, particularly when we get to adding colorbars to images." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filled Regions: `ax.fill(x, y)`, `fill_between(...)`, etc\n", + "\n", + "\n", + "Of these functions, `ax.fill_between(...)` is probably the one you'll use the most often. In its most basic form, it fills between the given y-values and 0:" + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "np.random.seed(1)\n", + "y = np.random.randn(100).cumsum()\n", + "x = np.linspace(0, 10, 100)\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.fill_between(x, y, color='lightblue')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 32 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, it can also be used to fill between two curves. This is particularly useful when you want to show an envelope of some sort (e.g. error, confidence, amplitude, etc)." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "x = np.linspace(0, 10, 200)\n", + "y1 = 2 * x + 1\n", + "y2 = 3 * x + 1.2\n", + "y_mean = 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "# Plot the envelope with `fill_between`\n", + "ax.fill_between(x, y1, y2, color='yellow')\n", + "\n", + "# Plot the \"centerline\" with `plot`\n", + "ax.plot(x, y_mean, color='black')\n", + "\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 76 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 2.1:\n", + "\n", + "Now let's try combining `bar` and `fill_between` to make a nice prediction of what will happen as this class progresses:\n", + "\n", + "Can you reproduce the figure below?\n", + "" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load exercises/2.1-bar_and_fill_between.py" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Input Data: 2D Arrays or Images\n", + "\n", + "There are several options for plotting 2D datasets. `imshow`, `pcolor`, and `pcolormesh` have a lot of overlap, at first glance. (The example image below is meant to clarify that somewhat.)\n", + "\n", + "\n", + "\n", + "\n", + "In short, `imshow` can interpolate and display large arrays very quickly, while `pcolormesh` and `pcolor` are much slower, but can handle much flexible (i.e. more than just rectangular) arrangements of cells.\n", + "\n", + "We won't dwell too much on the differences and overlaps here. They have overlapping capabilities, but different default behavior because their primary use-cases are a bit different (there's also `matshow`, which is `imshow` with different defaults). \n", + "\n", + "Instead we'll focus on what they have in common.\n", + "\n", + "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Colorbars\n", + "\n", + "Next, let's add a colorbar to the figure to display what colors correspond to values of `data` we've plotted. " + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from matplotlib.cbook import get_sample_data\n", + "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "\n", + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='gist_earth')\n", + "fig.colorbar(im)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 97 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You may notice that `colorbar` is a `Figure` method and not an `Axes` method. That's because `colorbar` doesn't operate on the axes. Instead, it shrinks the current axes by a bit, adds a _new_ axes to the figure, and places the colorbar on that axes.\n", + "\n", + "The new axes that `fig.colorbar` creates is fairly limited in where it can be positioned. For example, it's always outside the axes it \"steals\" room from. Sometimes you may want to avoid \"stealing\" room from an axes or maybe even have the colorbar _inside_ another axes. In that case, you can manually create the axes for the colorbar and position it where you'd like:" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "fig, ax = plt.subplots()\n", + "cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])\n", + "\n", + "im = ax.imshow(data, cmap='gist_earth')\n", + "fig.colorbar(im, cax=cax, orientation='horizontal')\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 99 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One note: In the last module in this tutorial, we'll briefly cover `axes_grid`, which is very useful for aligning colorbars and/or other axes with images displayed with `imshow`. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " ### Shared parameters for `imshow`, `pcolormesh`, `contour`, `scatter`, etc\n", + " \n", + " As we mentioned earlier, any plotting method that creates a `ScalarMappable` will have some common kwargs. The ones you'll use the most frequently are:\n", + " \n", + " * `cmap` : The colormap (or name of the colormap) used to display the input. (We'll go over the different colormaps in the next section.)\n", + " * `vmin` : The minimum data value that will correspond to the \"bottom\" of the colormap (defaults to the minimum of your input data).\n", + " * `vmax` : The maximum data value that will correspond to the \"top\" of the colormap (defaults to the maximum of your input data).\n", + " * `norm` : A `Normalize` instance to control how the data values are mapped to the colormap. By default, this will be a linear scaling between `vmin` and `vmax`, but other norms are available (e.g. `LogNorm`, `PowerNorm`, etc).\n", + " \n", + "`vmin` and `vmax` are particularly useful. Quite often, you'll want the colors to be mapped to a set range of data values, which aren't the min/max of your input data. For example, you might want a symmetric ranges of values around 0.\n", + "\n", + "As an example of that, let's use a divergent colormap with the data we showed earlier. We'll also use `interpolation=\"nearest\"` to \"turn off\" interpolation of the cells in the input dataset:" + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "from matplotlib.cbook import get_sample_data\n", + "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "\n", + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='seismic', interpolation='nearest')\n", + "fig.colorbar(im)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 107 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, we'd really like the white in the colormap to correspond to 0. A quick way to do this is to make the `vmin` equal to the negative of the `vmax`. " + ] + }, + { + "cell_type": "code", + "collapsed": true, + "input": [ + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='seismic', interpolation='nearest',\n", + " vmin=-2, vmax=2)\n", + "fig.colorbar(im)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 108 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`vmin` and `vmax` are also very useful when we want multiple plots to share one colorbar, as our next exercise will do.\n", + "\n", + "## Exercise 2.2:\n", + "\n", + "Can you reproduce the figure below?\n", + "" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load exercises/2.2-vmin_vmax_imshow_and_colorbars.py" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 101 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/.example_utils.py.swo b/examples/.example_utils.py.swo new file mode 100644 index 0000000000000000000000000000000000000000..60e318fa2fe75abbd00f00fbf91b2f3690cf3e68 GIT binary patch literal 4096 zcmYc?2=nw+FxN9-00IF92Afq=LIoOLF*zzTFl6PYr51t234rAMqP(P{)Wj45>hx0* zOA_^cE1mOGQuPz_5=)Hq9f4$iZl!;kZ(>P7PJT&FW|Dq>Nk(dseriQxZb43Jd}&E$ zPO)A=B>}TXrAI?xGz18R055~Fk)Z)dm9mneg0N61Aq}JQqaiRF0;3@?8UmvsFd71* QAut*OqaiRF0>dZ-02qWMwg3PC literal 0 HcmV?d00001 diff --git a/examples/bar_example.py b/examples/bar_example.py new file mode 100644 index 0000000..24688f7 --- /dev/null +++ b/examples/bar_example.py @@ -0,0 +1,45 @@ +import numpy as np +import matplotlib.pyplot as plt + +import example_utils + +def main(): + fig, axes = example_utils.setup_axes() + + basic_bar(axes[0]) + tornado(axes[1]) + general(axes[2]) + + example_utils.title(fig, '"ax.bar(...)": Plot rectangles') + fig.savefig('bar_example.png', facecolor='none') + plt.show() + +def basic_bar(ax): + y = [1, 3, 4, 5.5, 3, 2] + err = [0.2, 1, 2.5, 1, 1, 0.5] + x = np.arange(len(y)) + ax.bar(x, y, yerr=err, color='lightblue', ecolor='black') + ax.margins(0.05) + ax.set_ylim(bottom=0) + example_utils.label(ax, 'bar(x, y, yerr=e)') + +def tornado(ax): + y = np.arange(8) + x1 = y + np.random.random(8) + 1 + x2 = y + 3 * np.random.random(8) + 1 + ax.barh(y, x1, color='lightblue') + ax.barh(y, -x2, color='salmon') + ax.margins(0.15) + example_utils.label(ax, 'barh(x, y)') + +def general(ax): + num = 10 + left = np.random.randint(0, 10, num) + bottom = np.random.randint(0, 10, num) + width = np.random.random(num) + 0.5 + height = np.random.random(num) + 0.5 + ax.bar(left, height, width, bottom, color='salmon') + ax.margins(0.15) + example_utils.label(ax, 'bar(l, h, w, b)') + +main() diff --git a/examples/contour_example.py b/examples/contour_example.py new file mode 100644 index 0000000..c443407 --- /dev/null +++ b/examples/contour_example.py @@ -0,0 +1,26 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.cbook import get_sample_data + +import example_utils + +z = np.load(get_sample_data('axes_grid/bivariate_normal.npy')) + +fig, axes = example_utils.setup_axes() + +axes[0].contour(z, cmap='gist_earth') +example_utils.label(axes[0], 'contour') + +axes[1].contourf(z, cmap='gist_earth') +example_utils.label(axes[1], 'contourf') + +axes[2].contourf(z, cmap='gist_earth') +cont = axes[2].contour(z, colors='black') +axes[2].clabel(cont, fontsize=6) +example_utils.label(axes[2], 'contourf + contour\n + clabel') + +example_utils.title(fig, '"contour, contourf, clabel": Contour/label 2D data', + y=0.96) +fig.savefig('contour_example.png', facecolor='none') + +plt.show() diff --git a/examples/example_utils.py b/examples/example_utils.py new file mode 100644 index 0000000..a6931cd --- /dev/null +++ b/examples/example_utils.py @@ -0,0 +1,23 @@ +""" +Just a few functions shared between all the examples. Ensures example plots are +all the same size, etc. +""" +import matplotlib.pyplot as plt + +def setup_axes(): + fig, axes = plt.subplots(ncols=3, figsize=(6.5,3)) + for ax in fig.axes: + ax.set(xticks=[], yticks=[]) + fig.subplots_adjust(wspace=0, left=0, right=0.93) + return fig, axes + +def title(fig, text, y=0.9): + fig.suptitle(text, size=14, y=y, weight='semibold', x=0.98, ha='right', + bbox=dict(boxstyle='round', fc='floralwhite', ec='#8B7E66', + lw=2)) + +def label(ax, text, y=0): + ax.annotate(text, xy=(0.5, 0.00), xycoords='axes fraction', ha='center', + style='italic', + bbox=dict(boxstyle='round', facecolor='floralwhite', + ec='#8B7E66')) diff --git a/examples/fill_example.py b/examples/fill_example.py new file mode 100644 index 0000000..207b650 --- /dev/null +++ b/examples/fill_example.py @@ -0,0 +1,77 @@ +""" +Illustrate different ways of using the various fill functions. +""" +import numpy as np +import matplotlib.pyplot as plt + +import example_utils + +def main(): + fig, axes = example_utils.setup_axes() + + fill_example(axes[0]) + fill_between_example(axes[1]) + stackplot_example(axes[2]) + + example_utils.title(fig, 'fill/fill_between/stackplot: Filled polygons', + y=0.95) + fig.savefig('fill_example.png', facecolor='none') + plt.show() + +def fill_example(ax): + # Use fill when you want a simple filled polygon between vertices + x, y = fill_data() + ax.fill(x, y, color='lightblue') + ax.margins(0.1) + example_utils.label(ax, 'fill') + +def fill_between_example(ax): + # Fill between fills between two curves or a curve and a constant value + # It can be used in several ways. We'll illustrate a few below. + x, y1, y2 = sin_data() + + # The most basic (and common) use of fill_between + err = np.random.rand(x.size)**2 + 0.1 + y = 0.7 * x + 2 + ax.fill_between(x, y + err, y - err, color='orange') + + # Filling between two curves with different colors when they cross in + # different directions + ax.fill_between(x, y1, y2, where=y1>y2, color='lightblue') + ax.fill_between(x, y1, y2, where=y10, color='red', alpha=0.5) + ax.fill_betweenx(x, -y1, where=y1<0, color='blue', alpha=0.5) + + ax.margins(0.15) + example_utils.label(ax, 'fill_between/x') + +def stackplot_example(ax): + # Stackplot is equivalent to a series of ax.fill_between calls + x, y = stackplot_data() + ax.stackplot(x, y.cumsum(axis=0), alpha=0.5) + example_utils.label(ax, 'stackplot') + +#-- Data generation ---------------------- + +def stackplot_data(): + x = np.linspace(0, 10, 100) + y = np.random.normal(0, 1, (5, 100)) + y = y.cumsum(axis=1) + y -= y.min(axis=0, keepdims=True) + return x, y + +def sin_data(): + x = np.linspace(0, 10, 100) + y = np.sin(x) + y2 = np.cos(x) + return x, y, y2 + +def fill_data(): + t = np.linspace(0, 2*np.pi, 100) + r = np.random.normal(0, 1, 100).cumsum() + r -= r.min() + return r * np.cos(t), r * np.sin(t) + +main() diff --git a/examples/imshow_example.py b/examples/imshow_example.py new file mode 100644 index 0000000..87f5561 --- /dev/null +++ b/examples/imshow_example.py @@ -0,0 +1,45 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.cbook import get_sample_data +from mpl_toolkits import axes_grid1 + +import example_utils + +def main(): + fig, axes = setup_axes() + plot(axes, *load_data()) + example_utils.title(fig, '"ax.imshow(data, ...)": Colormapped or RGB arrays') + fig.savefig('imshow_example.png', facecolor='none') + plt.show() + +def plot(axes, img_data, scalar_data, ny): + # Note: I'm defining the extent so I can cheat a bit when using ImageGrid + # to make all of the axes the same height... + + # Default: Linear interpolation + axes[0].imshow(scalar_data, cmap='gist_earth', extent=[0, ny, ny, 0]) + + # Use nearest interpolation instead. + axes[1].imshow(scalar_data, cmap='gist_earth', interpolation='nearest', + extent=[0, ny, ny, 0]) + + # Show RGB/RGBA data instead of colormapping a scalar. + axes[2].imshow(img_data) + +def load_data(): + img_data = plt.imread(get_sample_data('grace_hopper.png')) + ny, nx, nbands = img_data.shape + scalar_data = np.load(get_sample_data('axes_grid/bivariate_normal.npy')) + return img_data, scalar_data, ny + +def setup_axes(): + # We'll set up the axes a bit differently here so that they'll all be the + # same height even though the aspect will be set and adjustable is "box". + fig = plt.figure(figsize=(6,3)) + axes = axes_grid1.ImageGrid(fig, [0, 0, .93, 1], (1, 3), axes_pad=0) + + for ax in axes: + ax.set(xticks=[], yticks=[]) + return fig, axes + +main() diff --git a/examples/pcolor_example.py b/examples/pcolor_example.py new file mode 100644 index 0000000..85468b2 --- /dev/null +++ b/examples/pcolor_example.py @@ -0,0 +1,42 @@ +""" +Shows the basics of pcolor/pcolormesh. +One note: Use imshow if your data is on a rectangular grid, as it's much +faster. This example shows a case that imshow can't handle. +""" +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.cbook import get_sample_data + +import example_utils + +# Set up our data... +z = np.load(get_sample_data('axes_grid/bivariate_normal.npy')) +ny, nx = z.shape +y, x = np.mgrid[:ny, :nx] +y = (y - y.mean()) * (x + 10)**2 + +mask = (z > -0.1) & (z < 0.1) +z2 = np.ma.masked_where(mask, z) + +fig, axes = example_utils.setup_axes() + +# Either pcolor or pcolormesh would produce the same result here. +# pcolormesh is faster, however. +axes[0].pcolor(x, y, z, cmap='gist_earth') +example_utils.label(axes[0], 'either') + +# The difference between the two will become clear as we turn on edges: + +# pcolor will completely avoid drawing masked cells... +axes[1].pcolor(x, y, z2, cmap='gist_earth', edgecolor='black') +example_utils.label(axes[1], 'pcolor(x,y,z)') + +# While pcolormesh will draw them as empty (but still present) cells. +axes[2].pcolormesh(x, y, z2, cmap='gist_earth', edgecolor='black', lw=0.5, + antialiased=True) +example_utils.label(axes[2], 'pcolormesh(x,y,z)') + +example_utils.title(fig, 'pcolor/pcolormesh: Colormapped 2D arrays') +fig.savefig('pcolor_example.png', facecolor='none') + +plt.show() diff --git a/examples/plot_example.py b/examples/plot_example.py new file mode 100644 index 0000000..3a56ef3 --- /dev/null +++ b/examples/plot_example.py @@ -0,0 +1,27 @@ +import numpy as np +import matplotlib.pyplot as plt + +import example_utils + +x = np.linspace(0, 10, 100) + +fig, axes = example_utils.setup_axes() +for ax in axes: + ax.margins(y=0.10) + +# Default plotting, colors will be determined by the axes' color_cycle +for i in range(1, 6): + axes[0].plot(x, i * x) + +# Demonstrating different linestyles +for i, ls in enumerate(['-', '--', ':', '-.']): + axes[1].plot(x, np.cos(x) + i, linestyle=ls) + +# Using linestyles and markers +for i, (ls, mk) in enumerate(zip(['', '-', ':'], ['o', '^', 's'])): + axes[2].plot(x, np.cos(x) + i * x, linestyle=ls, marker=mk, markevery=10) + +example_utils.title(fig, '"ax.plot(x, y, ...)": Lines and/or markers', y=0.95) +fig.savefig('plot_example.png', facecolor='none') + +plt.show() diff --git a/examples/scatter_example.py b/examples/scatter_example.py new file mode 100644 index 0000000..33a4848 --- /dev/null +++ b/examples/scatter_example.py @@ -0,0 +1,30 @@ +""" +Illustrates the basics of using "scatter". +""" +import numpy as np +import matplotlib.pyplot as plt + +import example_utils + +# Generate some random data... +np.random.seed(1874) +x, y, z = np.random.normal(0, 1, (3, 100)) +t = np.arctan2(y, x) +size = 50 * np.cos(2 * t)**2 + 10 + +fig, axes = example_utils.setup_axes() + +axes[0].scatter(x, y, marker='o', facecolor='white', s=80) +example_utils.label(axes[0], 'scatter(x, y)') + +axes[1].scatter(x, y, s=size, marker='s', color='darkblue') +example_utils.label(axes[1], 'scatter(x, y, s)') + +axes[2].scatter(x, y, c=z, s=size, cmap='gist_ncar') +example_utils.label(axes[2], 'scatter(x, y, s, c)') + +example_utils.title(fig,'"ax.scatter(...)": Colored/scaled markers', + y=0.95) +fig.savefig('scatter_example.png', facecolor='none') + +plt.show() diff --git a/examples/statistical_example.py b/examples/statistical_example.py new file mode 100644 index 0000000..f3e46a5 --- /dev/null +++ b/examples/statistical_example.py @@ -0,0 +1,77 @@ +""" +Matplotlib has a handful of specalized statistical plotting methods. + +For many statistical plots, you may find that a specalized statistical plotting +package such as Seaborn (which uses matplotlib behind-the-scenes) is a better +fit to your needs. +""" +import numpy as np +import matplotlib.pyplot as plt + +import example_utils + +def main(): + colors = ['cyan', 'red', 'blue', 'green', 'purple'] + dists = generate_data() + + fig, axes = example_utils.setup_axes() + hist(axes[0], dists, colors) + boxplot(axes[1], dists, colors) + violinplot(axes[2], dists, colors) + + example_utils.title(fig, 'hist/boxplot/violinplot: Stastical plotting', + y=0.9) + fig.savefig('statistical_example.png', facecolor='none') + + plt.show() + +def generate_data(): + means = [0, -1, 2.5, 4.3, -3.6] + sigmas = [1.2, 5, 3, 1.5, 2] + # Each distribution has a different number of samples. + nums = [150, 1000, 100, 200, 500] + + dists = [np.random.normal(*args) for args in zip(means, sigmas, nums)] + return dists + +def hist(ax, dists, colors): + # We could call "ax.hist(dists, ...)" and skip the loop, but we'll plot + # each distribution separately so they'll overlap and turn on transparency + ax.set_color_cycle(colors) + for dist in dists: + ax.hist(dist, bins=20, normed=True, edgecolor='none', alpha=0.5) + + ax.margins(y=0.05) + ax.set_ylim(bottom=0) + + example_utils.label(ax, 'ax.hist(dists)') + +def boxplot(ax, dists, colors): + result = ax.boxplot(dists, patch_artist=True, notch=True, vert=False) + + for box, color in zip(result['boxes'], colors): + box.set(facecolor=color, alpha=0.5) + for item in ['whiskers', 'caps', 'medians']: + plt.setp(result[item], color='gray', linewidth=1.5) + plt.setp(result['fliers'], markeredgecolor='gray', markeredgewidth=1.5) + plt.setp(result['medians'], color='black') + + ax.margins(0.05) + ax.set(yticks=[], ylim=[0, 6]) + + example_utils.label(ax, 'ax.boxplot(dists)') + +def violinplot(ax, dists, colors): + result = ax.violinplot(dists, vert=False, showmedians=True) + for body, color in zip(result['bodies'], colors): + body.set(facecolor=color, alpha=0.5) + for item in ['cbars', 'cmaxes', 'cmins', 'cmedians']: + plt.setp(result[item], edgecolor='gray', linewidth=1.5) + plt.setp(result['cmedians'], edgecolor='black') + + ax.margins(0.05) + ax.set(ylim=[0, 6]) + + example_utils.label(ax, 'ax.violinplot(dists)') + +main() diff --git a/examples/vector_example.py b/examples/vector_example.py new file mode 100644 index 0000000..05c3d53 --- /dev/null +++ b/examples/vector_example.py @@ -0,0 +1,39 @@ +import matplotlib.pyplot as plt +import numpy as np + +import example_utils + +# Generate data +n = 256 +x = np.linspace(-3, 3, n) +y = np.linspace(-3, 3, n) +xi, yi = np.meshgrid(x, y) +z = (1 - xi / 2 + xi**5 + yi**3) * np.exp(-xi**2 - yi**2) +dy, dx = np.gradient(z) +mag = np.hypot(dx, dy) + +fig, axes = example_utils.setup_axes() + +# Use ax.arrow to plot a single arrow on the axes. +axes[0].arrow(0, 0, -0.5, 0.5, width=0.005, color='black') +axes[0].axis([-1, 1, -1, 1]) +example_utils.label(axes[0], 'arrow(x, y, dx, dy)') + +# Plot a regularly-sampled vector field with ax.quiver +ds = np.s_[::16, ::16] # Downsample our array a bit... +axes[1].quiver(xi[ds], yi[ds], dx[ds], dy[ds], z[ds], cmap='gist_earth', + width=0.01, scale=0.25, pivot='middle') +axes[1].axis('tight') +example_utils.label(axes[1], 'quiver(x, y, dx, dy)') + +# Use ax.streamplot to show flowlines through our vector field +# We'll get fancy and vary their width and color +lw = 2 * (mag - mag.min()) / mag.ptp() + 0.2 +axes[2].streamplot(xi, yi, dx, dy, color=z, density=1.5, linewidth=lw, + cmap='gist_earth') +example_utils.label(axes[2], 'streamplot(x, y, dx, dy)') + +example_utils.title(fig, '"arrow/quiver/streamplot": Vector fields', y=0.96) +fig.savefig('vector_example.png', facecolor='none') + +plt.show() diff --git a/exercises/2.1-bar_and_fill_between.py b/exercises/2.1-bar_and_fill_between.py new file mode 100644 index 0000000..5ca04cd --- /dev/null +++ b/exercises/2.1-bar_and_fill_between.py @@ -0,0 +1,24 @@ +import numpy as np +import matplotlib.pyplot as plt +np.random.seed(1) + +# Generate data... +y_raw = np.random.randn(1000).cumsum() + 15 +x_raw = np.linspace(0, 24, y_raw.size) + +# Get averages of every 100 samples... +x_pos = x_raw.reshape(-1, 100).min(axis=1) +y_avg = y_raw.reshape(-1, 100).mean(axis=1) +y_err = y_raw.reshape(-1, 100).ptp(axis=1) + +bar_width = x_pos[1] - x_pos[0] + +# Make a made up future prediction with a fake confidence +x_pred = np.linspace(0, 30) +y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred +y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred + +# Just so you don't have to guess at the colors... +barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue' + +# Now you're on your own! diff --git a/exercises/2.2-vmin_vmax_imshow_and_colorbars.py b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py new file mode 100644 index 0000000..4922fb3 --- /dev/null +++ b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py @@ -0,0 +1,15 @@ +import numpy as np +import matplotlib.pyplot as plt +np.random.seed(1) + +# Generate random data with different ranges... +data1 = np.random.random((10, 10)) +data2 = 2 * np.random.random((10, 10)) +data3 = 3 * np.random.random((10, 10)) + +# Set up our figure and axes... +fig, axes = plt.subplots(ncols=3, figsize=plt.figaspect(0.5)) +fig.tight_layout() # Make the subplots fill up the figure a bit more... +cax = fig.add_axes([0.25, 0.1, 0.55, 0.03]) # Add an axes for the colorbar + +# Now you're on your own! diff --git a/images/bar_example.png b/images/bar_example.png new file mode 100644 index 0000000000000000000000000000000000000000..8aebe55c3cd29179a6dff596aff843a0de8dfaaa GIT binary patch literal 17795 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

uZ!cOw$#()FI{CKLtb>j+ zD}D)~MF~7=-)s{xhj^T(lxHW7-Qw<-C4eZ25m>l)!im%l6-Ho0`huQoY~8{g)f{#& zw6LgBMmI3k-5fUV%N-F9Bi`Ppe5Xtraa;*IFFOO$nQI^UkKwQaop}~L)+zM(71a&- zURp8Mg$E)HNr1xbeu^A5SqT&}hLzx%p`W0{i7g=!nXrOE4WO2aQJ$cxsHhH;u!k6F zuOODOPo?B&p-%h10Pksa^XOL4R741otuF^w{oQzI>xzy)#15y1Jy1bU4;~%|&eW%? zBIK^dsJ=6&VL9`2yaz_n)*Q3in+gkkhB)wRH!%yu8l#pKCw&VJz5NO@yD`qt9kTZx zSiqa*`nS60d-f+4@7k1dv_Y!qszQIit*9(gh=`%Dt^rqcuP?lX&c`$4DgmVx7k|rA zMUD;fYF|vgf_D|Qn?(x-QE;iodDo*{u(xN9TUJe#6o3Z^?jV?pphL#+i`Kq{41Eh3 z`xbIE_eqNBfo_dt>b#gXEnSF8jq=4x6ta-X@Qk>}md9eu-MQG8(uG7L5!)Z(D#OMi zQ0z4rxKa-TT1%MBs-`y`4hib?yukl(zp%p)FLW}wb*}GI$*#`MCW6g!=p1S8i+yfo z#Y|kB$Osnm^&2&B94n)?AckfUBNBhq<$~>=Yw%ExxsEV^xxutO@jQZ9DNM+zzuzo&=KR|W4m z*B*WW6a#pQQWAK4tZ+eWV0V2R*;74<3$Mb`E_f|qbP0R3n8~Ey2J$?>kl!kXeED`9f?-El1%4i zU!^#&mET#_@I@{z#IE&+{aFz!<@2q@daX@+sYQG=W_mQfup8v%bj9r}X$UD|hJtV6 zq2XZc>_6H=%ZX9udx>JM8cP%#eflNvXg-y6z2kc7KBaL*%w-If?$ok(>V9bl(WWY{ z?n$GyTXv82x}xHobQwZ;H?Z^>7MmI128e7Uw!$WUIn9>a+S(qiMhIKgcm1d5K`h|1iO+O9cOtJRhuBFDQn@Xuc+cIp;C`jb-86#OB2bk=>=Nij zIekc}9;oNodOmLIROCgXG9s>D6Iroet9Wr?XK3)TU1mp5#_x(Uu1wf^ZgDJE=G4+V}s+m}otBKHFcH!{Gztvm4EQU>Sp~K$^eW?l9Jx;1-LA;As;4F#0 zrKEb-*yiUt0@BS#n_s85HLX=IoUNqx&}~|!)jZOwb%S%~8QppW|B>jTmZ>tfj0yAe zRYaI1f)t)hOXg`POXR>Tynw{ePZ8D#Vys@S&L|csqObR?4@$SzOqf#~4Te^nPrSTH zT}CeyD{XDGz(=?Jfn6N#HJHci?FLYP#4)cD{!ie3kPDhWP+yt9#L*@ z$xCY!ook3Ck}oS>mi2NB{Q=jaJ$}eVnZ|{7yO!Y(Rfh-XVy>!g`|&xU%UP19Xftj$ zyeoF>?FLH_@*1ev(^oc^`;1vGR-^H;Ej|A1;{r1tJ9hRF+{NU&1$pi zE}@TSENL(uO4bh`@rhyZ>Udn&{R~f$EKF_A+MK<8ZkNF@A+%$&u&m-893*8VPOP~3 zkr@eI9`2qrr6vJo>PA!Y4RP-Y=qa^}-G#v_bag@^Vpk?DxR%{R6jpd1@_|<|)N9Pq z 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 LPOMx+&-cFps$Juq literal 0 HcmV?d00001 diff --git a/images/exercise_2.1-bar_and_fill_between.png b/images/exercise_2.1-bar_and_fill_between.png new file mode 100644 index 0000000000000000000000000000000000000000..37ef247a81b4793c64a485c246c53b64e740f0e0 GIT binary patch literal 37883 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 T+FLmM2gA-;oF$yOa_7GRGuw)! literal 0 HcmV?d00001 diff --git a/images/fill_example.png b/images/fill_example.png new file mode 100644 index 0000000000000000000000000000000000000000..1d60c0cb690e0929854e313252a821473dfa450b GIT binary patch literal 64477 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

krE*?-fB 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 R48s6FQeyI=6(WW|{|~%{NG<>X literal 0 HcmV?d00001 diff --git a/images/imshow_example.png b/images/imshow_example.png new file mode 100644 index 0000000000000000000000000000000000000000..6306f36d673351706e2fa40fa141be50a5eea441 GIT binary patch literal 103163 zcmdRV1y>xw)-3^oy9Ot?LttSxESA+exej$Gw) z+16F(RcCcoy`L94n}d@uf`#)HX|NCmRz$Qnk^h|m7aq#l zO7|%Lw}r+i%?FwPbPP6PEd2klvGGfKvRuY@VeLGAv}d+s)&C7VaH%K3k-7DCaejoM zDCxL?J&`I)@dF_uA+&Y3JpH%-4Ze8{ItSv6`#xcHpEDJlji3Rvnu2j7STf31E%@&o zUhdaJeDXP?Z1!DL`NM-*LnX(R|0zv4=KFk!4eW~ZK@eDrw4bL;{eN?4v(w5XlgePU zU489<$_xR+Q9PoR%Aw&~sMkVAN4ISkN-T5Cak^;e{BL=HCmg37{lw;b?(byKuKScn zj>q;x27gaGRWAtE)c2(I-B7yazYA46{Y_bG@Xa`8gx^W=+v7sGA3L}go~MSuq(PmC z*HssH{=Y*~d^t=?N}108Mzd-y0JO-)-_umbufXVm{$VkT@>!*Y@xRaYCDLjJr#7#$ zcdo_11xH>MRiJ%B_Sij@y`!s5q z`nNIob?t>*w5|K>cOJKM`y%}8wqCP7am@Nt9U0HODN0aM%{i}p zR&+ngjJNY_%l~Zi9a2^#2rUeG4$48qM%~ei`;0kB=f7?M&C*2y&zKc_{!ilAF<~Pc#x1Mg}Af1pr(Rc zO~{JJ`FvFGnP_ahc|%H7bzZC7PK3BSLbX1Bvwf{Lq5W{$L0a22|2;;ebt@P5deu%w zi*NF3H(7`M&_g_CBNs*Y8I93Wrl>@=R`e&TknFcDjh3I;6XK({}ZCDWMw$SKmYI;W_G?!i(;{ z2CktvNB>)M6Ac}m(TP&1eV<%&y~VVVZTk-K1kX+q)ip;4iq&(Q*Y&t8iolD8*?7(@ zjm>ti7=unrn7W>Kpy_A|+jcMFf^_yVPfeZhG?ucorKM&1-8@o>H+vu~u}_pjX@^{? zJQ2Ze=T6l#*K>z&yet(#@$20xhR?GNJc)eH@1kQ{lgpRZ2Jozf=})EgaM6He$30fh z2_0g$gD*Mme}wKftYRDQ-m&EBH$GNG2iH&XIeT+%GY?dEGi~jvZ$ji16{YcupEl)a zHzagFi9E!8f&C5)1nT>c?mZ{HL8Xk@WX|Z6?!C!CMDj|RkM@n}+^{Y!GxJU}WqRmv z>THRf6QrG-9P+@xz;QbsV3u~cAT&}MS4>gx93fV3H#3fo@N+!3O}pOAs30P7-v^yJ z*LvC2byHH`kF0FBUVP=@?%CyxA8I}$EgAA6AR?Ak==^FpWJ}}QHMU;0tv!oxKkXgX z4aI~`urr_d;~z>aA{~DItm8DYdo0&;HMK5sd*Ju09Rpe@&F2w&F$gTSoBeRs zPNG(xJ+UfX;^kpylF;o!DXH;LTFIUI zZt3}J*Q<+KVVgkK3;HvO8y8W#O^E7LMsHn=)A4fb^fO^UC1!PANlD4F3zNRy$Vh3n zNNAOJ7*OKQyNvJSrlnM)jF z$HQ?NO(QE|9Y$?j8<)&|o(|0?`1T<~kTwG+_&G}R8ld8PIh;(-L(F6 zCGJzr&YjcA(g#0o$L^iNvfP(5$KAVE87jTnBgk7q-nTiv?W6AZ^qw2$lJC2|%-b*5 z6Mt9AnfL3<&aal|T$jv_8Lxjobxrc$^ACru-@~7ah_#=cusYbCwe5fK+SK29zr10a ztOq8=VzCt$Fb%&~oJ@h0Y`yd4WN(dH`7Yr07M!{a-jByhaV|P8dG&K<avq360;Xd;`5t+Hfen&5S3s2ohTH8-d18&o*$3%O(lgvbLH=C zmcXl34F4Mz$6-Bt?H?E5o+hhAE_>bTdaEV`9|Ru0BlNkfCkD)*BsHH7ril!3ST1H< z4W#PZ&wZhu0%lD#az$BVA>L>8q`!6lJ@X?X4#)4@Y}5uxydgqY)=e+A#8(uqs0f$! ze+zVX(rTsh{v)28>v`;3t4Xim#}|0Xh8J;(I0_q=s?&?-!v95f^k<+63crm(wKuduVxZfoc?A#;+|x>vsN%`fr3y>xSklu7`4fS-ecRyE$oR93u8b*qlR*ZUr@DW(vNm#}M-703v9F-LMB( z-j8Z_gsN&)Tj#hs{lL=XYft)MCA%Wzs*+2bPl})l5-(_f`<8e=)_Q&ROwf1=%rDBU z#CbhyTQ7-&VRsi(Ij{x(CV~}y8XD}aq3=n z>=F6yI>DJ6`WP#4HFe>ZyU}UVY^$5W;5eDhx%-+c);$)VdB0vU;DPe8+BGA?h&pQB zKCWiCvWv-#5KCgely>2^+GNwalPl-V$yWu|+IU}cAC@;Dl-^ z_q6u!p@!|uT^9iz4UxZ{kZpl4OEU(w)Jai}nYt^69FfzuUcit-NrRVdaBFr|go6&13D#me! z%DsCzL^_)dNxN7*FpPFiN)Y>e*INnSi5;hZzS%*om`<~Go2=VeQBeP#J}Vfn+va5H zpr<|WGND=8w6sqaALe!3xPSfouRyBD?V3uH)gs3^kHGs4c{zVf*V|Pg&M~g=u<;Nv z`hxe-$WZ8z>r$6*;UhV5Z0Ml^ze{)0M24Vi{VFfBAWePU1R#ebONuyJb}~WhZO)W6 z>VJuz!Dmra*Dhys@#uY_GmSFlzkf@^2l(asH zS*mpQ#C2;stz?9jnkdwUH(w3>cqM(-buTm_crHs?i2U1fjpKMWGZ1A7w~yt)^sRdP z$=h)({h6p%BPvmWFUA7YTiLvc+2yUzeh3r8{S?M>zAZsAIi^|P_X>21?aI8}i*DX9 zJsQe|ytt`n{tkGz@7vvPC?-hL^|!uUrgZN=n4b+}YIhSTWzzXQnY^EFe$P7CY&4?+ z0sw)h`dpgpjaOo`=$k42zWYRAXMB|u+xKeIyd2Rfem=3dIrevXU*GZ$9~c6Mw%v%! zYjeJHxf&KWc7h~D8tX0QhWEJ$1eKl-`%VmZ0t(TJ$_MYPf<2*0>>xK{p;<&$*1eyf8k)xTKK;S zK1MBWx)Jz|d=uEash`+CmnnH)?NaXmxcY zU@GvJFTX!bw3F0~US#93T976RK5=z~3cfwC?Y}z;yHyHiJi(Xd*z5f;CFU}K6^|wq zvaun$=YN13O<^?Ot5_yrndEc2tg^0d-v?Ndf&2QdqK1ZsX>K5bgqj6$ABBl5 zIVBSR6Q5}da*0};5xvli4E!_Ct$0N%`XGZb|L6VPaU$H^UDFqvckhKCRUtZ8x%91n z1=Trtn1Z%m94D;{L}#&Zuvn}Q44!PJQ?Ke+3#MsCQ`N7o%I#RJ?g$Bow*O7->LCfI z=3DzYTe&FgNjIvtP3y;NpY&YLYBR7cAvi-Eust<>cdIj1HrmqC5r7uRK3l>tcfH^% zOP_VV8_E;JD@POnSQC%jW0PJtUrI zO~X$!29<|uohP`DzY!IFui8E4cHA9}{srRoy-u5`B~yz+RtX||$uvC`6|A?jnc~C> zEgrk*BfGQ8qHS%5tQFD?R!7pgTPR*Cuqci2JhazJI`nQJbZ5tefJ!eLw4Oh z)QR(v8D8Jegokl++(EMKZ!7dy8~Am0O|t^8q}5{|_p`B6E@zY7?V_-;cUf!HB@b0b zQgeOD`1F*O8H&GA?!Q0SY-rb@32)dR-~RJh-QIUdvlCpW{WUQp`(DY5RUs=MfIb_Y z9($c1xWkJLR~~i-_ZkJ&$>Z1eyslflPVznf$}Q?MR<|ArI?NZ0q`|x+T`@3VJTw8VWTUS+c=vn)YYv(uzI}=DQF{7li3Fi1O zX6$JDyIdz8MQoo5a@!BcIOPd z-}NLvTlJcHuJ@9OFD+oFU-q|>9uxBGW9v?P~=^s+1vh${N<+4|f zSaDe1>t0W^J`bb2<438C8_{OdwZ3}Y2J7ms2NgZ<_x8PRL#;DsYp&d?i3P>L`8hQWjWpNp zdhIGR)1H{s{o?VAOK{>ozUQ2wVNS?>MeAu1=3wO|7wQT2RU)n3=<|7(s-EvD_J5`k zq@7W+8|@!5SxivXUbp;cthz(f{(9BNc~v%amdd%wLYpwNSnCD-k;ySIbfb(NCO z=c$Z3Xb5%5HzQf+2Ku)>ier)bMQ)OiAIfqQlT+$gYZ~^w6g?ApW(Sw;{Omf%t z;Px|jz&e&VytEXizfAw;%-9wQ4eCy1(#~0|y1Mcr_yN58o=@|P_?F-6{Yd>Z&!3tv za#fWggD!tB3Wut%DqVl|4!)YI>O6O6rhPxeroaf_n_LwYTth4SL4)ectlQQRoW)qr z!LD8YXLhn{xW07kw0Zf}dI@#&{t@s_pBkU5#&hf@vd*tgdSbY&WpjjHrzMDgt1jx0 zoGHBiWougbsb6?a=-mHV&LeR5%5y&ioBK1}+ptdB?pEMih+#$69YIVnU`QeWSF-VA z4LvkwWL5AbF3@df+|@5i{0Z>db+0a~tdv7J=j-NeaOFacOJ>!5szMDpUZ)YTJcu@=LcqrM_Jtk-=f&$dCR7`0Ym7T z{VCwQ`#dM>`^y)`J@oR!rD^3Z9rAk;pO zX@b5&_3lMU3>qyzM(h>!^ag<-p!>H+27v@%Q5|kt65Wb7Xn%4$?BC4F6O*jC^WO|( z>Ua-`>MZUiFK$4yE}o_pqM%;C$M4(9SYJRc+;VRGg8-239eGu%YU@uycRy$t82$qY#U1_vYac!>By}Bch_p(d1=1)$3L>*|dS^az33|^;uVJt@a z*i%qI)^yyBoa^<(tt>5&#mbIV19J|F`^AgARpm*%6*xlj#q(}$>OgzZIRu$#?MLUh zlB#NU^Ja-$`OE9Vcsu1e5DkqzJgt83UVf`XK+Ou_yMK|%@_Y++AFA7*;I~_twGc7) z_K~eRI?ZMxqVk>oG1Q?#50a`2WCq)4!9S)XyUi&=94!jTrQ%!Nvk z5A^pRIaB95s~PQw)1a0tM;X(uriVIiejk6`^Y8vXZ3Ltaj~yM^JT7plvkv+!Z14HV z>iYJy5SUDz1)386I(6b_n*U-C<5*riQahL%G|4Z z`H(mn(#`8~(nI}iW3Wm)Ah+soM}1}!+c2y7gsYDI?fX@X9N<@hpy!weOm7ktzNe8b zUvkWIzv)O2xj(tvT1pH!JiXtw#<6)7494Ua zaYM)XxHVYCU%NoxsK4!m>~bAMW25u7 zNKGq86-ukO>E)lnUB^kyg`ijLuR_0$))!Mgu{%KT=eklc^F3?iEF5LK3JzcU1isiS zX|@L7>Uo)(5{ya%=>04gaA@5ST8D=;Rh94Xzx)}k-i23R)bqwumD%4erGGSAnZuE; zGI6dp{iYTmgm<@pr}wq}%$sy_;VP{Vb#nAw zBB!0P_7|c?Yt{LxO*=b)o5A$4NS4m#OIOnZ0oD}xP;hqPxtVuw1LB)Ay#794SiLpe zbjSY0YmNyk9{yIg=N)*>`8oRKnPfl2-KY7NEyBx+(JxbGnibL#5*vt-x4x@BkQ)19l9&E>@|6}D+1L`~l^}L_EzsucT!PI(x)X2Gk(x?hi-F0WS zp;I&4Be>tCXTKcOkvb&9+)h{Bo$WDm>HhlM|83Ij>85&7>owQsO>D!*c6~g4bw3C# zivNfuB7#*v!0lzkd_ik9qp+=wsye$+;#3?!8_*Iq5;P)R)iPkW}SAOCx`L7G%xw-h96x zhYCFz)GKt|&$KgVKNf2_q~f0fF%rg^XE}b*mwV4J9i?x*e+$*_pvvZPHrVJGqt2{) z+>~R`*OLO_o37e4nWS!u9L}~=+jYJYL(H0c^%+VKOXP0wyWie6Km47Y)aG+d*<3AE zQ>`k#*_#n~H!5BqjT3_MRc~J?B0_F`z9YZ`S>JzmKL9Z2t$Yb$^M61#J-zA3OtBZ2 zJDtAQBR1xnw}9smaf7C)dqqQV0dUTL#tn`G4rNz}wCB6crrn9bx&50XSn& zvov=s7}q?2U;g#s8vrj305~<9)!iE3FLwaXzBz7ww0!S&{&fz-#*Z$03@|9m(bI)4 zR-hEX6UxRCuV*ma4`!aT7~OjdGxxe~ypqcDp2R`*x!+{f%kMto>I+Ga+zY-882Rn_*fo%z)p>^DiOL_+ue&k!f|_r&fTO4QjND7oGOj5lOs*l_Bp^%Gp& z))F>0jH~CMtUeThu$4BgvsSxZ9YrOjjo}nKT_t7ZURrA6$z63lD3iU$pfnfH|&$XqcELuHgWPt&`A0HjtPW_Cw9R_EC+#>G7e|c%Xl?s4q*f8%HpDRK zizt3hX@01jNNkFA#}^=-0br~uR+I%H*c0kkC(}aD85TV$Tf)LjyR@WKGflO^7QPux zJS!=<&;Ou7@k3jObi#&NKdRMvmK235+-)i9D66_L+jf-6YcBA?rORDZZO{c3fTw`{}~+3*NJZnQSZRyxkj7zck@P8>Vg zOd@xiGg&V!OnXLIvvR1Et6{ruWFc2C>meIWnl=;jx3S~FmY2D3bX2#R>bdPrQ|%Ze zCt>XmplT;_Y5dEi7za7%=;>|#`e&^+12EDBJ27f`L|`L;kGgM+X*~#U$FWac<1rfYpZ0BXeTs(~`)X(-1g^L#g@=>!- zO#XQAx+v1vF#PCu43zMq_|N`cEG-qH7y}3@RC;rAyKVbt2FK%5*K3D~C)++p_M$S7 zzlDHYh5Jg2am-%;tS~v42>h4Y09ctMg>WiU_9w@!w~l|%>q$(=KKN(n`21#*4S_)B z6Uw5_EeQXdAZ?j)t2Zd z*bxs%Ew@|s-45r)?aD&zyS3T=j|*UUF-Sl8ePg+Fw$>PyEFR9=FZ~SV$tU~r^s~2$K<^V?VXnn*hhu>Uvvn3 zMj9L(46OI}p0{U~+dxijClJ?p)~x%@ulB?4(}jMcFaOFMKt1(x`q>UtXTt}0XW8c) zs6i6W6g_^)cd#Uq8;d zwmwCKM;{HpqAoM?mfQiAxL83iX4iEe<3a~H!%r~h9hYRru{==`5e@)^_S$qXO4R%o z3;!69mmk-B!3`ag+!}!GL1BG0IzQRVsHF!;%ONeENZz!-*%R@O|KLZXUZ~NIdG#v_N~Z{*{YrN$j&mNi z(<`O_O5H$p7^t(RzuuO*Zx|g%vP}r&64-S?`B_yxO?o`yDH87qZ z_uX#}I%kNFJDc?^DWYhw2%xBQ9B^FMoJkfFR$jPE>U+G+^&%Uj0TPNvCMnK^Nwc$&UFWgg9@VzDr!Q(I|Z9ifb?=44JhL{V7g&V)>68& z?&kjuY&Q^LcwlAz_D)%1E4Q>&n+yF1#JN$;vFsc`j4GKz;nOx&e9&U5<5G| zBM7n;JibXhOu*c_pEL-(CsTQ8bU)elbOVkBSGEOsSmK)VT>L{X=YQgv`6{3Nr+Sp6 zkye?8gR1Uz0VLPveA;V2MBHe**QuJOQAz)S9;xieW88N}=)X*mP4d64#|zGZp4^Hw zYN;V475eIKk5_VShEHu;WEC(vex@=wULYc_2A9K?n6kWN)p zE!aD-PkbvS#K+T8)s*q^dVji1W(PHl?tdMuRn#jD0BTBI`(}>k$Z0pnm@x!nXvCHH;(lA^H=iYM5uS3+j-&+p)Vi$2pKEM=v(B;QTd-d-nUR#PLK3?!lkO5XFS zz>Q4jKDwU}i=;+UMdyD!P;#sa!5Do}HP+$d{W5m@i`W6gt0?_V3{J8^EEitkxGfJe zziJ{#zq5dZ)*`k%^I+j;W`3b#l!?LVAnLMRcxMJ^U=7t?@{{PpXp~58!KS5z?>|}y zZ@Ci-kLr;04f9QS3w~X6;+qtiW!G60gYyTcrQh@nu^?HmiqC?O)_YLBKyu`8kS7h% zhWLhfL-sWch>MQXAja!e=Sw~k-Pt~Y!egGUb8-+|0E7tVWe4f?v@tRyZTNtZTa^qc zWeIqTiz&sF%yh3kFJ{L;Ozy&)L04q;UB)|AA%tu=U83f-SblifX^NsF7U9 z^|n)|tvm4Z>k)e*t}@XZ5wYnpt%U+mLQ=Drh z3duL7CS(|e*5MNjPMr$xNBrUx__HXqM9lsbl24!PgRZ1e38|r{h1!>4Cc z0g!x?ea^aMwQ$Mv^MDslxbgP#Dq;*5B`cZ*laU1^VGOzc(l28Ow?Hq78}5;imfG^G zN?(dWCL_g{T**PKUe*l9Q zQm38_Idlp555=oTAC44-kx^R0%oS_bi_z!J2@T1UJO{e+S%z9|$JIU(QWCfD&my6Q z2;n$OdDv*sFc~#rLxm0HG`*K}Un*&OrQ%%p$dn=%H!~+-?YyK{BV0~E*03l`R=iKv z%l-)oWPFpKwKQbw+F}ZNxyU8X#-f|~gvR0+^jJb8VocLwBxJ9rbzQAQLTKi=4(M;r$w6iHc&u zGy#bLA2+?PXeLGq871MzZT&m;fVwW;M&Xp{eMbx+#mYh=FKql-US3#G0J+*EMU@B? zUjb&=^lg+PRdN6QtH*d!$oVs1wvO9wyT!a;@m+YN?Crn!-$+tms*8rv5AmpTdxw^@DYk|6c=(l#$lbB zZiw0;=ia0h-I^ei1Exy;o|HFw> zhFixcTFS=8Ml3N#okJsho*bJ(u%d1$+hv`0yvAIKRhSs(uP9N;Qs<(nhl|2P$$WCS z@BFB8mP=JKpE=~or0m_%8=b+R^{<@JK3gJ1j9^F{ib(gfZ0?SW6{{@g8AW-XU1(Xu zKNPc~h`-})iB4Bi9e#bJcK9{0Xk3Kp_4?}`nqBo^hSE&(LPvVXUgL&eNcGG0o^N=y z=1ZF!yprzB&r_;~O%qR1u;)=xOcgi@M^w_-pdI5gloPU1?I$5Lz=G!N8)i@`OFQXG zz$r0HVsAa8v{i-nCL4abg;W)X`;B0%X-Ewh5M?fyZrWDywHS6YchBZp=ZWH39% zfcMm;K#|azs_8E^+u*TH^R0XTBe1kOivupo=|0LN{G{5xJlW!K{)V4K$tyl?pa>LXumP^=W$7PJfdoIvxn8MuN%cGe9RG9j;*b)=pkcm; zBBbxunMpZR_|aPwi7h!Ih8+xr>v4G3aTPdJ^bn$jU%aaEXF+k$0LHv!dg4ZQD=aGR zHj57Em6zpgqe@ag4PDIjj8*Qp?4Stc>;Sb7-Hg&?r&=3|ZZ1>s7zdq!^%rK1vcCF1y9_&G6*9mC4T|2+h$I7j&?DYimn>^V8@_SnjU* z@!NdXM+96iC5VyJlSujnkPBK}7Pv++h?t$fuQ5YAOMo?q3W8Kpn>AhK2r-P4E@m5z z6gF6O(GVahJlA@yDIc)y-lz9{G7!e91WmQ!% zKE1H2W3Ct|lP=UW?6bOz=9=93RCY$haMUgd)_79lQ8?Wc(_mo}HQwegdH<&&B~r4w z5*9c)7jSTBa6wa3(GdO;Xl`)m2Ab$PoL{9;7cXlI&_!1UooymU>Azbgq=y#TZh0hF z@Cg?%rB7RH!niaBg2Cyq{5Z81MS3j>aQVh*IN@^$e2006Q2K*EDo|P;@2D?ClZ={C z;*qB0puTZ&<;2E8E+R|vexMW+)5z(mRVTfH{EhJQQWupLp-gTLot}oGku3c9<3Ur9 zo7o5haX6XPtkc;V5m@p_nF&|V0d}_QC1oO8`|>rm-a>Z+<}(rGsu-e^^983K&O}<$SaYO?Kuw? z{YTZtmAZlX>7ry`AoJ0o=MXs(dNt5vj4>m{;^zp`31Bj+K7)inI3f#(BEn%&y6O`% z^c8b-pP}LWO*M;@Y56uKIGvnChFl1ZEsdvh#prp1wCMBmNeAfXne;wwrR)A_w=5ZqPB^M zD6k+iZvP90RCuB|rmM}~O~Oeou;Q8Qd?3#CZcOW8Fr4VnpBfiVa3M+qd$Ea~S9-D< z->JVeY)Qlj+(|YqTe3ab&8G$nzK7*jnI6u#W2I(drHH4!_Tj!XTu8+5xiECUagfkk z&Q`7&{xYAu9&O+Zj~}cdTOyNIs>lk%8=68wl94zN$jHwp;3-q#*`cI?I&nhK#RVLK z;eu69+;&~TzI(nB_gBEGCrbx+6D@xDQ05e&!52dE0If{c5LL7HC{SVw^oE;4MqZy{ zk%gMPkF&u0ptBfH28X;xGz5RzREJ+JNfB`Vyws%I?R6lsMGkQ&#kaaU%G@nxf!`R8 z)m0K`R$0AWGx)#l3vy(p!1Ks3YFR2J_wseRor(x}+Hz{crKm6;guZr=b~zmW^!Z2w z$LhkP`ApEq5++`V*Us>D*7>DJ0wz7QdZ#U)C654xltr%GCw)p3CVjV3g-(bfV+1o? zl!l&O1g@8I;H0j=RMRa7_5s>Ikb)E^Qc+D$)-U=L`Zj|wP=z(P3h#htxQEgVOkwqN z3h7{~Eov9Bywz|fyT1_UgX%#FY)B6xB*q~{sxEgtb&hx1pDQ&Bv!KKY?nDK1dGmvf zb__Noq|X3fh5xWo(@xL#oDozGS0=%=S9Ce{U`Qo)8X@J8jFmn*oholUFxJcxXlbo$ zRO+pxKqecQlsUKv3E4-!TiSz>{v9m`6M<2)y60p@ORc4jA<_brp&2o5*#<(M1p(OE zHb&MC*Y;J8;ivo$9w7Vy(757t5@V)rSJco>z74M8`>M#|$65{OzTq=->)twdR=ofw z;p;DQP$0~q;FX}zW0@i>3Jj@^ui%vEk?=*Lkr_JPr*c@yDfX|?m}OeEegTlE4bsYY2phh3 z2*xOU2r|qRen^3>Ddd^8N^Q zj`@4vka8)!tfq+N#t^0Sk2W+C!T0<#;uE9Sq<``6VHtU zbT6g!XVHV!v|E9(l^}P$PQ`|Uxdhb1-?Cfxs;KeiuQ}y@P0@-TkZ2abC#uZ+0y!}-=G6@M zTS-80SyWH_OfeTlUrf&Af5F8S61ND_GD7fS>eOIlIB3;(3<1tG% zZ>nOu^|&pc25_{~JLa)|Y1w16XCc##qGZRnbiaJ96iCCubid2cWPqb9?^yNlNR zSS=t0K&m#=LWFpdzgh^yOCkY&N|bzVq3xipLjMiZA|r+hx-GpncG@|6MHHdWd0IA1 zw6J9atF6kolrYHFK#QtshirO^og@y=aAcH0$nqA|tFPgx4+#!w{A*a0Sy3Ko3`Mk! zr^Y4Z3^>zG2;QYQItgR8Zb}vrRfq!r^H(yKsav=DOoH{XhaC+Xm-r~q> z5dn1^ZZQh(~q-;Y6^uZ(nN?C=Ht+{M`g-VeW@5zHd0bj66Xq0G#DSOiWu6tT^Wm- zO1?B`5D}7rV~nx^6tAQz82@JlX{v79xaA1p&}aN`f9TmU=z>a_IYSM|^{@o#k~m4E z(U)u3-g8k#bPfX%&5$L<6#$ldd;jAB_8KSe`J7$#ckEIEvq;T^uQLFy1g_`4CL5yc znN+qYj4U{Y3AzcKPap;jhRPrK9za)-7G8oUsgF?$stA)O6-uO%|6S5R6L7AI4h{Yq zC-2#h5FzQwBdl|{T@Qbsn3B{!-c@R5$=BSs*mE_~FL`cuE`j@5cwB6TdXG#` z_>)KE0(;I~XKlpn(^y zq^SuX9~Pb@&~+XnBwhcR0{|!-`Mnkcza~gi!1IytCW~(w9^}Ep`-_U8MGuA#A&!I* z;tQJ;T+199XYhpNn?fc*`cqvLBWA>wSRG^p+rkArO@8Dih{utE*Wk9c5FQU%0FcDX zcf>_!2>&E}8?EM@DG`_beoRzRm}F=lgrUVtQ>0Ovo<^uR$j_9APLLPjLq;v~anpog zo{|NaA}I!{IIg8b**qoP**u?cmUu~n1DH0Z@7Y-KVe({3GN6R%3eiF((w%v;45}1c zBYd3XQTl1;#6LjN&lw#fYLV_fH|6BTeBI-E#Liek30IW*NR>wefmd7siXmaxt~9sX zs)H}hM_gnd`MWzO8 z=EWBH6}NxYWvgsaPo#fmSTakDee_@f?6}qjt=rbLy)$B0JMPy72+6cF;%HO>e4xtA z&Jlg}M^GGo21`5uYJF5v8ZXI~vu(Z8xFcMESGp!2X``qjFc8~Gi-()GfL?SKUTs>_ zP;au?aVP%x@gqf|6vHS&^kn@6!m`2~K-l9W;HG6$+NyWag@~7=n6#y*Pnw^b`@3vx zD#9*WI4wJO_w?gt`OcIG`_HADhCTyMpMBO;ldbVrc#T^cLvcW@uF!@3#=O3A#Y>_` z@Fll!45=MIA?3Bq=S!CCD{OLX6D?Vi=%8i)DO`E(`3It;=oGg1-bvM&ZL!K(0G~ zc>(#f;YVXZ3ph7AOX?d~pj-a5lzK{-AmYVLOz_QiMX6E}w%5e9J}k&L%rk`EDzPRr zgBL!ZIN?Tg|MP3;6Ua?r!~NKpPAeHRb_hIMf?TQHOoael0%9GU@@K* z709X_bzW**kpIr>h3=pxG^_j8whCI~_v+=*HT@Yq8M5U=KYYUsH|d19r$!AB^sD=| z(xVh|ju33*jXn%PE7mF0BF|HExKTykyyk%CdFspu*2ajI_F@)e(1Y+Ny|97Y{D=+_ zps`lO^hl6FD^)TpT1W}qC5{G1hR%P@*pUav!2^qaR9z!}hS#`M1qxt#vcGW!Dyc49o1N?$I*+LAzP6N1KFziPeyUD$e;V*dD) zN~c^0H_jr=EKK_HA_oM`F4=^Y27C45UFV^~(N)K{xht0<&p%JxF~TX(M-d7K&H3T# z-RlAz?wV~@v2bugh(lWgG^$`mL2M+I6Zjhvg-S<93H?U3QR+W|RcTq8YE&oicn0=w z>nB=U{}d$?1L2o)oEko(Xj@MQ=8H5H7xiqV)f&6KJxbt#EZSwKlyrwc>X!7DmZ^b~ zjz{Un_AkXt@(C(45{m@~Aqr&iJxw-WgHSa^7Hf$zNiQT?NlHg% zkP&u*HO!KF3kssPo2bHoz+BCaruxvWDz*yzkP~^j@~I?*G_R!vx&gXzgooY!aIEkF*m@+&&li! z8=_(HM%gHXg^k)k=ZBkOPbDSls%Q8=F2D~_RM{iTR1D5X!MhD!+o}$xXJ6k{Fq>oZ zjrCG*9ilSy2cZbkUIZf{AtBm7Q;`5L0$#qtXIIKi8*O0h=KR)bynNX%m(W1j3 zaHL_5hr?;2uX^i;mHLaekKM=N~^LDhDGrsD38=f}l>&K|=dP(hj#X)>iQ+kz5 zuqgEhPTgbBU2Hov2{HO9vM$o&OTY$qpgYEzBpDoT^hCPHs*i)qY!x!~`O@{RtBw)>e1FL+9E zt^y97dG#$u`=4c|xf%;Ecg2D|2R*nW5+A$3P)5OMaFn#Vf$}?Q>`ug#6pt2BRt#En z9nLp1QLM~i4Iefqpp&4JAkbGN!>R`4)K>^lLT7RKOf}_SRkJzE$-%m8;C({(90e&2 zO;tBY)o+DSwnJL#6yS&%{QcLWkCV&(@3qj!))WlpJ89-=h9UL1TJYjKffVV5=;akB zf__Q}+Pl`8CypDsE;Vf(W6p~k!}|jFV)*p-C`B`W-9@Zf$+8vMQE(|z-~O=C4#8f? z|M3zvbo?`B0LdU7UbPrrz&<#SFae(wb1AR5Pp+(5IFm#N7hoAZYfnMVHjT8y2TQA| zC%|%AtFDT@bNOkt0e1& zz5IUw=s*|0*zf)sUh(3;fPFXe_LpDE`e)ydu{pxTSfNp&Lh1;mBYL9b4}R_GsIZFH zo}`x{ltctj9&Axfy-vVXeFEt9dRS}e_xsaSePC*M@8TXhe^uw3>S7y02vhU?{QUe> zp@KFmt4o!aQcjKa-K$G?cdk`8lO&-iim9UI>@3OsjK--Dl`}1+dPcHlm|=!H3fh2? zW6nRX&j&v6M!w?_-wvTQKSxqBT5BU4-u3SH5rQEE142`jB}tSbJT#?+AW8ZQEcQI# zbn#Z^`wH)Bq*-Tv=^(%S+$ZzPKl>~)C-IF$sTd&)c#T$qg}&rociV>bCBi6*#uFzA zuE~kD!MT7?F-27~=%@JLVd6V#OH~qQ+j3VDDWp_5nNWp3_kZLQST1tLO+hR{)dzUh zvmeOaFS;LZ{czy%Kl3{N?b;hS;OAHueb5mmG8|f2Lug4lNb$6RrHSdWbI(P@OBt_t z{VQn9D&^>_l>0tUXdI%U?ZxOV&W(A+@BIpnlIOnkQttD}Z^qjkO+!=Hc8xVE;& z!Gj0eT(U_!9boF)>U>@u$#c#gVXW^6U{`7sLLk-ILtDz#~bsISw9L<;ttCqN*KI8{*8MVvqt90iy&; zD`YI$(x2n^U;G?Wa|?s$5YPSD@8?7Be=R@yBbV^cmw$jDdqm8mtZ925hJX}~9a}X2 z`{#cc?N)6H;#}QJt4}b3iQYeH6?;32=;6+9)=4qlm zNF#`SMN`!L`cM88pS-5w*WYkC9~?Sv)(LSH2)&A$1H9o4f6R+t^jrqLl(MRk!n3qE zz}E$_68QC17B5_6@%%n-`G?n`2ZFb~{{Qlc%iamHK`T(s@z%fo3%=*cmryImM?Q8r zKlwAyAdpivVTw(ct#Z}1zUdULe!ou$fjrMil4NRR7echnzb8bijewBTi4INEkY(BQ zxN#g)mgU5+cXr@^9Kkvn+}TO)Cv*N8$(mt?8E$XJ`a8PLy=lyZ9`Fv&?aDgg;s$`OX4&_L;_pDx8DCep8XS#;Hppl1Hb(9 zKggor!YBUiKlsFdeuXMlxO#;2V*(!M9nP05ElBQr&s{wF!S^K94O+Hw1C6anq8RU6 zlC^LDKKi|srKKh6rop*(`ac4i#B5_rTuL@El(V^s{m%WceH{OI@vpn^Q z&qS*M&wSo*@{mW|n{sV02lnmd#xH$|ANk(zVbA%yNRt5%xcJ_zT>AyCyXuo{S%~qW zKuL#pB}xZ^@Vxb1Z{Qa%eJYC!4K_cB%yaI#>#lrhui<_V`APQQD7fnXy_##T_(#@O z_md+r23D{CGWR@p2U!%OghWS%vaVRoN7EjIN+|||0ePNJ4eK4z+1OJMn5t8q$EqVe zX__(`ji%&lI2>Y3+p1?{-@~rOPFH5^a;nZ+P{@tDGONul1b!Xq3|7qWoD?k1P{_qvA=iff}Wxo3PeO&h+ zUuCp5B!~n@f{CG@Hazo3zmIRa$1Z&E=qSVEiS-szQZhAW$4(1TPCVz4Qt?aA`4txX zJ(^<7s9fW>e*d*-buMYypyM1FL#k7XS|Ge-ad8ec81Ss0dIF+x=qjSGVw4*ZMqk5O ziFJxCgYA^nLCT_nM59vB-Xfg98c8n|RA_9oN<=|*?)TymxRqs|^}|2MmDgX#l?OZr z-Ch)iCqMd8?7!|U9NPa59`~^GdFE5Um-oN#L;S|`euWo2=f@FlmCHZ+7T)s@f5zh; zbv`R=hj_$yUqXH38gZf6e{~iHQT)`?e}cQ;^#Q#4 z1+U{pzxYR7`^7cZt9dTG&%KeMX2&4rxi5Gc-|<~{r!U4t2M-XJ1%LUP*RrtKxV5CIN`kX!DM;f86Db0gG>fsWxwF3(CyhHb2kT7x z2T2_F%^i61aO9#hB?D`d;mt6^4FApXm9O8z7q0yp|M;PgGjICbksRAG&|#f0ZS|9L#(J08NKj_|#Rpn4-Q2|k_ns}vwi0r(l{=-_yPt4kF5_fKOcC~4?L0GJMO|OU-w>$ z^;HfmuW*lDeFiOO-^KqW=q=<(+;IX{?4_?f5*M5e(-hDei^}NS2%D;kM z(){6{{WO2{nqQ!*N`C2Q|AHW6KK-fBL#_Dy7yb@nhv?0-?j&n#BeJC}y!+knB}4`P zdex^{+P0m){LA0vwQv7(cHi}z2*L0}&v+8W?~F0h@Z4wqG#~%Ozc8v-Se&mI&#&^r zXFY+eRDA0_7x}$EdLG~Z=pW}d-|$YpJQBR%WiO#wOvuI&=T#ADb&x2ANJp&HB_UfN zOkx;fXOPhP)IzH&B}pl8X?a#=5T!6X$0#`yG3^@xjOpXXDG>nGjBXI%rL|4hjCru zkmzJPWIH&x{{Vyt?@GS@_5J+#GoQ}|dv?)F17EvtKdt~RC3oGkjb}Xli9F_E_vD-l zEh|qEXE+9jNl7U{9A+#axIiB~w zpGrAA#1DS|V^}$`!tei|H?e%n*H9**w`C`Fd4Os>LIedE93Cwku5o~*%!g=KQ#-}C zJm|Zq)2$dR!8O!Elf^Olir~hZZf0R|3%~Xoui@o?`uprSH|Nur-^>#peP4d|m%fL` zMGxludpwX{)B{^_&1XNyy&iBs(uH|m`kG6b>utq|IX-j6HT?Kfo{en=ATxS{gn(q6 zSM+vmG;>~aSXN1%I`k((XQ5tdMb+=I6a25OaFH@8?=X~=c zsZG+h@ad=EJ<1D0)nGZCfhDCRj$?|voCb`>aZFWJ6K|WJ&i?C+>&`iPz1}q6tRqUD zPpfH~sn@HWF?d-2ZFA7n)T;$8>FSzR1H@5$2Yv&-G2AHxYeuea1xLw6XBw$F)5bHy z3^Uw55ULIGw4%mIL0(u!!-B0l2fXFY@20Hhxc;V^{Rh8D5DG08h~gd(eDH&LwN5EJF%SV=Drl2!X+(MIg~BM)bk1@`T5I z8;AB@OFlZpzklv4eDsr_#pnUKvwZcIL!7rwvvodW-)ICnMW{Bh9jOVvM2Ha~RIH3k zw(Q!&&C4Y&fDoEs0?Vt1(1~PSl#B~O@fEnw{r(r3GHjpQ!ebx*SbpNCf0nnr>D_$h z(-D{c;tP1<4?Kuhz4|2_Id+Bh3=vWA#Q2HtOG-ISnzy!%*KmRM&k3nJTX2UH ztTTbXY{ZGk)g3+7V@S&eCUd5dnlo)YGt4lI}#I9`-V7asEZYXu~-7PtgfTv03RgQS%h#% z2})-a%?RNQVrGv4l;i4WiRK_pL;&P_2S>*`ycg_ z?A>b_tqkeKbLhBF(Kv)!r>-SB>hZzL{*8bA=*QYX&-sX9K4SNdJ&f0G=4F5ILadJY z)tCM;QM#3#6`x_Dx5$O(+?!Ya?yvIUo8HTJJ^m8DeAB<< z{8oPFMK9wsS6sti|I>%bL&=UUOVoA1qyt9zDhmm$e)Z$%3m;3GWq7S!GPg#omfOzX=v(|ooe>ZP^ z^BZ~J+g`^D|KLSr+qdxCOJB^p-*FjRqaH7O!Ru)30lxJ+AI)F=+6(!ccYU0`i#WJu z>7TosXzd`y+8SdaX!0ScmQ?FEG5W+m^XPj%p7q)yw5F^IvfdnciT8oI!5oK{m&wu; zgh2StQw35gv{qC9l~fAbShQ|csCc4oIq!(#n7XboCIT_ZCez785o`MkDy69EnmCH5 zvp$nFArL655+U2TheL-BaW-{(zQbk_o@wOjM7XmpSjSs%Hr>M+W|-mZM-?n%S5uZ1 zNP$p&)<*?@@!HoDd`b|Wx~@=CBV?ei9d&6@IBZ$sO@hvLa?4FQW#fpIVrBn`m%R9u z{M)}?NeJ`I&ncdN=`#p!KUO>9G-l7XMb6u?jivrv`(Rg!QCXsOkE#OeC2xJ(-(wvJ z8z?J_pkzz7mAQolDqjLIQh55w0D)jMz7E0|sWd8z+oX6B(k#JfiFXdABAgX?VJVA- z;3Nozj0Z&3BEl&uKjy}R2RJku^Rv(Sd8`k}G-KUbM#{2WFB3$<@~~iKT;LGYWj*P= zSK?j4^2$EYf?PD*yt>S4U9oq#!nKDEu{?&+$dHdTgZ^&zFW21j0gvFDAM$Ws`O24L zi-Y{$i=WT;JpK|Ex9mg=1ZH73KlGH}A*dTmSyfo)5K>~TqpE8>0UyG&El%AuK%lA$qDUW+3V){K zjEHHtqjAiX>NAYQoay7+h%;?GGt4les)YfBfJTTz~ydxOz;lx079WIS-`g;SYN-#c&-#g$N$! z1z)-LI)TDNq~i#wlDQ55aWxyGV^ z##+*Tj~dS{D{E9DAxh_oq7>;pMuL!HLMjB-IZPa(lNg~D>7d78aUQh9OHbC%T7^hS zf{=`>hMV^vVlB_vdvJx7^^!DO;G+9Jkk9_-UOxWuFY?wmzKeV{=lWar;*cB~4q0p9 zU@Z_vVuQuI_Epz4gTVsMwh1n)?DpM8kyiReCG2va@94T=iKvl@y++XJC!XNEY4H8IiB_GC-a`mew8#j7wI&G zYv|1_ko8u`5{LAH-~(Q+GhEwG))$yKK_Y0przi@Hjws9Wh@N=e?6uB&)DbS{9OFDk zMW$^=tTn>KtQRFk-4IDhtQAQdGpdTVHB1v|nz{|l9Ij8#(?uO1JW^^z5QreywPP1r z8Mf_+SX)~m=_PpY8Rt0{Ui45xXt?4TzfGiKim|2A5b|}D(bOT}M1)Wl5dyZcq>~a{ z-84w4ftEPt#h5rwaMhT&zniiNC~1(1LIg35R8UH_GYW&B-k&aAji| zrp}Dsk+Lq$z3XeZu?>zfW=h~XKNc`u-kIa!Fd;h|aHr;A-BvhV5_CMJ@y;TICnQu8 z!_#JD>SV@ydy=r37i)$Y{(B;d5}fyBS)U*^LP!oAsxavyO|Xa{h@zC@V2+MGLe%Iu zLkRHBVVedc15zu37QFMl|4uOTI0CkANaK{XBEpx7kAD0bax2hUf^V=QVDx}q6l0wv z1dlWkAG+*n9`vC5aKX8r=l$Z-dF@}lAMXUJpK!xXH`8C-$*%2zNLN4uq99V1U>#|c zGA`B;0^&F#ATiQR8w__Q>@IGgQ(LswGRLJAt+&@_SCYS!`*a-x8B z$>ac0mQK%+4f+#xuY@4mmly0mxQtYiDA5$TUdh&F?O?EulgZCAY z_LNmYUe=s*mvb>u!lyp@AN=w!{}C_wo!3#06;JxX@5j56K)^Zh9?Ic5cfDXIMKMGw z$?DocA|;R^V5=IV4Po+-2aYIVb>yI~>uJfbiz=vt#}cTU1_8uUql8B(i?t=vNSyS@ z*i8LHJ_LrN5k*-t9FNG$f^m^E%Eye0oT{$L%bcPt80R^Sb5u=Do)59Mq^ff~9&I#U zRXFKrRG`+Dkyxj40_QzoQCJiWwX;Yir^;D-eR4`1J91SNIa!imbZb!Wu3afLEtNJ+ zGbNqCRJrO1Sf^rjA)p({Rhp*LQla;5dat|EUx$tARTl>Vhm|TJ1X^o~qG;RcoJ9)O z?K;xi@}c_;6RM5-ip|&G+P=3XK{?rDAJ30# z=|DuWW=U5L;Nu9<+(Z%-t1MGi5~~9iFmZ}flBRA;b>4fLrlBYbR##UsMq!M?`-##c z0;;ZwLqH3VQc&0uq@t=kQIt-Jnzc1v37mw=TN+x@rIf(A1}Q;GaIOI_P(q=UKq!Zo zC6=;nTcab2#!>s4I^=j6BeX!$Agm{G8Ii2eCg7BymJ%-vS;&ZFhK_omBZO3K17`1$ zN)g2|+QdY0O70x%bs!E0$hE*1mLMCvum~NHS`x%z($zJ4uIrjC%cg#;E~Cmhhmrz8 zfZ!o`loZ5~K@bSOUGJU6L=kR6z_n@1uu3Y7(xh<$J`kG-*I1gWCW&Hf-Qe9U2kSN^ zBDd*2;>6pW%K1)bY_}$Eo{aA*Y_iem`m&C9zSG65TsXrF|9v2(!uvokO|Z6{Di2j% zAuvdxkU~vDBwK|eN)16&=rl$|30^4nuNJ)JotH5`KabR!vT4l(BPXad*EcDO{= z_U!A-JYF9GgC&}wW3))CfUBbFVD?Kggbtd-Cv(~9&9ntFEcPbYg&c|w+hJL?K)3kY3 zNs>@jHD+RZ?_h01mS$505tv>-Oic1sb-RD=Z!6rU3fAqR@|@HOyC20-rN5&FBZQ#+ zb?gR5uQ_rZhx;RKcz?vnPV&7t&hgr9H;(K?V{O+TdHkcV^~Cq$XxtuZ;|w#*aCSo= zunkmIMG$WCu#OPoa3Z&JjwDG)lY}^l2?5HgBF-{|6buH7tghD_T62_DMO9T(zs_(t zq-iWoV^KomyC%Z6K?H}9iX<9vaJk{vU-T+ee?ZiW$*Um^4eM3S`p_ecBJB&d?U*A@ z4C8zqDFgX4xTKk z0;Pv^Qc`Lkppc|7bv{Ljk{C0I(4j5xVrW@-F@rY>vSZr*XvQ1C2<^2$zW%$x048sEX$?@GKwPB&!Sd2 zw~2yvdpuw^J?7Em;RNSCQtvsr{fQ4A3i#mVSFt+I5N;90fY3;Umozm*(jrk*x#n&c ze+z}Pm`H(usxFa}vZkD8S`20!FH-QY9v(N8p&T zb|uPgd>!!vri92^i&Oz)G)a`8g+wcbmXahg;5>AcbiAAtniBSspQSuxmcu5xBDj->`ypXOgR1-)wV@>Q>Kp zv;uZ2`yL0!`(LU!dYcV0(lP5c+3#4jD;)QHn<`YdwQO}9+(D1eBnQ?Lj33+5)l#V z5&c9F>IjdZ4izE@l+l!Rg^mm^c%&BS0Che_XBjKSh@Eqb9L$F}15yXHZ?N8AgF+(+ zI8v=~p++?o5GZ>Qi%DJhos zp&2qZTZvtP$`YEgq;Zo-1{`%$6DQfEMB08Xj8VjKTXN0woGe?Ms#RrGB85il*34fN z1<;l}I|ZxX@3-S<+JIUeX{3^j@)2p8VkU|0UC?WiBvXIcXf(R>z7VH~Z-`*sS!Kaf zAy+52?U5@^iHsd*o6`vg6&rpyI_l$i<+jsVerqJ__982=t_k)v6S+F^opb)OC$g zlN4|%k+LN!X`=Do05w`0nx;LrmXf*(=(ts;7I$u8xL)9Vj?$L0&Iy%4W)c|`&f96J zt5ZaTk^~Prj!;SvyklRzPP~xeONX!!g_xz{APe(z*t#S$hDZl+g2==y4%&7+jk8Ft zS*vP3B?+Ypi?R#Xrx6rj}ihc z(1x#0;v71)D$6pQZ_Axs&}bJLYOS66tDse|q=KgInnJfvqOK$u$MLj$*_B^A6)%L) zW^Pp#X_`(IKCLy*9#-HwkJ{OQ(}M?(_rsG15B z9VS>Ex|wgzPmIt?ptM4}wtVQZ2mw`962$|Y^H|%UMSG08Zm`~AVuAO8;03jFcsN8T#jq@h`zd=59GGNoX_~U6E^G4IO$a+1B zq9D_nG}c71AOz3c+yY7n(ljB>Vv43B>8F#{G7*gnl(l7LWtF9^59Pp0#T8dx&DCGO z8DlhuTuD#~UU-~$#M*#uRWUg!4R+VAwI0nNl7`$l9i%F79eN<&x((BJn z%b?xgUw1FNa$`rfym!;shO#Ws`Y>Uu>w4;G>-O(*wmJ`46h%`Le&^>(dMWGc>!fK) zeirp2JS~ECdtTn@s7FUHKNVsnPO!l#t6vpgcxPq=dnIpC(@?Nm9J?q-jR&hEv~F zk++_qG>fM_@5E##wQVfMh>6;wsmc;`LzXQND6p<3jw2$G5?o1^W#siTi+#`jBxI4nj>kmabDm!yah7{rxQlPPV2OKOw2N(X zi`b@MZZ0L(G5vIjy0XmA4_IGWV`Y7fd+gXoQCHlfJ|FKKuC5RvaA4m)KutqSjWP6k zJ@UFjC=a3`iW9W%k)?Bt^AfLM_aLK}r37bL8!a<8SYS9DanJkQn{hs7_tt{DpZ6GU zUK{d`4}Y4^UB91w8Z<#(P+f{{QQ(` z6-6=iZbebVcsxF0W?$zc3n7rC31x9OkR~#suFs2ObVv(uF*nBNakG$Tt1k`+(NH!}(P*OmeIw&U+$b7!QXeeMQ|2 zSzSFqAR~#kp;ezCEK2H$;^GK|DG`_|C!+?TfZ#|G^i0Ivw--F};Sb}&bI)P-jx8)M z4A>$KYomiyHYe@PQB^Rq79${8TH@~Koy({!h`gJWBOQxNZP{;dmviu=A=+qcV~OI3 zx~kctG+tPeo?&g6vvcQNscT2(D}<5E&&{#6e?Q~A#5Dy%_GxTR;}yNR7@I|?^;OP` zdOYh1-^rJ5SmEveas@XmFEffXMesC8l#XcK^R35aomz`r4&uw zn)$OVWBDv1S*J{}?nqPnsVi2;QmkXPJxQhNc*@qPlC4uJ@g1imc)SP(jv`z~A6snL zd$aYMj%gE<{frFFFvI^$h*GdUZ3rr(REkIpk#WYjsgWdj2h((dp;W6X<+&nR=&@d|(lQPi9 zL~Kw^K`9;Q?A(DF7Zk3*%eIknQ#Q!RfiLkv;6p@c0>*kGtuUz~@q&4&*fofF*tgw} z2VAg~yIg#CDi1~pjMN<1e?4{GFqmILG=}+J%I+Pzkt)I}jf`Tj2k1wdvZ|TuFA}7n z*PlZseOPG7tAat6A_=Gv5JFQ{6(-hX{f0r3P*Bs07swVCD9aH$cb~&e_F5K~&Z8&_ zwl8jDI2;p&fDevsyLPiaTw`7s7UnW8zUx!?z-1rhQ`cO}0V_Bt1*NMn%3!_5RuIWR zKhxZ_l4GJdVgzNihHyQ+vr{FhGnTjM`<|j4Z2b>8MyouRj?D=?Fq~gqn1m;Hpg!!m*yL%~h^r$0a7eZ8X`R zNO3z|%v7uyW;pYaWr_zp;3BU6+&Zoa*kCXiA{|jRmMD!0S|W95Jw6DO)_B|bYATdy zr`qTBm|kyw+8a*@h+^Fu-I0KpCZ*#&kx>+7f%k*SwEnid)|#9JRhhS$Pg)>FYmC3; zmc7LBxui*qvzE$^NkZCs!&HoQ7U5yOpONCZ@ccbct*|Z0Xbv6VJ0JD{?t7oRp|z&h zpJPjwQI6Jdb%Dux^p|1+8l3w(unot6-HGN?lt*XiIjM z!!r%LM%7hS5nvk4&?!xwuL_uETPZ0)hH1%gG#a%^nby;YhB%JV#%?Og1{w$`XKx}-m+3VO}ZP)X| z`^lsBksN=S+-#ZH@H&b8Hao}k=OeCZv(X=>hDY3!$v)G2a+Jn*qWd{rb^--)<38W$ zXJUpKW;k=PbN4*Yd;T*KVRb?vwqu>7t}9|Au}y_k4i$Mk4ul{$k9RdqUAH7EiV#4W zwQX@)GjoHrHP+VCGSHykKO(=WEK8JB%*_p`o30sf1hljMl+q|^XzJF$E~RGoIp?5_ zrW_3s-V#q{#08+S9w{TVhfKlwd$w@V1>1Spy)I^}@jT?-7jo|lcC)1)gURqdQ0D7k z3p5_t%MfXXOcQjL5zozGdIPE;Nc!{i7Z({UEkdM7dKqO?qlLssMKK!Vnm}E9oR`#% zCn!Ud4v716h$tpqSRkICrwI~-ChHH-Q3@s{S=hl~`yTXQ5tGePdykWXUav>fG~{^> zz`lL^iBwIZOU_v`{Lptjl>48zgZtm@d~7~ONkLxZRL)b{K#&Tl4OQJ{ff=P+BYB=r z%c#)iY;`5W&I{F%Af;Mw*~T_RUGn|L@?aO{s+6Lxs_FKfvAx@_OT6!VSKa5KGsd4y z&7MzM!MeR4q+A^PF zf;N@}g8&hZ)WJ3@|81(MZBn+}Y*?qOM$MG08D=Pa{_+>{3;+AotgTfj zWlur~koEyd zmh~Bz4JOg7tR6&5k8diR7i4KhnxvGY5%Yrq^{8QKVV=@fcx$Q43Q%B7OE{FIEDDTD z7?0LiTU$m7D6PdLDciPf;lSt+qu~loSs=V4jtpg)Qq3EXB-pV+SCRs;sb2MfoYla#A`yn<4-#8xsxbNW6@A(LqfAqg-ie&~_%?qCY zTpsY?Z{t^f?WK4mah#IIF;!KdRE4hr4P}{QgD2^msVY&`B}xhEx&&I4qD>=r6UC`j zDvG=yiaepQ4CeY2b%pluS7j+q|?HOcLAFxTYdj0+hhpKnM^e21J7iaM8JU zK?l!GH(bxQ#Q_&A_L=Kzl=ckEb>?LRQsV12nn1=WaU{{&kfn;@+K4ntSw3_KFJM#* z8RtU=nPF+J$JpuCsNXasY0BE6WsEc&I=Gj?Tp!t3iuHA*j!;R29S;c-hRe%TO@mRA zeK&j^T&s9V9rO9&3g=yL9?n`uqjk1!+eTgGD5coCbsOvJ>&(r~QC0=U!~`YLG3?rN z4wcx?e_eYmdzJ?59o3Ag0+T3YuZNJW0);D)>ToG8%d*3HSQBG;XK=5oYN}dwM5(H( zHtTBA{%5LIO?+B)UDNCJre(j5gmtqKJEGMoU0t$$cit{_Uz|=auR94RBv{|*W!zec z>F777LasLU06Z?qx)lO8*<`Y8b3%3WIB#u?-LjKbijGmNHdxceh7FFxK*IDI#Pon2 zsX9W%>Xr!s;rO1cP2W!rw%N68#5YQ^PIT-UW|-lQ$I8kwS-ME@1uyuOpW^NBej-2c z-H+rqp8qrK*tL@nf9xtgf6Z5LuAwMugdg!szw|8r^i}@{{2W?oFkP9+qho;-tvVHg zLPf3mw@HRIJ9r8G@bBa}u;fs`O4O+GFO0ki^wKp-(DVKiK(H!vUsS)Ag7$16<` z67L#pu=wDR0fL36{qPU5dgGV*$Ok{b-7mhFrJly98Z8?n9wQv(cm-cVyf~ooj_Yr} z38?}~X?*P&t&UJaG0t;L60^Lv!d=eY!<<=S<=`P?wurAAN*9m_lri|GVQK3Uwr-F@ zP!~B_Dk)YD5rk!!kErv4YCPuadv9iGZh->_R^QP}ddO7>w5BMLuaJ-lM52s=C72=Fa_6oB}j_<6fFm!Dhtj=;bFQRxo8n z$0t^Y3Dc&^))9p6IL8tvKc*ACzg40oj@%|3wb8Ws&8?8FBZ*cxb{!iD*Wn0<&BnQ@ znzdoY?Ws7O32N3I@qN&zaRPH10egu$b-zM#8Xkw!xgL8Of6?V>HhL}HsqfdE#wYP~ zuIY3>Yj@OlWK^tCl#s>+=k1>7&2N4=k9_bqWAkO2s^HIF^Hy}U1H@hcBIWs>$J`5h z=m+_KZ~g=j;X*|dJWd$A>vS zjE7_FIrbUjIfFgp0b^Fd*en7eY(Pe0Y0%PYRqtKZRn@iUp0U0C-8+B0c##pAS=C*Q zK;0sLb)w?Ed*6L=UqocYC%(Vm{r%7=WeB5;z;|fYeXwKVFd^&?Xta)#t$QF9LYBFm zEK6ZJDQ|zvTlno?`#2BWIm^ALj&b<#5vKftz%p1tnRrxW0ueYEX;|OxkQN1<{(wN) ztgo(P3QfB)h17y58sOLsrW!S}IOe5GSDBli!?#lWphiJK6o%C6HH0waX^KW5EQ{8m zdDbpoM!J%<&N`mwk_=LGA<_8s2Aa$$gebUr8r8|}t4d7e<@5w4jbO>dxaFi4Ui z=m??k{Zh56QY=)kRVi7Om2ScUgh46+LY9y`tOHpE#Y-uP!ahotpsWQn>NPetHmKEV zq-hzS7x-QYWx}8oxQ_LziqU_i?2j#4>}B0*uf%1yXJ6bDuBv0lgSz+a8}^R}iSOwb z<3Z;FxogB|f9NBYV}X3T_vP;WTb*xg9&$9-@!RkyF@7zRHyEmWV)FVYo=?FjX#SNw z?|VD`IN#%clE8mp2XJparWdEkK~1ir=0 z>@-Q%qu1*(KR1uoVi-5%5NU<-8wlIQuhqEo)Lk4qdV*GK3ePKJj;>z4f~5>;JfQA7 zWJ!b{_+>V9%`hNa({8wA{VkL*!(3sCBuj{+gxXY%f)qS(q7wPD}%HnQW7Ov}#GRzl6F>*Uraa>j2E~ONX`=_8(&a1YYfYt8(z1x$} zFn-LWGPTz&xLdKB=-(Ga#=zrM%y)c$kAfv`-fztA%vHNiJZc&%>AasbRt?-ILVaA# zDi3*OYSx6ZBz7M9mU+AWi1u1gvkvUQ{xsV^`+IB*30WE;rNHEZB(eCBANd%z zwLliwkfj6^sA%hyG8DWusHS zbol|c?GVL%@+?C+;Q0<=Z$MCQkfsr~@Xssw zD}q8=D8w*!s&vIwD+Q|}(MqXNUBM(ta9wwl#Iz`i5qMQA8>?6>%PMP68dH`GvTQXP zQ|8r@qZqw3Ql(K|54%Uj|x_k<6gns#oqo2u)0OC z`oytf41h+kHCFg$_&8<+HzjIS?m;sKJ)`@ZwGSWjW-APDw$1olZUR|fPCJ0C13R#< zoE=$e(d%pxyDnZ(BaR|`-{;(O=Xn0?b7*;rAZXC-YXlZXT4*K7OwLEY_e1>5&wi4O zh=24C{~F)+zHcUp6Tanr{}Yzy5oR4){vt)55T_}&Q`=EI@|-M7@H~ekiSX+XMm=N^ zW7&qlSFEk~2m%YC6~+iaGu>`rbV7f-k7Ij8xj9}dJ4N8Ge29S<<4;a!YVV% zHJ*OzX-*wKM3$x~WiuEIs7Z@wzw|UyQ*Hd_6pfi#9D5e0zRkw!D*etjmshvYMj#7G z77y^0!p{vGNlX!SX&;)SIooD+Wd&a;wl>!|)NImh)ydL=I1WjQoT-^v!i{Y@YaM#q zAyJaxFCOObQjN!-yU3Gg&$H2efvizJKN5+M5-A|euaYUBSUA`N8)-7`)CRc`@oS%b zfw0@>?mLfh-#y1z8w^2U*z12&og((!RQ8Co7>DSF464`kW!U3 z36+gRkJ2t!mPL{zWLbtWhQVNflyU?^6;NrdM=F#MjMS=fHK|V=mdQk`QaBZ~Re)A0 zR>m0OIK}sUY}=;y)n1G6c1`TsxLvrq)e68JSP~QclJ`AtQr-ICWnp!M>>Q6+xe46;T;_JO6Fs#m+`_$NR=2at7O2lkaQ-+^|!iCb%; zjiN9Sop7D|-*6`%`R)($vp@G3g*GT*Fh&q28L5%+b zF-S7Hy=@$40igw96k%+TqRcR!MhW*mc!Deq>8Bx<<*~N5&e7#%;wXZ4iy#QNaeWn| zC0=8W&3?+}>J6U!`Pa8{E6Qq%L}F| zCM~l703ZNKL_t(%rg-0bzkzq1XfV@i;aU<;DSr8vevz+#^Iu@gs&iGi{LugN?->*c z&h$~9eeNRDGbgZ}8ke{Gabi*)9pogQHDFSL}T_i zc4wU^jQE>><3oJ$$qSr0a}gt^XwN8`ViP}=*mXl%^mxZNou=rn(qA8NxnuM1e)PZ4 zF9v8^;Wx{zck%SE_r_0IXCov)?DkAEBlLF{R0^hd@!wcMX@_o1>BOVNBH*Dg#&AHVT)~;{y zU;pqdH#UA5X)F3sg5~&h`ytZtuq}s>2zw9`SQ-&nnB2mwE1q19`1og^qh>qEyx^e+ z9^l~S( z{{DAt74}bIbdG_%$)N3^s=jLhDn|$rtAK}K;^F;M&-u;n($fN(@AMyTo zejV#CuF|)s&}oO|e3PEF#HM!#gNrZnmXl469r8)tMFsz+LfP1sjmDHK3WY#OSq8ojgWOF~l<~^L)rE!D2*)8$Q<7nBtRl~GgBnSmlrXMr zk|-M`DyjKwx*vei%ncV-_6|CLr)xLe~4>Gq(#V`qAW3Iso zU=q8Otg-EVg5|~Vg!=*4e%JD{YStKRO#qGA+g|M(vEv#XSCvZl;c(7oSK*v-8EUjY z30W0&?GINw&!aK730Vg!)`1<^SFQbz-}f*0D<60Vf8)FUJeJmU*0zxt>h*x2ko>^^ z{M~%Vcl<4;Yli8j!;k;)k1##eAhR;;Jfk0P6NlU6VupYAFMk}zS|HEQgN#VioWPxf z0Q!S1Y`4s}B$jI^( z-?oVJoO5T-5ywjewI<=9i>8aG>P)v?-f{PR)O-g=D2g=W0471%zWKA4aQ!APytKvh zSFVyN#q#1358rzq|Na*~!BTxdATmDuk?-aMfAw!NZN)tOiC<+=qzu9}8jU*jg;`e9 zgv;00`217P^O?^+&SNh=&SSsd=kQd(KmEtwLww~r$4||GD-qoU6L-*gilYlIJoyZH znsDL#1=jls_uqLp-}T{tft!T<&aZqNb?h*I@B4p<&Y++egiQG^ElUyzc=SErOs!RC zb!~P4AQ1QA++}O<^>y}AT5A47W>~(3EuEae4_=^la&?l$Ezxuboz;n+& z$$Q`XO?<Hm*_y-meDHm&uU_H(-})%i^DUlw_KSSsOHZSv zL@7xjK}s8Y7=L9u4zsg!{8v7=w$7FA2B8r6 zmd&A=Hh=j8f1U^5^hQ2-&z-DquHq~mXRv*hjmziAYc&S8K(#Y2pT9^l=wT~K8V<0s z8LnTugav%fL-*01UE;>mpXb`Si?o~uKm6}L#>|_)p6i<-H!eQMJOA8Y?3B^5%#5_-8)Fw|xCK@Jm1O6NsROpVzQ9JkGDI zaA>)~w|~uB$?v-d@gV%-(_dgq9mjYLrrL%iHXJ^@#Ku;KqA*yFjl?EPGr}k&@ahNy z+LSR>Rcuz}&a3JRT9$?5l=UOaBF+w4>ru%a*L6opNP*Gn#VCq!U3b(L1OZu=ja-Me zW&g?lA-qcavIEv0;CPjAb!)JigrD6m!TrE$FI4S1$LQRXsT*FgTD8x%c?H|!`^HQ{ zRpn+h2+Rn|%n+h>L0F|~35F{J_XDl!iP;NUllNliYBYO};bz;rAnU*m?7&|Crj5@_ zmsY6NYQ(9<&;9)GppD`4U-~)H@M0 z)S4t|gw`2CfaeBu!wm|Plk1G@H#TXt?nF=<)Ew_i+8%B~~sM*qae| z9zDwXl>s`-oca9k^3I2s zS!&JWrG1Ltfaca0_;YW1BR_X$lWyL`OB~wmCcSP%Q5cdWMH`8w4B8ZB_WdkISqf3e zQJj^Oas)+ro{wN@Fc=I==_I2f&Q;)gk|ZNQ3xa?sibg3LvMj^%yiutftu>zK0cBmn z*NgqJDOg{2xZ15wjmA_kw4+*8W5&U1=Nx-;U%{^SU2V6T`_1;p?Ule4FoY;G1SYXh zTlq+%wsF;H_~xzDtZHxxK)WK?_W`Ya=Uqj|k6q&}RjRSZ0~PDQ4(#=B5{YHGgmKJc zpL>EhH`rc4rUhDfJb7W2-+SUo;-bg)#ufg<|NUe9t&e^WQ^yX|SZZ-(cAkyPS2%Ti zmJfZ$BmBaro+U35L{cW(v>k&g6#Zm?-)xcfHo$0lTPw`Y*hJlR27`?M^rOGb^hQfEeh(*Yi*sk6C)(;V*P7<) zY6nYMTt53aM}k>SEga&^`3n?E@UE|Y2wxc<`@=8ru5Wpi-~9CNv$B!V$wQ*~S#;p= zpMK$E#Dj#zW{dfmDSqoyPcTODAM)O>eH+%)92d7k?s&(ar59&JNgrt->~;}RjMtn&xe2agXto-p(omnB z;n3nDX&iFm*m1T75#7vi{_+)8uU~@x7D3?Azj1^9))ju@CqBlv#M`uvekZHJJS`D( zBMLzYk~At;_6doRB|N1?j^&mKNReRMiYzbHsXQxlWGPD^q(MkSF)R$7=VgLbAwWt2 zNQ7Y6ZXsn^OEQY$iGt9T5>_P~&9V%~{!@}@^k#6i-^#yRsXzN=XTM$5Y6qsoXxz;} zYX7mfIM*&Z*mEuWT(8;H@^Z=*48dsxR$>S$X5=2+17EiQt&x9moRoG!R^<*Xr@0f) zHK|lhu0mw2|E7x8J`}e1c{#8HJFwTfHU76B{4xIOU;8lM^!0DRxP89&BY&A6{MY{%4X;6w7Zl3JvLta4 zBZgn%d2X=%261Ls+Zu4_u6t=t)miOrQFDESvCu_9z1AemlCs#dvcM>s&1rhw0WEJ9 zqv7PqJ9y~sozy04oO{Y_^bYz+4Oq+UMP@Agpj<>yu)k~M~!fn3$eedF>)fM8- zCY|0ob+1OWwoSd>z@PTO6l8J214oWyusL$_5HoFuDWl0Z&-0#lz8NVcH`caU9rTz# zb^=|J1hfxRc=P!4CrGz8XqE>o}v@>XwJ`36e+Dn4a-)vnhmam{9Feje#vmXFf)VJH03=7*+^d4jRg%!km4(z~Qo95OWjOFsNpZ{&T zeL=mIBcvcnGL#FpZDEQ6%YigD$jrv`+ayK7&-~|4@%&3UfBo&)+@}iY?RcrT3uML*8wK-ZoSs+ z%Nv7r6VkX9XzjORu-e`o$UfeFE4Y&Ts#g1h)lSX9n*-WtPP5b3lSf6x-N%mi;uLe}UMV_W;FSL`|VW(~J& ze%;!uDL(pY3O6^b+fT4JYv2B#_{^&qqw?Fop2E8Qcfm%M-}V@Q^;a>jm*0M@hkh0B zZ2cPkV+fNF&+_^2pE*NoW|l0?$chxpa>;XzM3bfwd7k3h5}_4dZJI0(_{HD)ESWrt zZn<<+#1H@Y$H{->KM*vhkV#0t-=kLZ@m!y{=;6CIy(pu|HT~G|Tc7zHciwf9rR9Ko zPM_k;gU9*xFKnQNAlC-lv5~@H$Vk%|QG?~>1>&TS(hU+LQND{q!pfDa*v3KVGEVEM z3um$Y8vU&fhff{Gneu5)P4T9;J;dh5H3Ax}>6{|0QTGkTX#6n7PX{atOY*I*vEYEQp0dA|sl0VJGFa81j8`t@!Z+b69Zw<>5*p^Eg$KX!U zm|7y~#$-+pzdcK6NlqSKrrw&Pws4e7o7>p!BTO%)NTmp)K8KFyJoBY9_%fqDHO<_i zMF>1P-A!tZY2sMm`Yu^7W~vb|*w|!hc9w_V@-UrjKxb_ektaAxb7=WE&!#!H=M(n_ z*q$>|mZB)4R;!Ix2m%u;2h+5yDOeU~&PPyH!B?85WLZWMm##u7C2^G>t0-_BhcFCB z8Qz5`)v2nOG?dC#1#)HG%2)Rp@RhLJ*4p;{7#)+K#4V1S>=S$9u12R4d*NyaeD(t+ zfgE0p6k_5SDTW1>MfpWo9w$%&)YuqVontsg34wyqaf-3_;Y}jSx=q8|o_=xb{<6I~ zcR3d|{@BC)-E%7oM(>Of)%A@(2V(5G8-k+T{k*XoT!&j?;w3Fx#}D53^}LDgKG7=~ zb6^K{V6O>N4kX6VjdG$qMp+Wuwy=}~2=XFFV55XZQgq3RKGLf3YoB6mkh&DI2Vz3;7z{QYa80J=r2A~Z_DE{D?OZ?(v=lMT=^1ty*zxg;9u5|hHANWoj zY0yOhsNwgA#&s<$+n{wyVN!y?A&Ccc(~O9Met(l|mo9Pb@>TA><0MhP&%(?si&F~_ z737^hQ(lvXQ{&ju5o*Gt=E8K-1C!A36fIwIY-x^%-|`UC$CglyfbQxh3aHQ2nVX-Y z;VP2NRf0U>(v?f)lP4Uy>)W^)OfMfHGX;X2^2e$oGcDfyjz{^;U;7j@({tDwmhZlo ztkLH4Pd-U+<0^|S$V!A?swQ)xxtZ{88$lGB*x&iW|&<*g5}rnU5CTVORTJ1 zM@h;OK1wk=)dmcH;Bx5jA_#*j3huc3A!28WL8_^_JFmSEVic@iS+%XTrYMTh>c6TU zVbxcqW2iE+SNX2A*3|3uQ5hT|#3*;xc$uB*_{#NIDPc*H;J9Oxe2v>}{ZzdvT)l!Z zyWwj0xN)^d*XYuQn@h8Hn9SEaTI_EWOPFK0~e8fjSN z{r*3@Z>n(ZBU^p7DOm@0U|($}(v&3GDr0i;g2D<(GJ#MT&1Q{_wFn~=S}F3PffXb? z|AOY{e(Hxw#1X8lgUK|)avid+9U6%s+v;%s@->bfJ4#w?@x}-4;@X8PguRG` zJMUp?aha(j3p8h%bXQhLl8lxXh!o0lQ1uy~^o_-VQAv z%h*^}9i3~!ZWnvLg>stQapG>W>o?di7S@u-^4s6a^j#po4N0cg@T*f8rE3uB~w4>UmDzb(Ap9NureHsYM2HLYPO?=b8{DsPzq6?EtUV zV6E0*xzXf;tn-{R$I&=v)vF=QPF^de6hRP-R`6MtHF6JDaZ#1}R4H4Y=Z#!^MNy3Q zi=rscX_a7ZS=OjjPL+Zo%hFL2(kx3yS>7EfDbf_*w%H!$(Rw}DAI(L$4+#8FH5pbCPv zhRR1VjL#{*RBfwV4OXkw=tTpRCCSqQj3z5`99N-pfhhnKpZ)xoP?n3bEW%zNB_u_r zN%Mk0dRSIY7!5#9)0l1%rB~6yXQdNz|LhbuHaaZMO_BC{+;!wAo2wze`?)W%cx(<& zm5DU3uiW6_H@=Z59B}Ug_al>nL8r$(cb(?&;ykOXm)X2=k%h&1v@u+I@glM?Y)4%d z@4S=uzV99Q^UL%*9SRX+E??rpm!9S?efV!pdY8$ehs4vv=m%8e~#SqId%74XcKe! zr3*xZg!#EeGA;1^8p-w+>zA%`{h4Pu{=l91(=EKZ&GN}5HV2Bnm(x}?jMC_&7{y#w z093_BRi?EjilT`O>q3YTbX9;h9`s&ia?kU;TotI~L`;_BI21)O%5!Dg_UN&TF@Td_ zjX~~v;OQ1{wZCdreR1#aTG|ay;|IKKK>IGZ8V95brp7^R|LwhCRgE2w`knx*>RQIA zY5e#}xY%3XW^%t&sD#)7tupWExS}bP?46=5h zYKMmQ<)T*zO9xDKUU0wk;n|kwouAYFi6mS;FG-JoVWIUd>_VjwN1{hj6V1nXy5JxUM@YW23bm6=kjh z+^b;sab>E4u_`fW1zS}jQs4K9qG&WuDMg-5LQ@>aBM=ipj2z(oG&9XMXD^&3>vwSd z8BA7i?Z!0*o0}ZF`wr4H=7kr}vM@W(h38-3t#5q`vnN~lejVl12&U!;4S4ky+V;qU zIfS&4VUHkF6t=<=iWe_k;2YlYjdX<~2MxKtDW1+trmP`a8(Am?+z3%1K1}6#;f3TMnUOSaQrCXy*iGaKy^91?F6px^iT9n z>@yMIUY>h$UJ5aq*Jv*6%zw}J@Z9?Y=FO9=?gxasclNxVqmEbcYvT3u1LVLC>`%36 zU5sLBs?}UoFtg)0rD9QlvV97jW6J_t<@kXbxp?wCrzol~S2M9HtPGCUXrnQvC|3m< z4Mx&xPD5UPu33&EH919`<5@Pn?G9N{pu7O3G-23BO2v&EtGITJL89?=#sf#1{PX|) zpA($Cn?nyjjNNYFwWo+OO`$bm7}9LDP)bq{YP4$&Zd|#>8y|X@nYkJKMxD9Ec`jVI zz~le@3!FWB6)}5=usM%EdkS4UN>Mw6Q7(C&l1YJVO_Ny;Yv-;~o1aJA8;6oQ001BW zNklP6ji9`;!%QiW>mqsCtLJaSvv5-TAl13p>NUZW^tex%MH#2_x&N)ZtF>3gj z!+T^oPa{Y3mZp4Gq^Yj4j17~+XKTM}7USC!V73F7w|>rV{koNaCid-nx%b6^9oT`r z#!Uzu$Hw>lu_Ti=X_}E{DM~?M3W}lFWGK)&VbI?|sqzam%@ULn6gtEAgHgVu>FH^D zz5X!VK?53$CeI5Hia|fZa$K^aAWl;d8i6iL%oG`}@6nG!ge=fj&UAZ*pf$zzMxTDa z%NtHF@R4tSANSmKlsmuSJv5gNbA4l@bVp?g!nRnLUtsCjVf-MV)9KRfbTCoO`HL^o zYPERr{5ejXx)W_H78ee4^w^ywDb#CoXj8+sr}0!155Y~RMI`MmW#f0m`wC&98% zg&^7t*-AZ9r_ROm7g@b}6@;S5a~#VeO%goUB^nH{ltc-EE((0lMM*&#$E62C7wDou z7x`$_yJJ~+t_wyZjKNZhJk4+{8?-?U<5S8&c9%jI<*mqZZ5y=4QW9G!Jl7q$DW#MI ze(;t2i?}U&)hKwYFU*NA+n0f>-CyGD`$fP1>c9P9Y63FMmF48xShRh^xy5EDMI;laZ;GnOE$`t>(zFF#!{fTVKiRqRe*% z=<-dghu5zuR~S~VL@0yiM{^s>SJLdxleH6%RlXo*V#xk3Loqg!{at_iwH?@j9oTEz z(zJ91Ikr!xQ=}+A6{E0^F&(st5F*C_u3uvi3Y0C;CNJyZSrV-U#^fYPij)c|A&Lel z#AVgaJU=xbMKwcCG%SPq`2OGOC=|=;kw6K-JwM1E)&@uGaL#~N!C>D6| zo+JGIXYr(Tp-57|Pz=DUHR;72WG!Iv_z9*Ov;6u`|9_l%@LqzsHuE(P z+t!F8M{h->o9h&|i#<2T;X}u01#R*{gy$!$Z>%G=EFsQwacd2fv{`7+v2k^c_TeS; z)+YUa2gehv$92LWr`eVKe!oYv*}`Z^5@#q^QL6={X@S-md6A)YL6L*w zI>c#?>(WjC#~Pn>d!G`XLqV!^?zm7uRXx zsu~N&rl=j6!)-V4`c3S>#}h5CUb{wPVV*Q8SGL)XWckPm&VKfB*0;9!oz6DX$4?+y zGvL@X>H*Wzq8=vnE?(lfXP@Wlg-g8io!?CAIv69U6$0b9V7nArVp%>SFEBV{aZcd+ z5Tm4`S(c4rwSZBHo62Qajj!B(#wuf~DrhQ-0%;hSUakBaZDZKMq#;~k%3yVNlq+*n&>8~Os9lUf)(GP!l`M7w-*@N9 zl0&eoUa4wsqkS=)>u5#dE;VbY`i-xbJbfvMkal!M5E|yiQT% zc&<;9B-Cnkdi`x|TVdIfI86~rpCijh`CtCQhw$2;rfzwhUE8EqJ5Tg)ykaO%N(NG#1-cN?NEg)UIGMXlCg zyR(I5TL>wMvV=x^idMbBpwq!ga>DKwwgrdpzKa*P*4R>0IIc}mWNaszScfRgDC_!o zM)fM!Rb|yNPzJnL8Qqg4AqawU@xd@CT@KGtfm;v+q^20HGOW@j2H)!ab-*FQn6lUwII9TY7C?%lr2;Bk3(1mQ9Ec=s#|-3 zYd27p5V%j<*nS01yJ4z?p&h6ayC6%WM^IIPlOA68?(NcTS3y*%c#Q*<9zxSZ8l9I6Qgo@>+TZ%~*F zXSl3h2vL5LX^oKv*A1{Nn=Fe#eVA~c_2z0@y=x~~* z2w{jp(`bl8hwkU`U8Wj%wD?+Zz=9 zkXn11wY7EHtrl0#-N0+q$fKCc7cVfqFvp-Dp{yRW^YgS97m18y?c7V;c=i&G>)|)+ zG=moYT%As@OV4ON^zGk>YQ}o^5lg*(M4Tr0XElK3diHpW`_9y1A5qkS_D zR$@r`JD@cISYxihz3n^umHJd-){df8p;x6G8OF6SF}AnkoU5=-i&6!{+#Iq-=}?CX z6qu13Rc()et2%njWmvtIlMpqjWF6Rn9oXy7lvE?-KC{ZrX zF+!2+953)NT970uS(YOuc zW!w+sc|sa(^3m^nKPMKa39O7fFHjW3;Q)8hMkxzv7pz{pM8C7njqO#Ir>5y|ZsMi} zN5gEZ&1#$=q(IpYB2Q`6>t+6?G$V?0vLvTHHG?l~>dhI1Q8ee4aB2Y-g7xbwy!ia{ z%!Ud5ZkKGki{%AmN)nq6wr%6q+jz}sk~l@`jHtJYRDw7Okrag8E@`HD@xmJI!s6$Hxpabj^1+xKZU+GN{(d}E>e3Cgw6DyNf#NDF3Wrbq?}wqs-Y-bh92-dIHs2AsP0 zZmfEp%YX0$c|9s!l|_haIrIz2^OR=2O#E4;;i$5=S4lvXQlng1)oQ{jIcQZTr*seR ztU^`F8i7?6tWHtjy6z~WyVe?MO3+G@ge=QOu1Cl5M%muKssQVDY%&0Rci+x`>Gtn`v5KT`HE^^KO56^VIEsNW7ZD&5QZ%*X?S@M{j#f&0o6hF@xUq+a6#}WajqYp?QA$0l2TGK=hxK31zXdy-Cn;FxnwY3nURvCJ3xL-TnrW0#g(i z1-Z#FWGD$mp;1zhqyv24AAUj=AX1Vv1`I+NM3EyD6ljdmCg~WJ!!)3 zqJ76QYu7GgtzBg%n4-J6hTp1@cQ$D^8wdfmC=j-y-;3z8L9cD1{-Tww#Amt*v=xdZl7qqLmF%P zndHKYm)PFiW@>Sf%bQ)CC!b@<^)ZL0hZIa*l?J8r%zhRSiA(fi0y;0HT}pu@0_ZMl#Y2(8PNi;h#OT0@ugcs)XN z4w@3=%vX5~R%PQjCHAyUs#l0feFt_aSNm;`joAxVlK}N{a5ZY*PsN%5D><XKk%CR~2+Kb&WS~rKR13Rz-du^K$0?RE^0Qjy?s!BD< z_k6aM%F{KYd|y?BE>OHjT=m|A334${!}J%r_w=>gqnfM56M z^?KB_M%W(oLR@2Uv zcDt-0YiUH0k%S31u5S?*E}!}Qv!q7z$RiJPXznnN{qEdERr*$+gzI^*;N8!7Nw_Km&3lfB<33l)@xPhiKE(LW#0M;Z+VRBnPD* zc38IcONvm)@(+a-3dxd!5@}JSM3LrdQvf(3Fu(wq!ED{r>+QSOUb&pbKXR$8y0?3# zhlI=~?sp@*GS4}gRh5-p`PTcr=lybFsJ_EJ37uY_>3oLBay*^08L#u@mwt=gH{Zs5 z&!-ryh0KE%X*%P9M;>RCuVJ)Cl;U&GE7Ey|xvX4rZAZykq+X>0gCHQw3fK0ERSLt9 z(P*?dRtc0U5xXtD$ATar3__;UY0Y-!d0wX)gCMB=u);9JHA?8*Pd-?`^J32@w4TIX zt+HE9f69e^X^{?WLYm5Ip=Pp{z!XdCC#3}!+p8?r3dpMbr)r2*9z_&=cUrGNRZ~ju zYA95JscKy=wF_)fsJUja7Qbkvuw^S{U&Ue-Q(~Jb!K&!STV8w69>YNs0cj~q# zh^qH)0;{D|VKsYj0nAPUPYaO69Y&nSX`III)i63Cj5{ETNj9ER2pmS|1;e8xX>RLT zUQ#NuOcMt_p68P!DOr{i$1#V8d&I`!d5SRf5h7$~=N56;CO0WMwOE@FdxCbm!*rSw zM={!F7^BJa6ctD|);dflGyeV0zQBL@AG|=%)AVDXxl1s)13cQHBnlNyfVMf9oNPA5 zZ?(9-v%@nFJjDO|E5AW}wugT6DzCrtCh>)HJoEhXv{e`Z zYg-$n^Nel~V&|6O?H#VY_BOA-cAX#mkAH~P)*3(XgWpfP7qh!}$Yh!#l9aE0>xlLB zGw7QmjLjL14?#=1t%&nyHnHiPPkroZ9((FhE?zp1&ft4L`vSlED__9$Hu1ipSwGvO zzu6(TIS11*VGuJ(X87%xEJ=vMh?%j_3ZND8{P%r|;Dr}>!@F+=Y$ZoP#u;vRfYFi0fH(pWsD(7($aE6)+xl%XjF^evn-?2>C|Sk)>@>LHQ>tg zyar~KjHUun)pJ$t)qchp+;@UagE;o@N&Ux1pU7~D<-R4LRsAArt~XMN(j8~2P6k&^ za8{)TS3y>>NVmLQgQq2MRiy=+%+-SJS^`y7($CqF%_;mgQQa4rw|g)6-IO)h3J-o=o|3f9j9( ziH|>tGXu0uu^5spCHCXu+bB=S(>dB`gtgdgMz`H!^UMV%qZyrUm&YD`oTDHme&74} z;Pc;&zu9MZIOS+>2uO^}dHEY(=Y8*g1{H)%kH*D!wk^Idr~3nJq8S|xxPJW>&p!7I z>*vnm_XAuq=5ycs@$yHpN19m%la$~7?XU5TZ+;7hKq|lro`2yJJbbZFAX22xkzRl> zIW|f8$OoV1#c#aA>j$@ape1SdI*g767~u%wHb;|v*3N8_3xQGv@Np`@dI7TA#q$GX zW_bGfPauZdxHzJ{vCdnGWLK;cG~CfExAr{G>)C!)s?V0&mDs&1{w##7fte7ZbmlL< z$)hM@GMUt~5S!^kQQj{ra91&172v8w^i{c@>UC+Ym+n8m*W-769P_?YHYNiO6(thGjVCtmp1+ZEIRjve9P4>z)0ag>5Rboq7gDWAH`wPHPI1{@P zJW+wD5@Z#21{Hf{5l)-{t`;)}ov>xUDEBEqT?K)TgRCNKeePDaOORDCR0T~X+=73j zI=8M8xi?aM4K%cRt)B#xPJz^EoW}hbpZV^O@|9N)8BV8k;x42XVJw|in=G4PjX+36 zo+Ws`SKmM#4$mu6NKzK;MxLigPm$-k7DgN6&?ZAWjg-arS#eVhk;;KEcmY_OAqaT* zu}l1kANk{4ISzQa#5KL44|@b~`F&+wL0c!A}@xi%{F*a+GnEC&aBbk^39#2_RaUW*)! zXFXbR7wr<}SxVFik)C2WpRzw|G56OX%kVs}W|P7&q}Pk<*?Sc;Wd-%j!m6!!TnO5m zQOpL_b=}E4&uhR`Un6e0cr;M6W>r1ID2hna6kCG3Ld$pm+(CZFK3I2Rq)ysrIW<^< zE3s%_O%1MsstPD9c%nuLoW_2YHN&#@s#!Wl9JgX{P0*#5Kv%>6y#P~Amf)iVS;$h4 z)ijN;B`Z~Fu_`cCGFc_it5_`ON&$PBx}$t=t}Xywf-6ygtHNAVl!cy~CJ8GkLQ$m# z3*aQnl%6et)v6F)xH{|C_&ln^7somVpzhFjGMGArSf_Cs_e=c94}Ovx*M13|ULbK- zc;cMq2Y=wt@qhh`{|9FeQ5cMlff0UC2$*$l>8!PxXPVGk1DB!m1CXL-KC~`oMQ5o& z1R>HooSh-d8*ZLvNR<-?2AvAhS;imyZ6 zyq3pwFk(KLVW*bqLBfsehrIFnbw2yK?}*UY2=TTwQ#;4_9?}9PBMSpM8-1SM z+~A34CUiW-V0uWVQu55wYPFdU#;nCLxwF_fMEE{uMZgChy}$(p&fO|GL2P=!F<4AG~kSUm>`JAr!)L~ife5V=ewk$!%LF~*b-AFGR8XS_tuM< zdzr@gIcZ*`_v)I0LX|9&VmzMKOp{WIIF3n@q@E!dhN{+PO(t0lptRQY48brA$kn2n4;#UAVG*1fl z+nDkPU}d>ruvTMCF=gKm3SX<@`_Ka`G1}sX0h!4#I>Y1{pZ?UR`O`n~6Rh=mMe52^ zg(zCc+8w+~B{>JmFBmdU37j#+aT^%~>Yb_HV;4g7+%{a4=h=j6A4Af3kj`< zmpcNd=tOO#lWeYU5~z^P&2v2Y*!x&(_v!d8W=A8|JAK+w3u7$(wI1EIh%@KfeER!7 zLDZ6@*_6G#J(8qgrCL!;6oe?>BQ=`6qa%C;?J#1!+rwr#k?)gDhpe?CtbxNx&ddhn zGNvl9JRXnhS%MYA1k~0FRSK`^vR;9o*=$yqv5Dh?{i;Osl{smZa;&seKy5}^>8_d{ zS5@k;SxCCt?|zEAGFT_x2E{w{uM9nDcHl|3^JLQCap^slt-c5{vaJg;@MYuTp}h-ll4Ec9Ak{j1!o0 z{-7zjB~z{oEXAx5DX1OS1+H|fccleG$wbiTYG@LRVkJ&oA1ztcVJvtZ9GtxP}1HaqDYg^iDYnWW4b3=c99Y0hAkz;gl zzylBU`SCyfBm9HE_xG{!7MHJHrDHeP*z6K}9`ht2$x?b7YbfpTrN?YArMuQ6GZvet z+`Ms%G@Y_fpHy^6j8EKF%;)nO1chP9EKQJ777pxn`p(s+qZKG>x7+oY%8a&he)s*L z(9xBetct0sbX^rNtJ0I*ZkIeSCPR!yqdHwVpU>&_dW?s|Iz3svj{70*&5TE^LZf#W ze24bq!0R2@D{*{W&D4lhK(&BUqGEuKX{{;%rI6A?NDnFfVo}ASl#f&a(km9_g{b;5 zMES)c{l&WSLsSqV{b;$Z-gj|4=>;gYyvTYfUyJnWMF@oyssMQ`*sfJSuVpaV{9Az4 z6VEl=bvcdGIF0YT2$fGKO8L+J%pYd6Be{Be&edB3un-7P9(X|^dKM-paEF9?k0;M= zAdJT4Ie9uGj(ku>$r~XHCQIuKV{$yd@Z`(W4BwNqT0Y6)ZGzDOKlsUy^8 zvY54~q`(h+!XUsGi>b?ZndctG z3k9Reknv>1Y(8T=9y2sKquGq{WX8qE9;JWg49bsKz`?#O001BWNkl?nv)SgH>yA?$&?e#=AUrW9#_M{SIw{g1LcX zVB*B>+EBCvD8efr3(z80+p29LOXf-*TaYLB6+f{o&Ndk;v&>f6<88tjEE?ftQ8339 z@6MI3@rCZnl=BT;$zC}S<$A?Pm69w`&Lmv0Rur=d-QB^|f@M5DGw|KUDZh0Zr*Z#B zAR`Xh0zYB1X?FJYYBaY)^h|idNSuzPd&x=KK(fP&ULyEJ;_whaXQ2)S2%=Q zjWm`p3=kA<@tA&#u(n*|g4E7H2a4^r==(S1bb3ETKwN5@l z`1E>x&REM+PdvrtFTa8n@YK`qXO@l$;}%)28BHg&J3Yoq@XBki@yoyRA|L$7vpn|x zi}cn)KKGyeIN!K=je`W*{fN=v059&>ske$d;)KqV#vi*;A4?CO zpx;?xuXqRcs!9>o>{V&@DP3c`(pb65-)dRFz5q}ah$fG^*4SE8T!n$!wQKM zkmC{B2|xb*&+~zgKEd8x^RK@66=tqWyBm_GQ)RtXq z>DW0Rk`P_LjJ~)=eCZ2U z2WJUPz~=fT&YpjO$?dN(cViAEtUq{>nJ4(azy5FWdNErq$!kWR6`bHtZ^;fp-;)N@?D{Sup7 zTRimOL$uGHVYIWu%ddY6DFkQEo@Jh;s>H0p5V<&4A8a7-93>>{ePVU{H2%tJ?3I>+A+@y@jf8%XL-pz6KE-Iywl zwN)bRWzf|WuP>OZlhR}j&#DHg@%vD%WM1mOBYhRSZ_$r%E6uYK98C45Di0 zs`)63e&Hn672pb|Yk-9VYbgsiQ);JNaaNo|2wMZ9LU$!u%r&IeY&8K_6FgOnm1t_R z8Ve;5YsQ_eMHipnDJVOQ)40Dwc^!Oz3v5ce<+Ij{I5?c+sgNYM7z{Xzv=(O_9;$qwY&WGi(ep89h+ZZR1RY4^J9?i~@f`gGbo zqA+G-V;!X6u_qqK8q4=0iS>{aDARe54TAvABbTFhp%I;~ed zR;*X$)?R=gv82bU`m5Q6l}Nr~qN=hvzVFwy2P^ihdj5*p3d5r0mz1)Y34fo&-2v7e z-p6}+d#kCw)gv8C|FNnQS{!4cwJOG*RG@hYSXI!=E!Znjr3U2!Ox5esFTqvGVAX)C z0j%!QhL8uRD&c}I$}8qqISnZU~6ZFCNQmq?i37Q z;UHfEsudRNq%`3YSSmLvwz0-t%|WN=>NHN{_eC6yhqQYi;>p$~*RFnzAOBB(fWQ1# z|2AG65c(2lB%zETIU-3C-gsk=Z@h6E89xZlqIHIKh9C^ER@Y31wXRGtRc!|CGnqX@=IUk1J8Vz%mrL~dyilL)vs`PFrpJjbmNety(1zIBG026 zt+BSY#YOna#RzpQ>1^s!m}As;Xkp z)y%{&49T*rPBRwQMDhGp>6}W~UJ35SeOK)H9dm^5464NHAhCE5C$=|$RMpi?DOP~2 znl;$47O2KZK?$Jl%w)+Wkkw$XxC5}N#N}ckGG78yQZBEr_DQv1u&g-_u$pbw)a;eB zhJ|sdz*t9mKVDJQU5Rjhhl zt+w6oQQ3gJ+juXU%ji9PNo>A{V$c2g1NXeo;~)Bu?)`Zlf9jt18NBhzJ@518%m4JA z_W?+vdoL1wnBV(srO7?-@q0V`STnZ?q4z(9 zoD6Z(F<~!8`Yi&$%%(_VibBU&tj=+0di@UBD96k*qBVy#DU-tqHr=ETvqv5FVkdlhg zbWUy+-OdI_M+4S2`}EfO>ScLmf87qH}uRWVvo6fv94YO4m%^J?%^9bc9cA*yX51WA(6j$_g^EyVVIaMGpv zdou3Xrr`vvbmHKXFxyEt>k34P)iL7u&A+ZmSoN)#g)Td>H$jzHG6k&|tV(ya46YU+ zOGzJ50W7%yQBtZCfz@3B)?L=EFgRgANU)7FWD6AJM5VE^HIS-IP_2X7mciM=K$HdO ztV-roCZor#8K_f$)i|1ccen=Ljf4AXoW^O~-{E^62g51<```TM{ISn}mToua^MCZS z{7--5AK|RV4}H?y5cgVKeDDIpO!L+4x3PLkt_4ySHULrV5r$#I0o>H-r7Sntpa5B3 zAZU95N`i_!a&4K7$IK58dEnxCa$~^rF+wp-GXe!+ZV=9bby#E2CdI~vzz?tp@+5^c zVKkf)36E&L&2yJRzWCY!GwayCet;Lp3=+d*7azi@97l)S`-hCio5Y7lxIDp@=`NuZ zd;5Fz*4G$}2Ym7me3H(YHi_1(cO9lLh~pez%{bT};-u#M`3H!jfT+_(cN92B)amf> z`7Y!61aC59x5wou*(e`d%V>{R7z1q&vsO7Z!=U$-^A zt$=zTDGS&83RG3*p;ajzV+?T|qqVLD^%Z+nFwr^%d&dk`)L;8?+Vwp zni9Peuxhp}n~bie2bZ;1HH$^%ht-5mO}mCw1=a$HEY_f`GA!nUC}M$-Z!Y*;n;wN-;?ST!uAHybt$HGsT}O~bN1gIFq{-2_~# zpVum*xcYgWa5cP}OXf6A<23GrkT&GEUwnn1{+D0m$NubJ<)8fHpX2pP&_b zOvV#DCFyiJJoDUhJpRZz=F#CX{Ub(4V=^bmQRrOY3$GAt=Q-2Sm?-dwyD@o|u(r8QywRn9 zrcV^WXmE=t%9)IJv0_edt3!LE%k9A)@mh;$y~Fys4O;7MQkUUbi_|Hxl8p9tc#nIs&ySERp&XMW_>G|Bgc?;?L zXd%drrN6$85ssVt8QViJ(jw6Wenb!iWhxbvl2~hKwPK9X7^9)AM548>eXW2JXc?3$ zDw7o6R>gO}6au3)X_8>HMwO|;3RpE=;DIGJEC_=o53Xul1<4A$Lli+8<^ zz7x1=<_=dn=L={u3dT3s(wTot%l=&%}YSmlhu8f3ZBP_${wARB2y>7!)neJc|<^vMj+P zFvWYR&O=$NusR1UZMlZXeMQXPIG3voV-30*m3UT}s^<17i**{O@%t-=gDL;&=YEs0 ze~wvx#Q*s(zQs@d(*Md6?|TxPXDBH^&zQ{}o&FY&T^ta*F*Exhf&;*S(->cbfcZSXNbJ&jNa5_e7kKwI7 zyeMXK%SW|*hI>BW{Pxvl;Dvo8HD6(_~6#eU0ni zdJ~~@e5-l?lTYx?w_c+k2Mi7pR9iz!kmo)(ufNU4g>xj*^7JE5a(icw>xUUx_e0FM z0CpdfITAlcCkJ(1z=EkNKvvTTHVAw~St_SlxY=4mnkKcDt`Mv%Frcl&8H*di)09@Lh1R+j!~^%0qx(IHI*tLYJAtc8@V3%-GO!Yj8-LNW zZ0XQovnuw5s_aYow^YEnsllp%Rk2hq?Gja6Ff4&9wP3QA*d(bCssXN418g-xR%P{H ziQJ{B0hW~|s4``{X#g)#JR$(oI7`kI7nN{0VUfb(ghFC)C`9?|aFuN;Y#J8lhsL_Z zl}-$zOgpZK-C1s@0mxtpYn{evoW}3-7)>o-{`zZ7IFH4Hphxa3-+1E+t$rUj9Wa~C zI2>pE)X)ABfAkN1lJ`G!iErE*kx}S!;yA8v;MEPa-6=$IkFQk3GQ=Tl|fG{M)=Vn!?zzn@Qd{n$g>A5lnOXn`j)t+#>ZL9cyL5FZqe(undJ$2 zo)H8dYyA!z8*7A7L=gM*`&~wdN6cpvI_);^`_Qw*oeqQH5jS>s(9ZDC`3oe|T~eJe z8w*~$a-C5&W!>LmYkia3xAq9P9!9qxWiRVNYYin0&ZU^ra-je_Ia)6ms;V$^WvfuJ zR8?QaIxXwB3ePNG`i-(hi!w=-=Bg?z-2_dQC|>6pO47tDO=F`dg3=;F2tk%+|Bn9` zy!Uv=6yY72Ephk$RWP+!7k5lWEwNa4SYHykFFl@=5|bw^3lA)@YRe$KGDTQ`D^PUAFw|HO+gy~Ru`QkP&XOtfTfB$*QoMnkkoiCYmWZ1WF( z=3nzKfB8#%@29^P&y4YXzZOIXK|tjYUZr`$Fdzs5LQi3I2GSv|CN_qa6A0t5+8}|@ z3a)(Z74p%LGyN7p0Kyk!!r@7U&U18@W3@p5?RJO2_p!#Hgv00*q$5)>bDBh0oC0fd z=95EO`3{%tW&YCVAL0M_3!mc;J=|g4NWS!MUP6Weo*$4*=JeY=ZeF{IPI9t&LKK8( zZPD70YeS-QR1n|=k}&j%!hnx|;=6eK(MNgou}A3kJ3Rj6<7}SaB6k|0HSHkeOt(kJ z4{-B@@!=s^mN7UuLUyRJtSLrbU(1$oDWdB@BIx$ua2+i;wo#_=i9Ht9;}m--QUhQgf5lB4r^2Q52EP7t{E) zPKz=xUWCqObe!XfxJ}ojI4KamLK=rO7Sf#US6<~}FJ=-3=uQ`F1c<`HVR*CUdd!WheXPhj`nWG&p~^H0V6`cSfO+jOkp z`u1%eyLf@^8{4e+`dohFGH2JdFD8Ksm~})v9d>E1s5)E(p_I8$t@y2kM2Fm+?*%X;710TNwl^2kwh3- zYp)6qEJa$TSDOr#)`iHtvQ8+NrI0i&e6uS5D$nz3z*LpHX%>cVMg^d%*@ngbKGrN4 zv5NIUaYr9)!R z$Jx9n*=03pmJm1xLSjTr9(a8Dl{ZM7B2<2@tuaO~%_6Mo%n50URST!51Xi-u3b{az z9E~vTh&(q)M8RqxdF|i4$b}~#Bi>wRCK8kvBLfK-j5S123y}%Boeq0Lg;d}xk0j3s zoIocTk+1M&%zTiLPb{6-XQ~}H4^yV8L#JaNk33#W4efXfHym^J{6)5JZgZ~NXK#0( zXFvKu(&2z-KKMa)4iDJ8cn+l$ANarrxqR&k`?qfrw%XwNOw)|_Km9CGyiV9@Lm;ri zk?I^lOsE8TG9#N!@T6e4v&Z4~Z9e;b-^cFJKJ9*o{euIx*48-OKjKrL{xpaCM{M8T zW^MBVs03pq)7&AW7L#Pmn&;sKJ!I-Jv|VzqhqVcwGe{TU3CYZ5cp|LRbwS{l%;K`~ zXJOAEYmi)Nq_Qll^-xus(D!|&(<$9HS=HOsx@~Ni4)7F@uvkCVcI?mA|29VydsK_Vy6Ol;q11ZY6(Gt$z20mu)~oU5 zz6~H&wK=yK=Niv_e7$_#^?27f=1I!}9KM@y_pqGCX`IF)Cdm+;q=dEwLBK4}v7&I= z)8&-?xyjHZNM;x*L4`4)Wpjk@$V`T{n#9wb_fkHkXPiri zSYM!k5R2z>tkuk|X6NQEH(z>{uC+)qVqbvqu`(e|BeasZUX&uE9FzJ8qi~)< zMFAr6n45$k6odh21tu92>Vz}>K0^9TR2$z&jM?UEuic=lB2=K5>Xhz!pPO&J$*XU? z#zW6Mfe>(T^EO^9;$Sx7(f2*cue-9?w!0VnPw}PFUw@8i#1gXV4 z8uIp6zfO8I#>2<+TgZN&$3FRSX1>qng$MAwkkIoOjSrcOh75NHeCw;PAXCG7q?zt1 zGCSkIgxvO?Vta3sxAyzIWgjDd^wZ=)AI~dvPd4{Rg=KCNLhIq2AU}HbYLzux zK4(kp)g4%^yEm5S_??C{<^%20CO`V%s6PvxHL9@g~Up0M)a2qX}LL~#r2 z945=rdCv7KZ)2?C10VY^gPjBBvngxm&SUMEBpK7`cIj+vVkZf5z0CujWHcEQ`Yoo( zyl|qQB?xQq10N?8IG_E41Nv)c*xud6k3IHByF}fH;W+2)BM%Yk2RO5NiFh(ZbvDq^ zIR?`JufIV$pAm(MTx-129la{NtW@Du)@rqCja6M(8A^);SC_S^fKG95qV}<>Q;Npa z^$M%&rm9uwc^>omoFE8Dl7t`#@H~$!TR86vWDUAj?HZ(%_mz`-{Yvlo*Zf@u+}q9a zV%l}TJ$?sn;%#%X*9Ms*Xe>cauJ@}^uZ))=HLjVV>3!7;W-1xlqEjSrYi2Y^H7 z8NM$`jR9v^_atYS^AQCfHaYQR0LJ1>kw(jn1}QPtVw^=u$OdDME?;Hc^I$e5Pp4R` zAQ|!Y%fCk4n&E9qx{+ph^;=}qLrkjiWq{{Nq_lXRAn+sdT%bH3Z4F-FqdbXr8r5wv z6&~B;l-r{@t&I(O{WbOu2jF?^?H{nSeH)z>AS6u^@)A&NZf>%6U z(&?DXZ+s0;!T4}Maxh|eG~w{pEk>geQ54~TAPi}RF(%2#lZ4rH!ol8v?OXfI_hzV6 z@Y+|uMMt%0$(a4Yl-w8`@a1p5L458p{4-A=y64D*j|hEoVF=nGxzTvOhqi_w3JcTe za^iutmdRvNOI)fV%N3xi%G*>$o-3VI)0ngwO*7Jpfoi460WmS(Y&x zkLdL}gsqsHf#O%kBVN{$+y->x2`sis;&bmC2<@tu~wD99bh~j6NX`3EV{aG znl%V30JdPr+!Bb(vaCoS-bdfo?+Rf3ZoQq8nXTij)QN1?iQD(`%2t8a>PFe{9s$+j zVF9QXDX~VX@K|cF0$FxNo3#wQSkhcI7Pksh?f_J3CaVd6R#+(Y_k7=z~*GrhFY zI6!#{Ap!zFEQ}(xLx>O+csL147}f)L$hUlKKBE=Fjucp8q^HQy2mVdoU;P&2y?r`?hi`IR<}hhWqyS%`6-cL%$(Y%ApYiyR`E-ufU`)YaDJ3vAW1gi1 zQAl^KPpjL)Nyl1e1NrDfe8EikhrjvD?A$)Wr4ych@-Z%7y~6h1KA8~=r*lU0X|c?v z>>M57wIY)FoZ)atx7A{I`xd?whv5U5J-=7GG%-?U~l_2lfjV5 z(U9T65w~yN5OZWF;_+tzHw`pFTHUM5w=QY%M1ZhG$r|SzNmGOeW-cUc0b2>k(?L>y%$* zzc8E4=yWF1D82Paf}<8t=5n-Jb8g#|f}&wXa5BXA=Q2>Y}PU8Qmr)rR}<)n`q^s$R5MVkj20(@uIe&bUSB@$;?=I4n&mTgLffKs zwFJ-7XYE#ds*gt;@2-z`=jT1?Xcf47*YO@M#P{+g@m_wpiT6OK3#smTACup^`Cl^H zyXSqTZs(r&0ocy&T^xHez4v_v=HE>jkMKQwuHGHL!;VK@UZ1^g8$ns1*$Z$^l9oc` zip@~IkI|0E7kDzjT7e&gW#MH1K|;^w2U# zSwT+*%#_0_O_C;rUchvo(hU>`p2OgC{VT6>@qtH}dpU!)B#2v(2Ux9=F0o{`(OM`q-yi@dY|!wn~aZM zrQPb&2|8SUa~I+F31fjxhXmTOwbq6F0EMI1*wqL)3 z=ZEafW^6_sg!K`Lz_^5IKEzX!?VGphb$fJMXSi}>pK)fmax-OS1*6FflMVRT2Oj2u z#~uNHLS{GEIJ3sle22gO*ZwR&`B(lrw|Ah`-oOPuN3$VH`uMbw$|K3g7%u@9z_|iK zl}@VCQ90-88HP=(g-Uo{%`U9#7nbF2X0ur-UYAHGYtztLm*v3eLhps3U?>r_xoNY; zp%aeLXi%h5OYPVF5Wh2ODV!;`md?kq9J~7FjqBOg)3@xu>zQyEK|)=-HE|k23-|kt8rr!00zBkXDNPAq>8LG zWb=erg#^yW8)s-KIcIYoO{YBG4v|(63LhmTNQDXnvn;_Oa00X~oV^j?2LWlCU?YWd z@Yc6p<3peNBzfE=*ODmkQ4XZ=aJ~d-k;37eL0C(kXNB0F!b_>uim`5&xD}&kKI@wk zZudNPlNb2AKlQ8ZiHN`Slm9(O^AXyIR)3AuDxUh-NBP=6`_~*y4oT9Sjs6m0Mai_;Y0@r@)D@aom?ASPej_a>qCG;XfKVUSSV3bBGN$3UK z91fXeIajw2**P3=ARI@dL;Bqg51ilPGoO8d&0Y&X8Ihql7#xzwb*#<#AAj<{;bYH# zj(_h5evGM>NZCaO0oLRwmE)-Z>_W(1c}*E(YWoGH6rE0o*=&ZjmNZRk09M&=R1B05 zg4t|Vr~Rz8bUK}yHLENaDn=>{!#agn6@FGqk*66BTLbtCv{n08tl9k%cYmet0^__l zzUf}T)3*b~HG$Qt@cp(1epAcRUTr ztrgPqbN<8+{V?g^Hd<*m`fU!zlEd6#qMV1%USR)VhkyHppXRl*Cy(QdcN^9&)VHCdJZEXxX0(lkv8 zf}oz6*krG&8HCQc`njr7I7$_+^3`?~N-4rHo3p^EIFO z-fn`cEY#h=Q!^jB(su`Hz0L+U8(aYln&~lDwX;YA9%HTS2~1V3vuXgZW0Lg-cja7B zpQ{2_OTcPn=HN*zl{*f)466)Q13(>Pw2p5tP7HV0y2E)z++m6Fe5Xdm7F098tN>3bjFV_>FnNlUg`iz2MVc23NUPOCX-n?GG@la004X0; zj`usmhRMMf2Xdfi_>({SLzwX)o81mso-#~)#x6uiiIZ^i_6?-cgrUdy=sN$)PyTuS;$Qna z943zOEJgVNe&ErLAT2$oDvO2+)Feq#+B29EKoy{;vg#5c(MR;%~C%1LwHc*f@2}7PVsF3RChpb z?j8Ey-7C4frfPL|;A$%B&PTt4%B)TYu5357S0}DF(}t^}cB(Ytg7I1wwXe*zE5TKz z!Ls%CLTlwH(uT);uT~kYW1y=!LvR6}PGYTAx9=sIpRB_*fV?<9u({GGE`Cxv@E9`& zHP~7{?kR_L8mG~WJj)5gxMZ*l(pMN$Oz&5oLJ=^Zjftan>7NuXru9cH(3&$?*2WVa z?!N<$|wHJ-y-dv zB{zm3gfspBkG(e!w%j zT50X`4`WDqsEi5vqR_ECP7FE6{?%%Qbs&`oD6f(Qs46n@JjXdlnx%ise+3_X``a~? zaMxP>=x=P-f8ZkB!)0%xZ0AW6Ra%JqzILh%)qSf;exw|PtF>i zZ4A3E!77I~4J>PF4I&dX&5BW$kqUv55{IB}S}d?^m(;F>LSQYRHKGvIMl;e0cm4U_ z&@KdvgCj;o1zRg7?F5lc(1l}V@8Yn&#L74hM9xeKZhy~R%&%D7txw=P-UeU#J#Xa7 z_$+hj$aKU0!JHR;*7I4V1$z_2otO6+@7;)2lF@WRT?tZ=a`VMAxN4urJn{^WdiWMM z?k0TP!_V^An{QxyQqtO%WwXN4uwNa}W|p~Iv9gxNK+{wRTXTMrGG5Jiglzcu-6^+D zCp>I-3uO(}YDJ!vOt(vxQZip?MyjCEHM?WWpI&MCr!W38(zGBmDbvvuB~zqIeXT&J z$<=~y_!rORuD^OcR^Lghat=AmVOvu>#c~O_jP1#krfFFo9FZAInI<>^WtkJd$*t8C zMFzMIs;V#|F+$pKG@>yE6j))Y+KQ^JFqp31;m*!ZHxe;T6j)8F1Xzv4lBcSxff&P! z50&=d0PBC`j&vQzZfYKzhkn#ALvTW_Rsa7rB`YCL1g+x=i0fuuK2=n*+;PZ)n44u; zSFi>kwWewf)vFUm54t`qxM^h&foHh9nST|Pr(?i$47QGgmOHlIgI4!i-0|0SfB*V2 zJ43aM!5+sUE1rclpRvtt8)xiVk8|2i+iCO71jEP}DvIHwp;wYhQ=C#%O^Y@Li6c)H z`FO??F}zR}JVsjD?2xwVox-iLYtG(vU3WP+{$?#fLLCyS$Kx@}<&yDeL{s^M>!xXF z4z42VhGyR4>H_pxX5#}|wIUN4*=mpW-aXoVL1qnPyR@i5|wq- ztuNanq+x3`<;hQaGRDC9n;wRig5}|oET}89#SD>3=Bp*Q+Zg8)vt`4soU!Fb>=YBu>}``4mMimnNYa9=oZylS7el|Hc4V5Sj7Fm_XDa$% zm8CDSQ`a@%RjQcaE`;dLZCRFGJ;RtJA4}~3-Tp%hh^UCJRx8S~eCUM;uhnA6=J?zp zLOzsmbjiqFC?@m`A15B|x;T*E$%$|i6$8a0e8>Waa{@~wV?RPq3~qqcX3*k%n5O4;|&SASV;JUMM?d-K{w`*n2MJPV8U#vfuzr^}5V?5G508^i~ z({|eWCPG*%%L>x8=thA_sj$ui*RpOHjdy5UgK#YvORh>j?|*s@w|wX>^51<2DK+fv{&b#j-7asPqG^MR;lz@Bw;x=x0 z`m@;@kEjk-P+3g9jWSc@BB2}!T5*+Cn$i~M_;8i+pWpm9Tu!#RbLU3(su^u6{e1>a znI}*y9&zKtC`V&1-ux(*QlJ->GiSC~Bu6w=OE%7#HFI{(?66v`P|i`N3Hh0G*fM8% zc!VUFH0$k+G=W_tgpFcy@R21zJ zUC+4pt`@O1V&CoX!k7FD?!IS1R%Dn|VA>X8eDb)l8tDW_hX+ij+uXN*h1=ivHoo<% zKZo7D^E~&{zL>{b$$wAC1E z29w2Dhjsy$@H}YnXz0r+XevC0aQHo8~d+;m3x5g1Q>TGC&B~aiaBkk?X<-vh44R?9D^El25mG# z_}rPI$Z2%LbTq~`Ee}7p%~yZLm-56%oMZB|Ilun?KjG}kZW=Nv&`paFP$UV)Xv~2|Sb5g{OLUTQ zkdC-Ak-Yu=ck;vk@4Idcw!WU_mPN8I|c{PDZq z$Fn~9@$BquGoRm!(U4~eM_1=40n$1!hC~S3wx$q{MAu9b80}8Ta!unDhw~-cSgf|ox;mGw^=K?~>K?p6rj(*vLRkt5KU_~`eIWYh$hZG*Jtgt9ykhHzJWn~Xm zHb9jWAcl}70$`aAo{TX*XJOFSZy)RzfyzXL5&nQJL;I90j>_2v2L^ zw6-p~$gUVZJ%elRgm#Kor|q<@H|HQp6WXT5+E}+Pg!pWWbI>$3MLD9aj`-xKJ&mvV zS6{?57tCi@xbx^TqbEEX`QE=~Yu<8TTFN}<(0X+uO%iY|t!_!2>J&4Cpfwtidu3_W z)MO%rEG@x0prOn%nr6kkt{I zzP-)C;Sp`qV4Xu{d1ubKy?chERn0br*|H(uDri>TnSPw*6f$KbQl_JfypTxgkW#Q* zt^gl0z44|SFt)`BOEKBP=2P7E8TM}ZSnj!MD2o(jCDp3MTGu6=k47VAvl&t;M3S(q zDiWmt4brlmrBt%v(g)to|M9=Pn2R^w%IALRzht^|k%MZ1$P0u@$(64gI4pM)%h^OY ziplHIuynOrkt9hM{*8H7TI+7)VjPti!-B(oVkj_LHb^PSvaIv&dMLC99U>$y#~aoO zpyg*`V>Dn7S%jOn2scXM1X9HClRv0SdFqaf@x~Bh3_CgeD2!pAPp@Ew*BThDSFj8S zi9_RjaIk|b6&_1Q^-35V8bJ~itN>CWd?;iHBL?M)2wDTcGByI#0H&K?G1K?em(J2z0728rYySoM7-1V#JxL9UfM$+}^fu-=a#+=Qo1u;SRd z?~CxfcAenX&vnG(KvtdFGz2pz*4G7oB+lUa?6$j;p{naYfwDGp08iU#`^Vmdge*(3 z#^=Pexk#zAe2JaHK|Nl>J}@ZwU$X)&{mdADU<+hTC7XZ!k~(j{dUY> zAMEkJea9Pk?fVvtvu);fN;_6y=OoFJ!a9szArnd47+(Ay75IE87hua0R3~D(xAh=3c=&Fchzb?~tVE~6s4#cVBCSPYaKa!-uxKPn zpveGF)`JvMc(4+pgDXP002dW3YXWGk&wJ1s&Naq(n2JEPJ~w{uf{N8CSQ}s!mWMz! zTsJ{I?2^;r7-YF){jSTC8$uKt^KNOdU!NBjPkiX>Xx#^NhoRtOp}(j`u?|z4a}ghA zxXz$2uJh`_zpR|s-jYFG^wNxe^3%@;4wE|;LBe0d=h&fjX4WO zBDDe2(%g767oYz;K78jdaMt8h<}$8!Brc;7HCuK9&XO9)(hOZ`QkSq24kdGhGnCFT zHWG^@v(TCrljj_!in~ZTzP7LCOSm`o=)3<+S!p{mf68+ps0{1vwp1xiT@1V^72_~@1d3c9@#dUA}?7kmZWJ)p5~a=bQ#19@}!Pd zN2Fv@M!4}6X)eWv>dEW$cjz4 zuzn0EU8iKl^m5^%awP`qF)yYEDlt^82H@oaY`O5HG2^Na56Xe9L8ph{1it2xa3PW2 z-(ov8#(|7*B`nGrob`YuMS^rH0G8;!Q0PEQ1gMG%R+td$P!%q|9;WOu=<<108XZAu zZP^6yit5!s!EzCxLKv`vDKXf_`nCX2&TTFa6{~@L0>@RVwYfOCe@(UO!h1b%4dF|; zxO{?op4B+eVMC>IJwUC&RtH*c4ZKde&QIHEJ8gZ-a-Vafl)sS*DUeEGO+&0w zp%h#=zsq=3KxVMiG_6Kj%l3FgEi@ON@EGi8Jcp~l^m=x4iLjQLN+1{1jY3;Tp7`Wu zqXe~cm`t)-E}4$Tq(-9`4I`P*W;u(=h&!?T#g$9^wXK;I3OC*1YAZ2q3%RD%9xxpK zd)HXoy`Pxx6BDZenx?@RHMuAcbMNoi`cXZU6uv07*naRIt#RyY9ToXT0F)=w#e^Nxk*0Z^hv)50>*q zSJq}&99am_?eAeI1*iN#GHb|lKYCL(8Ma+@v^`U|#di4o9sB#@li5{-pu%Aw;TAO!po0npkFH$zG3Rspp!YotMXRmxuG?vvW3)s&LsQpe zsR-d7iIlLrGeHQSBPEnWrWV;qq_d=>lEtJ%JnpfWN4}To;s8BganNe2s%5Mkslum0 zu=ss9f^5AK<7lBBnfq8xpe6s#zoF8kG#n5{=x6_`A>fa?|SE-bHg*Agk^?A zQ)W39$W+4Q+!=PZrd+vlg(6RxPD+w|!j&sW6uUbdEf1KK1w|nkWs)+VQa5vCA;}U+ zmKQi-$;*O8)ld`(tQwrN%vVdwEaAiZD?alpz5%s$11{S_H@=k3Fa6RlQ5Gfh5MGOk z;t@`S3?n~-sb^G$@+>7uycI$;2d%S)EK%&w=j2I2y%Ox^73T17_^BWKKdIb=&-#Kd z%{ON-N(NMRPug6YqLH0+s|n`ZT~o0 zUDsrxM2eC*wzVPbqiA(Ynk49ENtR?-BM?ajA_3JRM=9fFj*}9drHpU6g{OS&SMlbT zy^P#J>nwSakv0Ci!=wdOR&rO}a+_XoTQlRpSxl1o!p+Vx&kRNilIet2`|qn9O}aA3 z6kO_1N}^O6{FP*IDOX6TD2lYZX~zWX=wv=D`BLO5ul$++hyVQ>zY(h&&R#gfXT0z^ z-1VUkuzzJqxix2dT5|QCtBl5DY9%}fRZB#ca&~J%V=b#zb9Qf+`z~FkC^M>R#>F!e zN+r>&CEC_Zijr!z0x8)U@6u?CN)+{SPFZ9e9_+KV=gl~`%8Rgd5tB|ZtskM@HVuF9 z&Oab6OY+H>#cYnXmeFX`fr@o*&8=O8bQV8K&r%cx*7`gunI$Z$6?<#^x_p&Kd{u{{7mZa|h#!RkkLb&m@{jR+@w z2xOgV#hRLBo%2J7qtev@R)j1O1BL;r1f7M07-E&hI*W7$iS#O#l}M=&HmplI04%xy z6G800@(n#y(ZN?#uHw9dC>H_CgOPQckQMiF19&=lYJ>k(>-sREi;C3%tXv0M5vXJb zTF%KHoHplC@jGc791Hmkm;3GO0Jg4NZS)O5OSmCq#dS7d>cPX649hNnymT81)(MyJ zDPWzp)3)Ar&+MUF9rA3v2a*UkKp`B)_>fcE7}BJ~2#r(;LMAlAG0HR2qQDkowx${R zjSuHB&wM6-@|xd76eZ1K!3S@+z|nHa?XwxTFAmrrZ81w7ZJI(-_=rN&BD6-e0;MEv zZE)6-tCWLGaE6>jND^l#w8RJy!k6`FTd(qHqrvJfp9efpMCce+gpjV`b+3CZ-|_Fh z8Qa!u?QHQ)-~9D_`DebEJ8r*=M}O=df`m*aT)uP9T!R!~wMK{*mA4qHaJ8kB z7R?wpE>Y=(kyOZXn}wNk;gddz_V@poE3*afRg%B_$cHeQVwog}qCgo#QX7gqr>YzO z*mxyGOaG%O$rN?1(b7;P(=fBUV+7QYm>hqN-{f z2}PE(Y&3Pf#3I<6Y;n(BA7T2ihoMc2bOsDwAw*M-$Bf5g=BpK2z>#a1j7DT>$z8X7 zgfIQ3@4!rUaiK1ta}L)u{LO8*v1%K%wJ2i|LXu@^utrFNXI0yQiBb}6G+CCisumRa zD2(7s(AuJH1*FssXyc7Q3+eB^Bn5|y1!IbxGcu<|;=IYiv)+2nx5Mc-<4M8i0fe>9BF@}Vk^WIrQH7h39JAzXJ zLE#EvyemT+Ss#d%%*5E2E57n#)StnW5o!T^KP}0`n94aso?|T-XUX!ER%=w^N0bTcP-%)vy!xWG?v#yKrX_}%Vj*InE9)Z$ zKZIl0ELsFalgyY{t+l3Z7Mw3jcK3EUnAa@p3YCv|!Hd6;SN`8W#qN9F&-1pP#?2RR z;J(AFw5_+)QBp9OOt|l!duf`Mw$X?r<^1{c-2TBkkfHpHvvi5!GEpe!$byr7)z)m4 zBj#5wvpqh8EJiFx6UG;AC7)bCD_?v&6%HdM-}Y_a)|JO;+7=&u znotNoIlHg z`-86Gjo9A{d$JnlyRUW8g?k zaCvtED@1tiFh?MROe#Y>Sai4X;}CVN?R*D|B4;*RpcElT zCjP+Fv|6BKinf+C%Mhx@NQtqIl!PN|dCrUeIkHS>##^|opq?*D^AuBCav{i*gw=9^ zm4I;wDM^Gx2}u>amd4{Ti-jLh&@@eV^94GW@nQI{EK9UD)UNHoVt9;Fs`F(kiUOI8 zNyWmeTnVgJE4Fuc8Q+-j^w0bZ{_MA2!^hoqnKTo~RFJ1BRnsz?9Wfe>Nz;_^c+6-k z;p)K=^ZA@KEm+KsxOC5boZs7FwX7&dW3FD^Crwg{>4aQJX0tiVtB0H`CoE=$pLzXn z@Wb;jO>>Rz{NvO&A$i*9}Uk&hDUTnl8aT<~c>xE=dx9 zN3?xy$yi&^mq^OG#Q%fC1JWezO6HVBiEdi*EXUdw>sqo5l!SJ*phyMMHDpPGZg1l^ ze))&^jo17%bGQvX0|5f0lX zSlw@grMrOzU_x}NQ@nA;U4-*KOG1cV02zb~W2n#{D}t2k;mPM?#r!M}S3cEUbe0Se zv@9O7yvzJx?)vp;eA>-BnA-rU4)*%D+f8Ac2Pcj})X9CJ-_pTT>%;)6!rY2}d+2u# z|BG@Bv<7fxWd~XP6tu$)$fAR)9xB(0N?sG9LSM9E5JUA!tbeta$wTedzo$I&G)zZ=;R#jFnVqXUM{+!RQp; zv=zibMNW91ECFejVwXNC-Xt3GF_$hM@rKvGh9CdsSK;!MX*t2IR)~3vRT60}nUvt5 zSyet{r6fj%o2^R7MBrzj=B4u`xs58IFV2_Eyg(J%L;3tS=9)YlH>(aWmI*GBn2||Yk1S!ewUZN z^5@{}BXPwPktAe7pxYLaWSrTZG8s>(wMJ!8!RkGwB4jEhF~)XQ2XUlf)ig-qLTMUb z&SqSWx;lboS$6QbHQnmqHP3UFizP}3@-)LaNh(sLlC(l0a#*$onJAwdCMwcwgl#U9 z)JMGOmH!w2?<;ZUxdN&yzCRTIX23EH+nW|G~VGt^B@(^lRn)|NOUNK=P#Gg@0QHkbL+ zKfHr?zw-?|;xSLv;X6Z3iGJUP`-7@$DOsIL z<@$Zr6P4Y%>o#;M))1sNC%L&EAt~IHdzkX-i42b?yCMEjof?>)5pMi`PkV6DSefGZhPNfA}7aDD|iArUgFRUyEG7t7RQ`E3;=&D6%)~M_1=|bB(RhRs z3aq!f7*7jsyX`iLLSa&cNdy!ndev}nIOkzEZjq>rYH<&VDtZ5Hckn4M`C=ab>=%$u zc1e>QDKli6kUPmyJws)R@BW_u$fz7sw+-6aP-igwSPl1E8w^&fFsd*K_57R=Xx);g zkY*XJUV^AG&e#4MkH-k-?SYac>86<1mE;LVYyTKY>PN_9DAI!Y{HQZ+&65erh1|NL zV6pNB*`u_fRD#;hIlAp#eCOA`h|l}df6d1{^?4lG3AL)3yA?J`Dbf+G)?`YNW*?mw z-rq%g&`Iv@*#8^bhMi&^vWUwApc?GD76uvukH2pp_dbgETRBj`Wax{>$@m!b`8PqU z3At4#0bGPC|D3Wz!5*e!SS`XgDFS1N4W61InL+XIbRt2RKYrJr|rSDM1o8eZKct!#cE$V zr)eszv8crVaBECM)2=9rF-}Qd`UBs`(R_|kf;K2BCgjsdDYOqO{!_h<{Sv$Ml&HtRx-(Tgb+ ziXVIVPw)v({-;Ql`cxGMX<7o7^lZk<-~2Yd>4neYliWETmhLg#JqII2-WrT-_{i;d zuzTSGiI7<1m>teJzq?DK5{|C!)3lPU>6i;QOqk8?V|V8qzx{`Q%K67Wp3ndCuO_>2 z6DBK3vK*oP=XiK{NS+t`{HuO}$!N-awPZBi0_VXJd>&OSuskfx97Cpgo_C**l#0b- z8EXFd^B!#;;^!#BzTkneEK6{#L02>m6+(1yC8Z3b0KMwCSS(O!LIxNNwbdw<;9SMt zR>80T;*as}KYk}q`e&cYEsuX3b!~8JOlunQH0eTy50w^@+=sWP^>z%h+%@`7I4D9^ z1g_XN?`)7Bg^~_q zYHFAB`rmmQMvg)HQQGmwZj4VdACJeKf@GXG#at{FEEWr#bKS_mrfFEMR^14=n3x^I zTzQ_eT6zzqwr#s@Ly#CMUYpRCrYXziva5NQ=Q-o?n4_a3oPam{_uodhmLlXm6-9j7$@>b0`4@N1A)X%~$;N&v-yd z6I!EbwPrLLW36GaSahJ7=eakmHhr~)_}*jKFwgVu^YtEQg0d_*Iyz!^cb96pLTl}F z%i1=mm>H{8MOl`eNRlK;7s55hgb{`b4vA){y4JFv z+W|~Ph%ynh29UM6E#_F!_$r_A`#X8p~)C<u=;8 zKl@`8J6FliY_WG{hjd(WpmO8papAL8-C!2ev$hssM-Z8&AQO% zL!mvOO@n(7V0AsCukLS8F(A1i0Ih8o8{1;&FKq0b0~jh{17LyA+Z^bC)r^Z0E4)!@wX9Lf z`!>#IN9^qEP}eo!6{9pwu|fTdqYV8vL7L{_vjr)AnD6Y_vwY+uAL%~p2u|@a^E@Z| zVa3OiQgU!`Kv5J3A=uj5Vm6z3pvw}>Dky7dN}8l#eE4vsHCZtM;Ha)pA|X>PBV|aW z=8xX-I?g@%8I++gw^aW?MiFkp)h1A#2wnGklRAD}Y$rkKu~6c%<)}E(fmRP-Ub*V_ z9T=Ie1JycA`Q!REaO+StfG7sbYulX#l*%ld@Axa?J_ zm}3=_+)aQi6X0rn>Hy27AdL5*I)>RH?&qyb*I`N#0BQhEYGc_7uS%%^SuOyVA}EUf z{K)vc0zWz+=3!a-FyS#*&|qA;rerZtvgjbItBvUThdfoVPTOgFaP7j`g0KF<&*ZyxYFVL3$P!7lT2R-DSHJRC8RZ2+YN|@(vdo9Kl=AimK{eXjJ4;>H zKCCAdO;sZiw6!0-X0-O{1kp~Qs=A`UvBXQ$G~ou{7cY*!Pcii6^NNBYv$Y*WMT>_R z?%Lko3ib^x}-s{twe;J~XQ2 z`rS^*%-^gqMqylF^sf0X_s-U18j}Xe&-ql)Dlm$)WbEAr)Sj#hu(B;)G z%W_$5Uh`iJnzg&lf)}!`-cbY?d@@N zbcCM!ysfBcsZ>!{bAK+g6zdwwvcy&rZ49cIaB$@iC$I48SG<(3|E^cDFlW3E*F)%= z+ACP@+FA{ne_^rFN62Rgpfv<2-7nj&&z;!c*)Z4` z4vZkBaZW>+4<}rLz{3?}4B~b~O;2s4IprVTc+Exp}pO5MfAi_ZNrlcM^fwh9^5Dx{DL8yLffC&QiMv zZ#%lO*KbjJsk#0)$C>0 zeN2{p<8>di_ssOVk2&{=kG$?Xm7g^p_J0wEu<-R z$hnD$)8KzlM)fI%t8A!;7@gQ-XbkAWRWW3?SS%=t0`TUc5xN$O1!eHBs;Y`KPf4x! zkCIOD<3I5eeAoAVzgO0BMN;^1oKgPAtrZ}PF)#h)U*X@r;8Xd$?I&Yh zw{1HZ5$P4B*=!b+xI9=K^hxbeC2X38>0}$FV(7F_{Eu$$bqMh~N9UR^rR?(AthG$1 zQ>vuR+^DaDm5SGx0BRn?mNzH_e2z1!Q{W3^h*wmOV>tjKbO6)@czlP7}1 zwn6JQSo}OR+5?9O!~YKstk#2tYs+r9*U9@_tM{6!*k*r}vIgP6A#@!Fu>LXD1dZW7 zn{c(MX1M@YL^IEzULnxx_P$u;466JA|u{WF8ePyk!O=B%lWs%LSM^ z>3k2)?(;fJ<7d(R>{E=V9OuVZ* zNe)gSU4yeNO{1x_<)Erj#h9jDk(#6{&Kp&y=%OA$sk2WA>wSWHpRgW7gE0{sqH-UM zLkB-rhBgAm7^~W8%nDmho_74uw4nE=0kA|Ya zjn8v+Rx@u?vb?~y2AP};5YAdGj+edcWe6!bbM_3g*{sVSi=ScqoT8$a=XofdlaOUu z=W7-7tE6nm^P*E3 zKD@?08{3cV<4)doeBG^q+=<)c?Xuf%GX~^vgMDDYV%^%tlMI&EY!132$;ZplL{BMe zMF&?yfVyU%-UO@wS8do9``Uh=*yn6e*dkzcIaoRXRfBWQ+H#+B6cuK_Cs(mEzt#v9-GCh}s! zf!3s{LV{l%t#@u|60e6A;NZ zx-opqtKZD8|JR@3vp(mum>)W3i;R1h_t6x)+jtLc67{-Fn0d@dG5aZ?r=?cRZ}=f6Gd0G z#d^yP@aMu|kxF5V<+on*i+t0wKbwQqlDdA#8I3-$O+%-04IsvCY=>T{I(gf*fvrnW zX8lIjJ(t_;y9N)fy}qH26~j^|9mGK8T7QD>J+Do}ysKWdqARQ{0yK$Z5Or*M2w1IG zr)&hPwui00&#PB9?CYEW8|@nG8esM6RRAkj<6I4-^d)bi;umEj<&`U8024xK0k9Gf zi3ceEW#V^pVJ;HkN7y9(p@sFIYo}b%Gm}p`_Z?RF+8N9WQs-N6u7n`cQ6tKuX*k3 zs2g9rSl~J}B#r=#s#6T{ZEtV0SS&hc_0`JX?BfmHhLO)PXDHs_V;)v~Y@F;(Dgcy0 zONX)v$|#mL;f0^`l~|cDKBpL6aBSbT#nHh5w_Ul7$KCiie(WtTr`Vn#l7!!W>sxs0 zQ=h^g{qZ|tkbl)DqdS~7yy_Qz!H<}1Tk>&+)qM@YXiG6H$Q;!u52t>=s3ayy;s+VD zx+{R4=Q+#elIe81rX1E)L(??fb2UvvSrlD4o%p;ybZFPWS8L5}x82q$hVdH6lC;|| zo>y%ee}8d4PgrY9B1cG3fo)i=G(tVZLWI|9C&Sgr;lgWezZP%}VXN<7SF8GM>+akq zJtrLs4EGBFGVDJIum&Ktxh*O~Jw$CPSDSVI0%Q$A%BMmN`o!9{ZaxI8*29$3{qhj9 z;y(WQ!h7f-Yg56h16)-Bu=JX8<>4ykUHMp_h$@$`KAfkVhpWVcmW!~J4t~9LVZjh4 zOv0do0pG+jHlfNwU@758uviGSk$UB-Be9Kh7OQ;sJH|)v3`ki6FV`p6({DO$r|q;| zyE*GfRL*R6h;&On{rS)4^}q9Wj8H6_iX6*CC5*Cyqk{@2%8e{(hIk6d^z+65Dw7r>O+H<1z1k_aF0;&wU9}DVzkO4N0!B%6}>OZyDTQs@V2maUC5aGTY19FPopW6dTQnSvAeE;5xsD}vV(yj;02oJxwrz`X z0lZr6Q*C^Bf--Y__(Ole`A0pK!%GjHU&0S62kV;f6qh^5>HCMO)JczV&3y=0bkG=zA3vEZr$sJz!M`OcynaE}^0Ws}SGAAbgAufkh~ZNIhK1RNxE< z<9v>lSqCfczA*GN8|J-<4sc`#R-U%pn#4uVPRHa+hj0Vxio)auR7LfwGwBfhHFTm) z!||@ucG~`NHz$2PIVrHV=2=gFJb(VaKjkkk9RQZ?G-tA0QZ+5Jti;-iJOS-S)OFQ` z^{T1@V6m8WHRYNnKtbz=-Wz9WR>AbsIT95-laM%TSuJalRIaH{)>@jjMo9nNSB{EK zk&230y!rbum`@&$p|r(fu~zW8Q?=?AR6-&oxl|l2EB5cb#L?jadpBHU)znBNPPhKM zOiB_X&{fTMz3gTD=#RXdbW%_RXZqRFuxw^sPLgvDbc+N=s>Eo6ab766;ld5vd-)!$ z@lXN+qb=`z+aLJRkC_kOjnkZ3*J$fUbf4Kf!~Xt0iBuTvK?S^eWvmHS7|sv6(iYve zjLQ*;v^ZmN#;`S=uzz^KxpU{bQJzXE$WrRM;@r7&zRyy*!Vi7tNR%WCiehaXzw*i-=4-#@CrQ%r z-};}yN89dKYg-p|+%@{w|L?Y)1Wp@p<=pXg>s*(5?NfOAJ~Lc*4nvq6eSJS%D75U0 zDaSg1{e&;19Hw@2vd}tT7qGFh-}g1n(K!5M{nU1o7%W3$Md%Z>R)!+YBGeI-Xd`Kj z2sH-%dYsJKBrsZHb)5TUr)3C13S5|5@5(Tk`#&aU9M)KzaX4eK#^AK~baA@xcZ2=C z!$X+c@GC0h#mBw~MQh99#C1R#;mOefE1eSf|FQSxVYa1rUGL`|*0A@ks#B-WIekt~ zbkpf162d4D)QiByM^T1=A|j}uLDUD~8m9}_Czggwca)EwRhF}*7x`QeSd?o zo?9aIN_1<>DF)tS^yiA}hF{Kg&~${UJc*MyiDRR#E3}pv(~@P1yUyIkxBMS}mQy** za_N7MW*JwO3#7`h#?aO^X24`bP&1uQ+1c5lX_}PIitSjUGke@N>a!w9%Cd~Dt*zvj z6~)>yg&3<4Baj=W6MAU4lJ>a{2eE?v5W6e7K+=mVy;21hUy?X_&NA}}5= zrUa+cDF+7!DIGX;xZmI3Pxm^@bIP(z?Qoi=VQ+5_V+@Cfhv~DEQl@nA&{01E&DhX6 zevXj^i+*WRN+go{@G`gUWH{UY#((iYOmSU+HF~5C>{G>&ZTkO*TZtoMjK)$A!ol)z z`}MK3oW{aGv3}g^EDJB}j&EmpE+44@PB1U^V{tsaLLa@L;P$CBVZ(S_XM^K;oI0e8 zf^p~5YRZemr3R^8n1amWOCWQQd6*U;3z4R(kjO%!3WX{(ve2j^LlzmT$iu5Z6%%Ap zqKYZ1oFdB-RTjvyK$SVN%u!_)UJ6wzWGPXlK!%qp`*W*!9XY7M^{IHx>H3|YruXNN z+WPme970*7vIuFA(uR8#?xi&0o*wsdYxAy8X@<{8M&W!A&r3pY%1y89{V<%wN&F@Z zAsk)TU~Na!RP4+O?moN28$RjPD6>QgL8mm8lvHg;rgL)b-QFV@s;bHZl2An!H9*l! zG^YGwRiJYY)0t$?5YvIH)oN6Y7}v)txgoO^#qJTj#SDlD0AwhJkAm=cy;4d{+okkZ z-L_1&XI$Ldxm<78dayMVp7ZuG8lbZ5yhpN;EncuJU`^!>#@K#FH=v?^u2>6EJFQXsJ2Ja^Ts~%K&V3ojB0G}i9Gz3?2 z6QByI%MqX*f?r2$n7m}I>YQ^46lGbK0Kl-1T?9#4o~7}jt|u->eGv4|j0mD4ixsUGB5)fv zCXOI0Rv1QxD>7eEKrfUx3az^qH7R)S!w+$|e}HQYx$>28);j*;U;K;w)KC2fRGuO8 zoT_ce%K|3_LP@Horn4P+k+gMtAN#SNAj=eg z2!(=BL6(kXqwvV&^p5; zhqr#;-=w&%a{OZ}!lkZ5su+Ds5<$q+1fg)`c82R2tV#GPG~Z1}4?hT_v)#;CL`*|H zPCWSym!lX+4BpIm>Red8HZI&au_;pWa(H(fV%R$`Jk5plnlEATEoPiQzf>bhw$~#0 zO-9M<811ar?sXmORRA;rZ>J*%YWwUzV1!DdV7mvR??Y{Z~c~U>U)K#Hi zhx#Y!4V8iFYgp4I?YY^#%&Ba62-pTN}`OEq|n zz|=a38iK1)8aMv=;6@DACMD{t{Oi2!pZyCD;@Xx{YwE=UAtX{r7W+#Ckn0RtD4erYm2Xfz zoldC_4_PjjKI0%9xlqVV&^b$8H%OuR`fvDpCes;hw?tYu0wpEhi1V;BzU7SdJ~>)v zm{5i3Q=S$n9GUXh;GaniZRe08GFv%aXPC@p92^`3&6~zKP)a7xu&VOK3vJV&l_t}n z&tvD;Tf9J>&}BsD8K$-@D{tvAnN5R3ygzPLRl(FW4=h;8YPAUZKZTHvx@yr@aa%Fx zzyHS{|LFZd++w6>%JC_}qjP?}*f2&~la_@aS>J9`x{&p>U)XMQ%5d=SCenrde4hgB zuP;uIPZ9Q>QT+paJ%u<-6OI^|sJ~KfFh5{%G@}$@N)rY>lgj#ZT+%xgBI%=4+3T>@ zHCSF_RR+z~1X)f|#iSoAijn?GmYGj8mI_r$f9x`(2TKvsg;5I@ULk#{hN;3M8m#dC z!_@1pJX__pSLP^lCC9+(SS{8%xZ22K`Oi6Our{R#PYA4&IEiuCkdBHB%WAcvYg=%R z^LJc8YL!xmF-;V8OhX1Kf`X{G@eblL0jQz49iR(3qga6!y`3Us6~)z2Hw7es6_=w< zD_&2uY5+zlN+6{YhafFpQ#xMPQI-?_%YXlG$XxTbx4n(G{@`1Y(wkv+odG=a;+&%> z3uGqACOIqDreZ9iGdI0UGm3ncMDD{>Yiv1F*EL!0 z+xAE)nM|huESJml9-?!-wVpN*;ScASGK}{}DaC9yOB$?bsSv|C-xNEF)t&28j4>5C zpU+2zuaTK5iXycts%y_s#g;|8ySr&y6~0epStii!*+h+Tmdls-c>iM$eb~R}zfp0+ zY-Z%DQu1#=^&DZigvS>{h6_9!BLc;>&Sb5ZbvY56H%IQM2VX~+tKqKe$J)qj^=BW> z^(>q}hCh`Xyq`gOaKK`T(4u9;UI_wAt)z+Ms7i`Y~!0N7zeXEjI_roMyYWuZy? z$kZ6x4VpwpO%?%Y!A33Cb->k-(dzYAc90J2ftDNsukdv_5+?}jBu-)!{=pd;CPSe# zOY6`|BSlM9*9fU0RQg2_6H{yv3`CR4p`&{gnOo-{@-bEBQ%nA#8nsf z;{nMuG^N@gv0YL76M;%>nu`uV3C&v4u^J1VT<*U4Fzn8%p5&9eA8wCQura)mPjCnboE zTsEveBH#WGJv_iVCTAktFjY4AUkulcHCF3-tQ&zW7Z|RaP7lKIDZ+Sh$AGLJti=Tv zFTiWCQbN$5OE?#t0$g}EKHnBogDxPasLP6nOiyqbxH~6D`6qAl)YEEG1Um%Qz*PiP z#)B+p@b1aRgB)u}8+!2M62^?CsQo&HL;IcaX~G^*=>Vvr{wjhn8Bmf4&7K*g_tpT_ zrk5N}Lj~nP=r0D0o(ER2No%#P$J$s(Fk}-4>A;b|J>2_YQN}QWCo@V&^er?LEnW^V zyY)WDslCvxMR(&(*5WW*-10t?>CHD1j&bhO?!4uFrgu(mc^`mo`IcMWM{nKw{hpn> z_4_^9dis|4DW{iid7pFn&A*?89&YPdouVkIn+9Q>Pw8YGPWElYBI6WUkH`?k6yM?D zA?2h8QSkx1oX-=Z6px{lLaV+yE$V(2%fr;5IodMB^9;cgkn~ki2NVHEWM`rvJ8Fhv zx-r^EL~s@>AZOEEq=JKL$)A1mpYx*mETe5Z-#B@D+p|~>^0J_9E3~zkwj$R7tY}Hs zRAiHqZaGKNQK|yhIb>Ggq{BEvmgiKJZ+5+`JfNzV!9jiEe+HCNC@C?{A(X;egA4Z| zrt%_#m*7%J~<-h-{4xpLC8RyJsqoEf}AH=CrZat<$a zXH9c823O9R0G!l-sT#0W323Qs{r1;r1as?FDq6S#$!k+kwOiu z3_OS#dPBvOm@x(${)nA!%~;OoNU4!hQxuA(@j9l-WWtsGD{PeonQ+{D*Il@_p_rAN zK7E?q-CZWrDM~7uW`P!(^XKkh>(p(0-&@~`6@pfP($Jd91HRV((Gyz%A)g8OLyCbG+SU?a{!qHP}*dKBTf@6BpR}%W~j#7%Q>B!0)*VW7>IoDnx80-2e z!Vyz-6ijUzXEf%Q##Mx2I%JyCI+0iyv0?n^w)Dps0jZk+V1l$wOo2uQ%njaj>c|pV ztZ+^tBAANc#)b#92!K&~rX`uz4X!g*u?c?yDTO!bTmx1SABmxXXf*l^FJGk@dQ%LT zE9Vqo0;r1MD%!QmaD6Jw_lPKo+l30-1flzgjlu)2HHPZwHW5sPx4H>%rPolrJ_J;b zqp89GtcXtY8$cDTfvbTIOKkpw;sjrv#7T_92@sip);F#eMJy?gS!w7=PvShJX^yZUJq_LPDoJ=MO$VEEk7t}0TEaXHDxLfz_Il#SUH_g6gkUfg>woiHCiiHs|B@XMdkni zAOJ~3K~%GyDW`6Er>n!f*F)J#QfQZCfKkwqv!d={iR-@dZ;=RZ-Us zWm&Sly`55k=6=E04XtCYvb2V2_DO2^>9z53+j6orgswFKwljhn(+j% zgtAZ$3i?+N7vgf=|MC0Of`MP#wk0S7s&u!$8OxLD(toeY2~0WHx3tT-LE{&50d zxe*SUbXlRYaM+JV$N_*F%x@eY0IIl3xzVyvVgR5x`V!7tRg9_yU0(zc{KAd`s?E!= zo=S}1YA_uFt?(_3;A+rMwf~BoAgq%(iBV)(FqRB|ph)Y1laLyr93ZLN1{)rRks%U7 zBw_hbY%RLp3LyfdI3F3MnEG;#1iT{XGRCl2EK-`PswyVIU=uw1R1^hDW-Jzq1n_{A z9*hi7Y@Z{g92sFo@D&-C$d;wba74Ja2CWs->4fE?WqW&@#bWN+xW;n%V4tu3+CRa$ zyYApMuX!CZ(>QApu?o@^U=+G(kc%ZafkyF$-};$6_{hVonwk!Wb)cn6plqlSi>c07 zOb{c2+hO5BWC4XxfgLQ!GL=%eG0ho`MU_(C@*?QcB7->8vU!bN4o(DCGD~T}>2#XF zYZTot7K`*9nT6hjooQ*>in1)Q0<7(*n^j8vdcE8dYaLn(+P3=0{Q!K3aRZTi&r5A& ztZoFd7^e#(;u$eio7gEhB6erE{c!xILDt}`;lg@d*-;ef24nsdUV9b6ixASYR$)1& z2_x_#058vA#bZ0LF8#uA0oX+#B}JHq<#-sU)_|1-XZ;v%2(DaUvjR0AUM}{k8PNAp zq$G&cl2{v;{e0Aujlk0wP%#>hKxzQ41U;w<01MHl0(*e94x-kzSdJmM>OHW+IR*er zrm4S%A-FnWuukG6ZXC`S+Nwqifx*z$70z_z<&4H&qqYtyBo>%VCMm5K*`b*J0bd!o zHQgSi;{ax}SrAQ&1Qh%qMZK3&Y9Nf)Zp9vVk%5ZosMu;nW;!u1LWq>!ir{IOW{l$a zsJ$At`00&0y|CNsthxkjR;v}KPoE*rMM$e@y3UeW!B>9GAHfLCJ@>r|>oVU0PRR5O z5JKTJWXfyCY~7(cxc$sox^`&n=}3nlT-lMB-V-a=D~!JGQpA zI6PQT6a~)t{Z5@a<@HUW0>|htDZ-(%m4v9162e!b3=ybs&Zh+jz5Nn%WxY|U^MsTKWG3Jx{}Vd^SuWj2 zQYB${FN5kr4@AQG6QGLoah(`#Cjv6*fs-2ps=&q_NeM=9HMFuwm4YsTq#)qD{+D5bE*k>xsRiLxy7eG73($1?1qehlH>{>_YLW-7_o9O zZWqrL*`LVJL@=ggMz!*c+-$n-x6|G^z9^>5=SzyhYouJYoy<<{Ahe)! zp-?4q1mQX&Ky2!owrzOknP3aYANu~>{WaErwPB_ptfuI=cQ z2W3v!^f^Y2T?BivSixFLmTRoDXsxJg@8Uk6?^EOj#&~OrJlFpCU4tWNh~+D%Rn85J zMh9%wdWtX3i{3PJ6Ua&jiaU%K#^)0OeystjWQGhDhdCN zd(9OorRl! z6#*dhjg#pCmh0bVtoDhBT8P1Xyf;DsA3@;0jK+uCrAog6$Vvp*+B$}8RkTsKE;BXI zThY%C9oo~j^h{T8&(K#0%9siqj18Hq69(%fPU0rR`t;PKD5;wjw)3q^>c;Twix)B0 zA(cen5_<$axQYx>eBibNf2-)@6q%Cv5N_KRC3RxMhT>-ve36FjSB5FD)bp_I^;Ond zX0uuHREjMAuvcFcu}6j_GDJ~S?#1wVNG(ngp@7LbgAfcH%R9EWxA}@c_~kg)aM!(e zBDK#_tox70-_6E4+Pa~0mU4T>Bac0b)0)MVE2tt5ATh_uo=uA^kWh>S=uu1_ivxgU zaS<&utYOe2(jPy1l=<{&GtyxB{)N3A21NS{(>vgoMOrtsXNcd2$ZADDEN|%Q*J+)T z=Q+#OJY08!Qa&3Ly8%dLky6pNhQVcg%*RdoV2yzkFa}d=>&AP>tyz15i9Y={0B^+O zh23KPo&eu2CLS?};p3S1t%~zuzrnh+uM@b4N78(>4HfBX`!PmX&82yle6yk`-i0(^ zWRoI@O8Yp*U@K^+(pWr~@IYxKdJiIa0;?6%ijklq9lyWj@j6G~YWUF%K^9`X9Ovoh zz21F8`fqJH=;9NI8iS`}7^?wj8kxNgtQVpV#D7Nyz>jtCB!ZdfI`Hz}t!UkF^xJv@ zu}}JXe5t5{}QcoU}``ouoHnv1T)bat7#fC74^FNPdt3sT7pyqN4;EPsut52{^`H^QS@xad^z{Ou7km7-L+mbm8$?G6;-t)*9B4v zw9bFr2AvnQt?wnPRL>s9&ni|L`byId=PaG^Y2dDH0TJ|8S?Y;c6gf>3`yal- z7_9V+U5g{6PoR3nOjX<{@}5VTsqxVVY?l}?WCO6(1FFcLk$^<3RCMbgYyhr^>{D2d zfGWPHxQ+pc>c<8E2az(0BcPQ4lk3-q3yub*F0={21x71?oG7O6fmUF#a0!U@(*cl* zg7?5=^(n$NfOTZvjm85G?LQK+zATPipHhPX=!poT}d^YN=EH%`TX!5V0=24C0XzNIH|5+?y&=O1cLDXeLzR~5o^SPEXacnK+e|27363ducdqDKznaTx~`ecW*Fm{HKi1J-s{Ocb1Bmwy3zgL`;;l1!++m`4aX}X zZkQs3F_3a1q{*(gK8^O1c)T$OHUw||NUt|v2U`P{DF7=X1C>~%;WB-yFPt*2k5{mX zwPG~yJ;4c}Yn{#N!4*A|#Q=agpF(s=cpku1NDX=xD>7XJyM{OoKr3ClKSZz5I>K0S zEYKQZ-!+Dcq{Hf8!{r`i^{K!Fct)(%8r#K?m0HtXjaaIoS?FLsjrFXSSiAlsslefU zn)dCKWCUqz@yaRwJ&BX}2!(ZE4V`Ilp=F8d3>|_epZ*|C=R&`@Y>;-+NxKu7i7IfJn#FnAVY z96A8Zp)qPKHi#)!4+?#IA|*4djVaRJWxZ`%q*6H7;hYKS)KKYZNSU+%UAYD9e(%d4(w4xkUym&BurF zMz)HcHW4_b^KN3U z(siseSDU9EREcyx=OU}-59onl(0n11gF+9Y#700h0#`$JYH*{*>l}m0_~RLYEI)IE z!HUzsP>q1p8t@tvAC5s$nzu*BM=aI`K;@@{>lj{7coQ-0H!>Av46?=mY!iib!eO1n zNsPlH6(|Q5iwd53#cYeiWko*Q#$ZRH_2_vOZ35!Mb*Kv(I*dCfP%5MA`pPk54O!4> z?e6X}pU-*fsV7l^>57b(QVL|>>^Y{zhCWvDyyaw)^jb0UJWrllK=RvCN^y92$ZR%C zpdrsxVC6EV)2X+MaNftMna}xqKk&WWasE8_-g__S?ztP0=K)iBU1`+nV#6!HX zmDPNSGmdZnj_<@|8A4|v)1atp54Jp@Qy^>rIVS0`qHZj*hMhGDyu^Nj9+dfKhu1fa z4L((-S*+#(&^WrT31V~tvlr}$gh-W?bzM{BJ>ZObwWeJ$ozAH16-AK+M$50ybB$6x z0PeaztsL3J=-?j#qdz_r#RR1?ioB$%=D*Qj{0~dql*m2K!FCD=RmIpv8u}2~vfdNSB{jXvgZpdTwY}MdA>%dAt(s~WqEaArI za)Wa?@F~Iwu>1qJLX!t#ZcTYduaFtdls2acC`RRu!h} zaK@mJI3cLJ)|+5D;oHN6hkX=SM~|jq%amA+7xh6=&m+SxkvsqiXFa3ehN`}U!)rL_ zkjk5UN-4ouiU6`!txp-n2fe>;FDZ|VQ`Bn#A@$|=nNFt(=+$)%^nO{Xx-YO?b<_9g zi>#Q%l4bDyfADL#8dFo%%TYsX+nIE4V_HyZuRA+DJREpg*>G>YJ%s;^Jit-P z(R4LhdtacsSy4{%V9zk4X}VGSq4|7{5F(`qhdn3f^Eu_DpfgQiygXZ_w7}RlwKkGU z`f7SYA3_uQL28XPeY5cBqo#F%bFoO_H}*UK;f$LSxx;3l<(CIfs~f)a^~c&+j}?#W zpUY$L)1TL+1-HK42C(I42Y_oWIW$ZW_S4}uV$5QVrY;;mFj6BHD>77~2T*Z&1ho2X zjs;gkkhMN`9KagRyKoQI@zq8^C5{>2z*ZdxvKVeRWS};IDvkkBYye&TW%a;Hq;+F3 zwP8N6b8&e+PWY>nIEirx>*(6n|IA21XGQ3vs(eaGN)Rq-pN7?g5m3ddy{&vOk)=|K&RE*c1Xf2RV^Uwz-x0M((e*vcGF(VU z)>W0#lF`p93fW_Nv96m09LjRywMSBWfwhoG=^vd+D=uDqfh^ZdrV~07T9zTaXngqV zRDcv-WPW&UpC>=?1kXJAK@gH3`1?P=_StjHw!9};8$c+KOg_s}Gnq_~LZXzUS}iGy zDEMDdmIZCwFquv<)>|wjy9sN3iWHEc6^&=Ve5Idp9a*qP$g>*X6qoUzm|2N<*}3Kk2wHP={PP{6uQ(_r%wll;~fE9Yz9~E7;qK9(Pn@( z09ve%4W=6ytkGw-4y@>b%m_@efvsBKCV{d|0BapovBpTP%?IF|_F;JZ{*sReR-4zY zM?97mkljMMFx%kAbEBBOoNmuABSc=@c%!x0*8nKD5A z5vuJjUPc>_iM;ji!pk{NE^heubc(AXP2;SgR5~y~f~Kv=grr*4NS$-o)J!Ki&h}}a zC`^uG=xBfm9ehgYug!ZXkC_`{Fz!gEja z&R=_oa(kPqYssV|mm*jav?J5jhV`pcZnqCABg4L>GHk;A5D}+!;;k-u8 z|7q!4vN=OnuV@LrV}(FY6xE^z)3RFDY|9cSI;1jePYP^R(YBUG8BEuaqi{lEob}z- zj4w^gln!i~L^!Bd9>`A0i8qpUFeyr!s-|n&WM-5}jT9bW+3*ZC&W2V;mezDkx4efM zQqXoU?{~mQBW}=(u-94*0m%j!wc&v!j!ec-Xt2K7 zw1%=QSS*(4EJrz5)KzeAF9DmFtEOpEGv}fx(pc0A)m=+gKN!L0H?66U~%=3iywT3_q^jBJpR~Yyl`dCfBM;2J? zs)ISYb5s~?YuHv9t^=(!y2ueonx=-JkIST>XdG3p$)^)k?U-AG)dDpTp?l`hdzx)+ zZKZ;N*fa9-<;!TTy;!|%Qu;VDol(bSj7e-)WVa@hNn#^IHuqybZc5}n1X}Csj@xhZ z!|E6qCXO;?X?cJN{Bg&}aHGWm{EDp8hSMG;)%r9bZhbq^A1;9`kET*eGP=JruxVhx zMy2%J!2Tib2Wh?sPOb-8@i?P-H(E~Dn!uDhW_+-NNdFC%kIoM_8-b}Xe%x3OvfPIG z$YS}6J32qO^P7O!@LJNbx_c)hcyvPThdXi^fdY&hr zewrdH=!{FASHtV9n?4;FAM{<CWfqQEc;hiTzc+Ve)S#i;KBF2hilgkxOmti^OCADEUU)fQrpqCHDH-c zir%kFW+>^?mqn3N*A+r|q5f<(3vFy#@;oEYJQ&kDBeulJ$^sWEJ-fQ$wGX_8+n(8D zE1z&?>onFvYdY+tq+QI(3SUjt2}L#$Od7-9YcKHA551GTv$#^BgC5S>j!bLMaAuy7 zjk>p}bBiwibzOU5yH-h)6$=rD?R{e5g0+^et~_XMs2r4@a>hQKNw zvjeY%b2hr%fs|rYN@Gn&IVlk+{@(X}Ki~5me~tN-D@;%AGCj48wF1)_4zBETZSR2h zyz5;&_?}vd%rRkcL8jIu1qGl>);n4LYF784Ve%UDHXZQpfy<(rpcA_9Z*t@Fw28ee#!Oa%F@iqLC)U7C0A53Y#b|j9gd9WG%8jQ%;@QX8-Vz+fJXw7-&0CszB%dy4%)bt>gQ@=ll7FZ~oJu zMQRcqeY=XXBpPK#=0pgY`W8m8u&kEkdEb{1yybzHM+h$MT?PkjQ*q_W6(-v|h%BS6 zS}t9>%;OI~!efs-Ow%>ocHwT``{dJ{IeUhA-LR^cl#`sUTT(ZMt~IIJF;)UP)3a>G z_$Jx&`JAe1n9XJ=mG!{Sde0wgEdoWE{_ z3Gur#Y_=`PQiJdAm8QWu?t!x@ZUq$G2ngNioHqxH+{W1(ok?sQKISZ<2SPxvwHo}l zK6b=C-a+h9I0QQhfTd-(8ECNqWNiXiL=fdhVgH+w{lW^!`pD)=8YiFoaMjx~6oNrJC@8r=CSwhfo7V{teEg?=GT-%k zzL1^Wa|kKOB)G0+er>___6|zfkP@3=Ev!~8vzd2t&x+75(F%5UX2EkzCbQ9nY?$dC zx&!BJ56X_iW=S^N;;zGv2X`;?srociIYAYgOWhu4i&N|YJ6f`}bB5X8C0^L7*|{ue zwj9$%$$Ms&&!0^BLtp&A^Y7pO4BOSCT+#QlWu9cN&#`^D&(-ag)xxn$$7MI8q@b#= zFx$P2x?Z4^#5zZo&yaK=6)Fh&=Ld)6MS*obl^nrk*L9vH%X21^2?qzaUQqMVid$l^ z;3NB2{>`0BjAn24`mTqqj$_bzHY<*~wDAb&h#_!tBfynXhGFC3a!Lu}EeD1G%L3B5 zBip5OhOyD|V7k8UR$~lsjsY)g<3ko{44%Yzn*h)@1EHh)tgjnS$J>p;*xI^d-s4G} z#7X$D222NSYr!d;R#+sL50Czsre&Dr~WzLl=SGjWKTF_`^?Co9RRj;~_$3O5v{^s8lGzszm03ZNKL_t*e zF8=bj{-1PhOP1#}ZHq%No9!^4&pCDK6wBojYa3eIqO}K&ZQCM6hE^rkI;@eP6sBts z+BZnfvW)-s_P6tA|J0wx35Dre=JPq1UV4^y|H`|lmo=aEsh`Q+4?MvC^Y))(_w+dq z54}x9+ZY@$oo?e?U)2~z;kRKZb)JJ-^Z280=gUvu!MmEAkAL-P z9+*GFuRi-6pYW+)#^3rk@1U*E@`r!VIX>gU1>W{6C0{Z96zYfHjond9nr#+a9djkQ z`uf*%_p8sdWqzIi^gkU}_V;+=>8Ahzrlaoa#L`8vyZ12^iQ$Y|IGpc|xL7QhOiGr^ zkLFLs&BrYRtdGUGl?UU-ZN+ugZP>KWvPC73*Ah9{U|cWyLDwHa5ScI$GK~Q+34t5} zuRxayzzWfWE-^50jn#t#`-vlRe?2vOiS9X2Az8!sJx&tRq(Fr(||F(V~qb3&=`{{_Dp9H z(u?6G0^4{X@smIKllyO3)}*#Fo|O|QRiIRc=~{G=(KJEW-PPWR zbh)4?r#$-j2YBE$_fsBR1~q~FTf zSN{&w9q_=DzsP@7HE;Oh-^au6F?`~=^ZbF&E66T=AMciL;OkDkj_QLCab+^& zm|f+eE0%ly;O}Sp>Jt5d_wwMcpXReaRG zYW%#}>1y=~YnAg#j1L)94OZR~uv)`Q5hS?ye_*-9roGdo2WCJ3X9HjrmQ#8#0;jd* zMYs;SK12%ZIN-AmsK!%~-sdJZX~<$7dyciwX%k>uyVN7+*|h#7PU0kv4=KUA z7O5P|Mjn6cQGWlIypdJ4Kq`&z)-pwkoIJ~E>Y5i{xJafnrs=S) zV70OBOh;Y&Cdj^euWvq_WqA@{ z>rB!#6$nAw)rinXRx8PBwZJ(`Srq(@zx99fPyhLkP%W1<^8=oI>=BmBLw@$B|2?ZE zG~1`irV|7fjKx@s(hBQ*AwkvJ~95b&AduWan?=K<}};XK1forD*pka>Z;%(=1m^>r<4?MW)r9yW3M-*xu&Z z{cGH_yhv_ObKgDpU@$lZxy~{4zG*2X7@XXrL20zf=mF)FrfE(XtPfYb+=t=Kf~K2U zzpe}4v^;u@j~J`r(R!vUqBTG2(k5b9c{pUO@Ql$&mvsa@^(L)H3|XTFYg2E?n~rfy zolT%+cpo+~Nk>7`&48-S+YCY1Ch&FKHLlN}#7UgQanX_GlD0J<3>}ik9)AL%GK5kX zTd}o0qh8rjZ@lP|9-YyZ@_qc8u0;j2&*gH-b}`|JCm$!zOLlj6sq2Qn@$KKqofkfi z-}0(YBGXfH37xfQozv8w$v8Y*ptVG6!KzuHlpxDWR?CXn^fsz`g_Mdi&#{@KYdf3~ zNCXG_`xJRWi=*vY@?0QYl)V?)azr+oEYrf^nZI>#v__p`^;=8+YquqIYVA* z=3R}Jnr6NLY1tw}Z{^74RVGD_-n~Y(y2!-N(7TfDN-?nwuDi4VHW!PFKMTC-SWtX^7@=Nb3icQ0sPJkT~BQpjZO5v>|J(~;$Q61YcZ zG0zpw3970}{VZPz@i7UoK9q;wEdi@zHeMedrUfAY2X_=`K?GZ&N8>so8y-pYOCp($ zx>4G&XSg;4s}ZPTLmF@(Z0|+*FaPdtVusTAbwQUHZFhuy8XZR*bBw{*v24})|Htin z+y{RGyH4UHhT){3b{(B*DY6V!@c0Lxr_D8{TVm=Jda{jkhNkJ*+1cUX;J^#s5hx3J zo?)f$Unqfkxng?yG_7dZZ&v)1fBB=nQY->ArLdu-|MZ#L*qUvTse(K1xP!ZHzbmwa zsd?1{ui~D&@1oQNdzY_L29bKztSHJY>X1s(T2Z$(rgP-Qj2E7Nnzn1P+TlbCl(cO} z)5M;BCV5Zgd65{bXo3lz)$5v?T$esQ8hZU@MNUo4cfRG@_;YW5Ge7?eKg-?=PqC~j zo_*#8-u}@0sD-1bT6A!FA6D8Gg-=7ajiqf2c{ZWzI##O%MJ}n96-r1l;VUioi6F9 z9K7@ve(qC0h1GJ8`?8kjFF~Oyo-un|`mVpjJKpz;{OS}Q;^+8xNiK3$M`Seo~;)e#qSyqHp z=aj0d(U~53e0hzOZy)2eXBJQtMaD0^^H+G&;((`~_yAeA;BbGBpMCq!@l(J24)WP; zD5;q*4mq`bimvO}+S+11pL?frougC{{z&)tGS4%*u1;QDQSWxP-Qu8Z&^sl!ec&Zt zy?u_){@rinYrga%=Wf49x7^|XeeQFq-uhEq_@BSd)?&%)$_Wp@=GA=a_kJg5MaO5q z2Hx_5F{T*-zyCAAE#YefKx>m%jTy z1V+>Ai4nc2sC8an)piZwLgl8SoMapx&dIY9Fu_XWV+yuhH$En=^dknWHVoYAx!2jM z(F1&wz?~jQZA58dU9`v}+otPS+iyI36u_OtNu0!uLm;t@1p}S2I5f|`aFI$DJ z_sYw(rfF()k*9unv)L@Qq_M&a-*u+3SPTZG1YOqx-kLyX8nCo+|9b;{J;r`pyZ5%WKqS&Y9gQSKt32_7h%9wYWrg?FlCBoTv7# zF_Sw~?G-NXzrYqP%2}okaw#xf$HDvxYNn`!<;7;fL{v;|%l_3Cr3yqLFxJpD4X&wC z6Nz;`9a}dm>Z&Ev1p*1e1}`kH#oFCH#o@t{q9{3a>Qr)we%@x<>Nus&0Op{F_@Z;&CVqfX?#Q8rfD%E!y=i?rnL1wE^M=0E|Vc< z5@!efRp%TsFfr5V6!10#(NI$7-ZkB6)u-c%lBTK<_)13b4_&DRO=B>&OD(lbNUz1- zfzALpTHBxt50t8Ag^?|7(^8ZLP1j&?BRBU55MwGZ(>nbQZJH(-Nk_k_JkPPlp=2;l z?K;Xyfe?;PIo|iw6U^>C%hd|*IKRug{?{+DP{KE~c7hdVY`m#8hlhvB`>Aag{#v>g zo%x^2vMlME7Sna??(VYNExF^R1HSm~`?%+s1NJ}u3~sl;?M`8}LfZo-UCY(0OD@PM z)2d}Tn{c_UdG&=UN|wl6QgMnW9(^9YY$)BMeEKKf!(`_yZ~DqV%71_Ne_>jbw3TFQ zs&LM5skL02l!$6Yqce7=TO96Pq3T-B?Vd;EIhPJD)1BU-+ufp*lDhN0R!Rwk0uz8` zmgT`~P11Fia^iun5Q45V7~|db7mG!xy8Ouf9DJzpQ3F^X4PbS%=iKyY?jJe>P;~$lC}I8yto4141w}6t zP+f2QBu?Tajt?az)qIJ}yruTZBg<(_v}v4Q)OCXyA~k@ zUE3uf1|Bdh7l#x|c{WT)-!E^q^uIZTH~Ey(+dgQgK{~9l=|SBYix3u_W#MRdE|ro; z4leRP|LOPQ8u*mgo#v7EJ;i(X_7I}xkzf8{-h1i&+&zCUKlfjs#B5#VTmSN3z%DQG z@LZz~=X~Q2{xj}*u|*(Q3d6R@!8&T`Q18EjwE`g(tBcQ5+nOi8<=a@S?kAsS&lsN_KiJBgDxiE$VUO=p?pCCXa%_70HJkqb%2l(t!+gr#1sIDOk~EEfxG*D)ze4h|1} zX}z2z_El;xSgtBxXYXwwyasAj*JN2nUKBK~K?sF42B|Zwa~QlMybuDR6&7&DA%v!D zD~clX%+ml|ISZY$6onUydq1g}@AVg?7)tl;SBx>Cada1Y@bBVDm%g*w* zALnu7Mr2kexIn^f8v_O!F@OOAMhIbqP*0d3VOugZ11uQ{2_%FVp=Q7cAsc20Bqkt% z@BsD12n*Ae0SN}E+eil7qPuDLyDPIY;@*26`@vwJweN|{h|H+0TUinA^+~D7xOrap z+=x1V{cG)iwH-`D!nK*MD=Q_fX~;PdV{!C8`N>c6m9Knd8Ee!6jt~;YxEfLM5P0hX z>y+Z^^up?{d%d{j%lqV;yrP#4td+=Gl?hj3t9(6{1&>Ex{ko?l+_=;DGaaf?!7 z90r=E2%d48s_P&FeI?RC9HzEyN%LIFdE-dV2Jami2=Q1-ljAf^Q-=qal48fo%Ch?UMo2CGToR{@1!>aW&Od+wb@FI?gXHnCDAe)8TB3 zF^2tNE^!ShGYw_icOI9R2iJJ|uEiO{v>(`>Z<%w#*dFg4DSh9 z&17KHcU6pLGn0sH&Nl21dt_l%41u=w%=1X!cMQXTZ5tqAFoc}gY|gNaCuhU?`8kJu z>2LGC^s;^Rt6#0NAZ1Xvd?v;u&B3~fw^sbFQVybsm>|Ujju_eORZZF@GFK+%m^c9_S_9)6~#Z zdA;kpWq@?aVVb6i$B!Q~&olEpS8>-g4bB>zGo%!_y4n#5fQY&lziGL;+GE`+BW#+M z>vn85XN*Gx3~kr&{P{E5CCOa+zhW$N37u`psbM&b^!KK3T}oA@Zi z)9W9euP;m8y2q_eLklk`p0#rY9K%OB7WIw|@{25cQ9P}-Tc7hK(Y5+!EzUj^FC60L zANT9Q6|cKR<%JLa87PYK(cz6PJw-9GzuNKbr%$oI;c_?NB3M)65hN^9go20$Yi-Rf z5=X19E?idLNk5j%+MA|ndDx0`pR2nh$=<+m5b*Nf4OzV?qk8uHJ=^WJuF{ihkkoK# zET6)7t=T=s2#XK{>iMRrh`vXUis%R-FbpHkd77qUngY&wQUYfn$H?X7^WwU>5|X*y zo-d`aRNO4)dQarNHBIRQD;_z@7xH$g=Cdb9;i_BqUng^V1@NIF@#(ARcI~wm8!$8W3 zYz-+yth1yP>VgAkO5YSP$4KKmZP)Sq@{+T&Gv;~5x$>+i?xf*z`L|kzT?ytQ!XJoz z#ak3uA6T^9u+ypgan@UX*z3E4nNoPct$KMAb4^^8UGlXTZW2nbDi6x$r_%i|9Vfpi z`<4@4Km7~WbN|HDeYp-rxi5U;{1M(*zWeMwTu6NLz4tiG0pD!!ITzQ;IT9J`9rH5G zd5(d;?W!Xs4pNCmn0fT*5%0hMKGs^i?-z%{l2XQ6M+imKNE5pBDajl@ag*dV=NyN_ zp$dxg^YeN>5hn7mmS_Z-g_q}CS2W7GVp#n>#_CSV+`N*LwHzCZ^KRKTk#iaTEFwr; zG%0J2<4E6~6^G6nHk(atvhVwzVHip;ShHam2F9_J+~Vpw#f@`K%QPjtH;mJWb(uJp zk|!~8xx1q8dn|@w90@sMG4yRqgJsIaQJbczUI(c}VU+x@Jt;-nrswkVk|$4|@bu|Z za?ZpgD?2@Nn6d6CNW~?DquXe$We$PeP(nqEkS_BEV}zzDqWR+DqVAh>X1Ck%`0-<| zuCD4meJI@TcKkakf>&*Jw?ix|^X{WxJ+n*qog$c~`|*nnPSdNdw#M`Laa6 z^kA)ft(vB}Hb!Orz|Oh!CP@~RJkUkVOw+_}x5F4yzlt!4%WTB*P>(a z(kh^JxyRxfdhdYDG))Y{Vd=;6)!Dncx>|kq)7$vbKMD6vV7;kWdYx!_y?DCr!rbY2 zH*9d1{a$|s>+j#7gX$wzTpvU*y=q%UQSLY6?iurbPd`HL`V#Xw20VsnGHv5U~DG#jS5IQGvkFN>(Mwm4!rW31(DyTw>bh!Nj3 zIPb~8970Kc?>d@AoW+!wL!j-tDq5te9jL<3FDn(};=Tz|0+hZVadgBXlk%hVZpjF< zloOlnhD0KfG1h=_jKj=4g>pZ9O9;iKYTB-(moH^65r9V#=?HUX9E*?$bHckGV;wPN zo<4hyu^vnjH;3VhrY-$m&XuyOlpRH!PVZJw-G+H8 z4x%`OG0hA^>BZ~1hGEz<4127F7$>^UlXE1-`9VEG?w!DTiTv`nZz{Cb|9)2u^4jCQ zCjQ`6V(eAtxU0B&xm@=#Ia)82OAYEyDau1<{K|Luk#~Ow(Pf@|;tB6PeTr{9F_)Bc zDV3E`G5IB@Nn9rH{Zdk!aL%yZZb&K6_oYmCc6L@>7I9#JWi(1z0VvK>+qSirYK>e6 zz;?U67T_ta*V?&~ZRP7`vmvEKy9^sHE>Cfh%KMnG)?jUE@W?q~4Qw|3k~*KU7RK>F zjIosFmY%MZ%IF{O9lPD-a$T0g;ZX09+_Pp89ev-|(L;4K+H#Mj>?!wO&LQrbIAOA# z2)bv_p3%0YS$@3$L4>6ArvbHjKZH;m%LIr0fHjVsAjU*UnUFI3VI&*Nv*(wk6gUOi zw#QmW<6GLctv?&$P^Od^$FY8%u;ilccbuP}(YBrtrh4DKFa2FH9^J+J&b@4Mf3XMY z7{??j@ul!yM3=$9xwCi7=&9C&#TLXZy>H-!;5`iABLBY^_rvK@V^}@z!c?v z^QB+;Z~W-HpWvO}{lh%RGtCpG=}0*jp^*(C2HaB8lh}k10-I&{vh*s25NLc64X^}t zP9rI$+FK(H?oHFwGTORHei(-8%m7s&NSuP~7Zy<`vjwGh$}S;*d(SyzO=6yla2&=x)|3*W zh#~Ji-XF_{BCh1U%Js_XN-3>Q)3B5`E#r8=nBxM2(uhA`jm248BPK-X$bW;S1bTUS zN#AtWVlk#^!nge*oHLh~yX77p9X)XhbI$Z<8+M1%Pv)AoChdy=JUWXbo6WY0OJfYf zcpwwmAFh@eg^_;KGR*_SSVCOq2b6<#{~avh1D4}n+~$LAcl*}29`BA#Rd*>rzNvHd zu{UEqB=1&Hl-J^)?)maB{b$U3S8SWU^jpQaR0M75t1;A=gY9+;P{k5ZoeS?h!*F1; z>6bp5;@RN3e!s7&@lw*0^N0wMCI8MjHk(apv|geiWR%akr)sy` zU28~(ls>F-1a{>-}`z)&4cvU*4+-vvvH0bFSur9kZs2t0$RV>-)0VZ0hIL^*x*I z8QrGGI7`gSu#z@aLv3_m{SLdxX|Qe&9_01^#JL_t*Q72AJQ+$g7(8DzJ9 z|EhfzMY&hlF>v_5zsXmB?bk7}1W9(?(zG0Ay1uUuawtMe1c9uaTbJW}V;QFd#%B6W zTfQHUj>NjxN%j}FM#Ppp;DIVi&d<+_W3q?=5jAo=Yb}12sU>1foGWRlmTQpxWYwd% zOKX=+n&PEo7{bgj97w6SQW85+9Vc%W$IR4Y_I+O({6k>v0IoB+r2MyjPf#4K!(oSS z9NY6VLY#qA-7DFzxM*`N(@E)4qBQ!xujdj$CeEAOW0?~eV`j72VvH-P>SJIU134MG zb_3ZmO@Vny;@@nx48wFyfUfh+%7THe3ctSVfV`9eGfh)O`F49o&WW7UgL-z{%Mzh* zYZ>qkCAV8Ygcrg$UtQVDuifUQ^S^<@xuf~@1{=K0Da(YfJl-qZtcUaqa-T?V@WG`w zIFB_S{6ueWnDU$L_a;AcZ*r>pIJo)4uo&PLvf;cBqeiGpzVnG}*X*yqLVFC4;#PN~dP`m2$ z5`iPk^Ncld3EK>HrD0j=cI;gWA>gvXSx-z6OL=c`j4~%t56a5&pC&825htBNI7yec-I1^t`;oA zmCb7Y;V~E#XW5Sf(=;x}^c?nqu4_pd<`9`f#4UnT?zM>ElCWVhCM}<7s*c(^TEm!( z_iY`Q<9)+0j-(Wqm6M4OB3)O4XPqnO8x9XA2kYKCSi+nBcl%c7=mVDQZaUV7eU{wi zSg(Bj6;9q=ICTTMrll*&Z&Bui37Ie@zW8guj&B<qE5p_(CthQT~ z{6r{8FH}mYmi^@4CFy$?&uWC;Bd(uTQ8V+DBOF21*aD^AGXx^;_+@1OLy7k zwqxJ=`W@W6yK+jQ^}1u}szOD1c(lI3(U6j5H%BrMbHcdNf8`oq^Ol75!%>#uuV)BK z{*i1`Lo;6xA;2}4366qD`f-3Nxa5H^0!R9r)&fedPh1o!U5S8`{3yAOuIp;aPK1$^ z6h&l-D3r3HoJamm#0S|zwuCv+Ha&)NpN3%osC{Y@wrZ`zS&w%ODdp-iiDS3^DuS!5 zlAKGHRh-B<;asUR#2E12(KMbAW}4Pl*GZcGA3b`+?rL}KTqPhi;hZgt5^}`*()2HR zWGN*Mhr`krSAt4Im}om+lHeDoZCwtP&qf5bU()8~v$?pqsO4S}v&I-=dJ|v%h)1nrH2ltm7JFe<@W-2~YaE z){cyPm1g>NKbGvD7pF$X+=!TrOK9qPG*C(sU~1}n71z&NS4E@2V6a%@n5MZnS+1!r zjtG+w0^9Ajp7(mnd!lI^m=ZHFPD62)awO%_oIg$FGmyNm5JDX<^r=sMip^$I)Aq+{ zAd_fXUmUD_Tv#CGP&lp(b3iQhT+=s{k72Y-q*5`jA1E5fRDLW>vM_dkTR8AuQ+Y8zw}y3V?A)~ zT1AM7(39f=*UDc~s*@)7QewMU9ItjMnHAwAWx1{^_wW4t9PgXbJCzO2HKYX7bnKOS zF+!m_J4?Aw+@+c?mIKDH#5v@}(Mn9yaIMK-1mrx=eBldUV7J><@zpdAC}V)EB*xog zOoljw<#T5l^1LC&!1?*M3MFv_4~IkT(~~?k=Ujc*<(%1UHuW=>_w1Zg2kYbHwzAx< zLM6Xh57w#w+;-lZzWFFbmx?S!QC`9X41pnMzBi|rRPc+Vw!VD>r1xu$83^9935Of%L&rp)Iv_ImIqP~D`IQgw{_zORmzh^QDNiO4t)#2hdVjDv9= z%ltfRndTW|ZHW*tp0?@nt|f*{44F)%X&uIvzhhD<=}i%X!x~?{=7x@$%yXt3d1vD} zyZSEw^dJ5${?jl1V}AS(ZTVq#Tt3~gaSfxnqTN`0^gu%l7K4ZE=-SO9$}G+qVw@?1 zlVgd6Sj49YA?F;eZ)kl(j)}&3ye%;c5^Q}q>^K~DkR#4mEQUA-ECz2~6}9W0FiXN= z@Wylb?2_pau9ZOR5bO}I<#vgPcGhA@%;SW~FdTNZ>?aQ3cDu#hZBL_9KyIkl4WsqoN-%tJlZBCkSAInJglTOHMg#LUS4` zFM8w@LZVF!b9k(H>_AaOw6w<@HZ$A1=Y9W*_qyKu`u=oZ-|O?keSNRb=lb5)ecd1I z>|{&x?H^OmC$`6;Ajun!fhN~~obO!mor8I6EZod%JtD{HDR%P|Yhnxy&ISgZ@W=-G zGc*cc#+jKl4!*0`esVZ@GjZ?Yy|yQcX{GTL#oYiD*Y>HRJ*M{*yJ7FiLHOLkddvc0qe>B?zum>OCMh~~ zD!@h5XjHa zj}oM6)3Ki_yAJ<$rgZ}x4$<4Z77#FpeV9!DV(vVHlWLE3A%*;;1`Sgl7MNc8v$5cg zzK;2iS({Vqrrk_sr7w~Uwc<;LUs6}`Ar)sAmku?KP`G)1ohIBBLzVc7XXZZ)eW}Jn zWw!U0xU)i?zUadP<6b5#V+%-i(rarQ=x(3jZb80{kXE-J||Mu&}H#vSo^y{ z{C1|r9^}DtaRAt%{{)haajXajrcX5?lOuKOdBOtRUm3!-Ac>KrA1VrGuYvycM);;1 zSCYw?oj)d7hV~M6J}GD&{Yn6RF1ZqH~fZ1U&k7%BS0t@U-+xFixpN{9r5dFF86SHX$@=aW|&h9WQW`p0|Phn`r0F0DkgV76QYx*kU#- z^F_@di+NIbDXJ%UwAs*<^->ca9m|HH->bRR?|7IkIF46yU(d6Pc42nYV;%mYN(NcN z+qgwLaUE4~Tg<0!5t4pr-A`-6TKu&omFS8eLPZa9wgqg0Q;Igav~iyzrkwfnM{ed% zou~w=LEx7PI;(A|@V*hCg+GH__fnLbeKr5wwO}>(jDmm0aYVygOI6}JW#|SahCFZZ za@71N7p_UnueyqIg%Lh*I9Hb2>`>_L4wb&AsEna3MqKS>z3zYnwi z(YFgafp=%kH$2_AHRNA9@?zcylUQ-o29;wre=){`260XIWFc%>ElpoStST43eS1z^ znQA{$^FqbT0UQM*Gt6gUss0{zYkI|Bcf(^Y_+B3ZL3oa8J|uliqv5NUqo2EiyWSiQ zCklMrpa_rbe_Hlhe9`2FWbxLjqrMCI)@w~rDM&cVkOWj<2l?U99c{^YIIaRGt&*DY(*=3SHnn0GF$zJpXwPENZukzBo4dJbY!13&%o9=J8?TkVWcnK17d?)alEGg+$~n4tC`rwTHlUR4;~ zUhh(P$N&>IaO6*Z5Wts(Fswm`$~a&=5Fz&@D>FM=c_xwf2Kg8fc#31==Su2S!?&*2 z-$wR>h*H_aHI=*CCEg+n(GpS6c3IL6M`j>|C2VmRVvW8f;o^~rK<9zn5yd)Yp8G)X zb5~66vk0fmTH=xZ=IjysL>^})-hS@a4+hJL5yZp~?N&z=+$=p;(T`1xFkFgD)tt+TjsBdgUGdlmJ+V zb6#5Np-+j_gsn&9B}&PuV*w0oSC4%Z`rv0lqQ#Ve;(dQV1%v}JKZI*ZZfs53 zq0PxBx>Whtk?)#p4^P0@bgYA;(qntk$lz6U>71c8zMA8vTyZk1;`r?%L;z{cTR`kxnz6}452Uf3D8*w8`@^Gi->C9O_-ZIw`0uSmWHZHH1xbjNn24iJJalQJrZaf3S&>2 zR`O?td9+{7y%sko<2uT2KrqzVklfm}J&2qtl5Fv6d0$U{&xM2679@`ucGYw+QPTKX zt%%WcfY=OyfOMI;_IYb_(bdQ{VE;;T`vR7Wk^|-B;ding;aJ-e)|ts%HSV*Cs+TS n$%+Z}2{!xxwg0(-6ifH7pyDh>Rj$whuq_EBSdak0En#pA&Y;2FEx5b8Lqc%ZA-KD{yAJLIcL?rouk+n|f5c-A z3ue}=K7FcA?b@}gIz(Pp3-`*()hLV1fdZ(Ok72U=WuP%AJO3U5U!Ea%x zv^WLHrN8n@FBqRrS@s-DNm)+e*h_aTmyQL&384RbWwE+j!;>QT{d>*Gd{MyqpU;Ot z7$X1s1?m5D3zAZLVUt-X-`~*zF-A{%vpUiYW z`}kv{bL)p1eGu6{gItfg>ycO5Eyuf`e=4KG5Xll9{rz-s*m+w=6!f3PKyPouQ)O8W}`^UDi#6l!ukq&p}s^#B4K>y+ z1hzba2{=+v?K{`i%Sv&KcmG_7?dIXmV)r*V77c~kRyzi`Zl3KqzxASvFh$&~3Ee;6 z%2&91xMSij=ejX@0c-vm){y%g2Mv6~^rJq|0P`R##Fp>V$=30kAG+UiG$KX+I~x42 zf#i?04{zqBQ*vN@%AlG45BnFh!X7U4l32F=Qe$C|r=h__F?Gmj^N~h){>kHA9OK>g zr8x|%`PA>f!=@JC?B>Ih$Hywu(>E~bBrmKTbaz=0vTFKs^+xx;-rlKFXUgG=G3 z$9bYU+!#H}y!NQHVJ&#Qg=%B}fPh(HX+d7+^BLk;1I8H_Ty_P`#8DhNt!~6 zQ`4?Lwu*fu)MNu^V#YcH@tf0~a;ZiqOAt+aTksm*^&Q~3Ge+s_lV;a%=pI{lqENj~0| zU7Z_t0FRB0xw*SffpVEvnq4-VOf&K=6J_VEXqA=7SC!s<`~DqQyVH#^Q&0CUdw&dk|7y#wqqFIQ!X_XcMTWrf)6eg%%To*A2fdPd4{xTsFAQvh{15Zueg*{MH^{AimLtLmi0=r-L1Ck`oTdrf6Gm! z=eSSi-+@8eil~i^pp${=>6#H{o5Q&P%AgOzWpj4m3#3C1D+&${v>z&#bC{R}1FLB% z@@K>ug+HP&2%4KCO7HMikg0NUHJsrPLcwOl(-K zRh0}?S+e4{r(N?l-0p`p_+rMF`@q39q1u9RNlk7I52m#Ezfyg%~G zxV}CGsBwB62`AjDsoeVRj|Yn8Z2Usw&r?5)Xerr_JL=`7lM#Wf(8nr+)b zX?Kg5FVK_Eb3G!yxfS+cQSoHR_HWxmIiG*ZEPgdPf~#Gu9=Liw-@_-~=lB1y4x!S1 zHk+uVM&soQW_zu_fYjSOixPV{p}*;(w|6@4%MmaH?A_bhHGZ~JYfEdD77`M&v#_Vz z#aIa*J9*=DJQ?JC$f4t!(c7ouhQkncxyN|%5|r^B0{iv}?6FRw`g%_rx9XdSMiFT^ zIqn$J;SqW7XsUB5qNU4^JUPh}j>r9z`_%n+|7f@UHBv8NvCN6D4`^PY9UNBeHl+!? z1uKJ9)~xvIm3D}?e0R9*5y|RfBCzoMJtw@6L(8INsw^ANQRd5Zgr>JJ|D2A-&rqmH zYakJIb2z+j_{dpn%dIQ>{2PrQcYMs+_wwnifc_8*3#-y~t;=B;!FDOowLjco>hZLC zJJG#YIKArNz5V94Ip4jNM&2e>9G- zm(>FXsq;8>Ib9eS@1V<)x^0nnXU)B|c6~eFuBNWO(8}aN*d?=+EzhPmm)ZnVs#BA` z!PqJo#Lz~+_mSh2w43{8dz9%EgMh%a$nzq;2*NCs+|aV?&FOmLr()GNpsla}`QPEy zZe9y$k^36S(0&JBm#Ngi?Y2|b@Tb~YEbm55J$Gv$O3F`9PIHbSA>a2Zl=V4BEw}a# zIW~8^Y4f~VfCScN$A1(Ut{Yt`{JcQMA2ou5(s7Agak z1%cwsNz%zLI|Yyd3OSGQ>h_L~j2VVj>m=tW;_G4+_2gEpqBSya+HejIva#xy6CwhT zt!;(FytAEMbbHcElL`^Jq2*$2$gCqr^Xu@Uu5HJ4Gicv2m(O*@#=X?Lr9QT%=90~r z!-kN~`|hR1cztY{v4Vc7@$){?6y0HBc+;b`HaQ8&spVYa z@Xk~uy(R6FbiWQ*bJt$w;ncSxyq3oEnq-)!PTTvHu2i?}srmGfGH$H_3NC9NaIq0h zohdQBMKVl%*cY4k>X$n0+3c9w3t8c2SAM8boLgJ7RQ;aNV6mfEvM0sIv3YM=zR*s} ztzhxzYiD(2OG`^GqjZN&+r2vCy!R<_<0~;VceL6H)BC=5_R@7_VacM&u>f_xRn5nz zT`^^@tTb|1ea(wn;(^e7qVwg`-0A-Q=QLjX&Wp5cWg7Z%YpvU$*~9z4zs@0hivbOF zJU*@&+%%7 z@AX#JQoc7^fqOE%k$&KLx?mB{Znvg(XiFbG<95I~lY^a~$76s0 zhQrc!Ab1&xgL}trFxreFoJxyt$6`4a<+MLDsVF9r?*3vtrrT(yPRwiuW8I@sh6Z_VkM;K#hS~Mv&k%rpbevCXfc@(71Y);Yv{+yVfqnxAF0>#B z{^K4)Wmc~v7!2lNa^eJon_wCn8^3Pe>o>MET|N%+heSjSSh2I5w4v=U=EdbjUi`6m zJzeq*PUp4R`uTX0FJDHHdtNu~E0Wss&CCp8oQKW7M=VNHqW}W~Uw!7J-yM1% zwOgDvcW^S`^-fv?Ah^wIa|vQ3`(cx2AimErLP1gLd;`W{k0UrfzSUNiU6dIM6#nN{ z+&HK|NJ9G61od`xx?toum!|gV=+3lZ$Cre}_PuiTxFv8>Ik~u|nv~$1osYvaDi}{r zY_PDgt6$gkT}~E}I}4NwE;oZWAl8y4N8qyDV#1}0R`x((J&n~2eK{10S_y=K$P6RE zl`vjslLbzPi%IY&9Rt zawy(@>W)5ep&H~-MEnvJ=_|C$vJ`QXrRr2|9?PQgdZao!>9`->Gw6hFM|I5UvEnbZ z8{+tuX$(Yn!4A6)k2Y2@f zyMBBuvIc)jRw_f=+SY34{-2B;+Sj+C z@0t0YCSV~RFL#z@JFg$d(O}oR1Ee5Qj}A?#dqMm%B@p_-!I5o%3%Q)G_zL}k3WsIu zxz3s^JZ;uMA$u3hTjc!wy2FmH%d1kcSKwHQ6ys~Rt^O`W55;(uCiNmF2zK?XFI`RX z*1%~;orO6v3Q85ve39X!gQjgL3BS8hl!`m%s`t`GszeI;^~r3{h1Re4e6i|@^b!x2 znpmE<2l}%^$``i7fhw`m6mi{4feA|oq;b&PwZs=IcLs`!@L9$w(;$?(Bjf-SMOW_1N* zYxT!sBih)wxVXFonY0wE>*lnyv^)U3feaACAVOF}{PMS)Uf8Ua*uhgzEsw*<0yXF8 zSF-=Kx+|5?((kmXorb&TEI*(ed@vv9C&&xn_of^Lc5dFUmLW-|>o!+iCYe{Q<<3=U zTC!uGr%0VgAuJioC&uNu`D1p=JVXs7kwKQm*}8P$wttEwq3g6$R_f?)rhsLm!JHJn zG0tPI?&9jYSLK6tKD?Q2&M%ivlN@$Dl_$`=%EHg4UdLm-iulwmjXSv_I^XMtQ( zv_7&kFfgbZzkB!Y<@Q1Hh|$-V|AEgf!+2qQJTd5Tb)3Za({&eJ6XTF!$@A-r=c!gh z`I6^tW%!&*k@DUBeQa#3g?qVv4-8B)8*<%Zd1K$vb`gsiEB^47ZIow5!$6y^iFS-y z_TbP^|G+>B_vzohq?)~GPzXFRvG_RgirGRoc*Ak?Evq(_Ne@rzKeG8O$9Y~ucib4{3=|!bqSS6uRW*#Gj$z@; zw(vQ(7aR=fbQ&@m^s3~hq#N*^Y0FP30G~V*K+yxw$ za#eLjwg(vtR(u^_M>;78eTCiQ#VYp?j+a{uVq)S?b7XPQ->l~=%o&f@4GH0R9Oua| z7v%d+T+GbOhzMr|YU3wP`^zzylyZh&alhAYbM!}f4m*Uu;klTA1#I+oqTZSSpY`lB z3rpA~4#QNd3?-NA(KjHX{{G1#x?Nc+SggSb?xGV+Q{ge|sXn@0s}{}a()${nV9k5( zJUtPOG)&jjo|3Y}Ms)rB>`nhF6>D@YqF~~#K6ecdcb6F2r0m`_521{MnoU0}ZdbXb z)E#nsiG$*DW^4hZ4+>oOsU+qtnBNvTj3avk-DGM6MCZ)xO!@7c5nP`=Z~)O z@8luXzG62Jz7t6~4rN8-G4ni?hd*QGPkSn5syWm9bjGbBXx0YtvCBs;iwm?#KUpn zt14k&Y=8@d7vwdpMJ=KAi02~U)#n310;(<=bP*7#4?I2+5e*l!9o{=UH1O~~i2#+@ z&XW3??k!uqNG%nTvno*O1K{>bUy!H%;_BkkKRNl4#P$$Tqe4`TN8J#Xgk<;?h?~M$ zixTX*nVHvo*chmhn|lJU^RK+t_k60u)YL_)l%X?<(_wCjET@SjB~nRIBw&x!?QJZ4 z4%FgGemN5pY?B(irl*cIAM)G8`3@!dySw;BT{S}*x(2{w&l;T`z6s8LrG>2o3$F=D z7&%76;^ujne%0}-YPPL67&1b`a;0Iu3jmp{(La_1q7m$LN0msH!|D3+wq)MsTbXJN zP*&%U{_Yzfk!iIV$?Fid+GzKDM0Y1gqO!=-YO#ThQk&4wE(PG3K|6GNWWf=#W13Ff zUCYRqHQ6DN?<oiCFB}OZ-bvWyl&;*Aba3{ zKp0KoXgjf_miXt~SdawWvvYtkn2|B+nmj+_?_wSq3~*DmUIMTq_xe6bN*mjId$1EN z^S){6K%x2glNxD#|w9s)6qnE_wX1@o2N!%1AzJv<2Yz<^_r>%gn;!d%lQ!U z38J=`Tqly4_Q?NW7jU?L?V(z#Wvm_vlz<1BI;|ZZH;tnQVdo`yEM*K8Z$aebn)#tr zO&wEHQwy!eEwdN-7{hH9(^;)f?m*tYnJF^#ECKZzF<*}TR+xW6A>xT7PR?CJKfqjfl3MPX&%UbO9o85I>3vNOL*IGn`talX_P zz^F>Qki5KFz~{_0rQ_7U-rqEULRwr-%amikFF0zLC-Bxwoybw)-zm)PT~CS;X9Hw| z3JVF~6Xq)i9gb4~ch8zXq#q_9*Hr=jao^~hr<2H*rr0VeQu_V4!Z9n0ad~m!c99g5 zoBxv78tHMIAW8l}-hp}2^eEfitpOx23Au4SHL%kA1x4t1RAM5f(0jDXR87^Vs^ZpB zd76Y)o(uQki@T6G`d2iPo7~ybPvks2JZ?UB(_UQ8 z&BkkJ9v5KI_OlNsHYZQ@n`lVL$Un1h^+*2BmlNca-FEO6DboPntj=IEgVBh5N zK4~Sw!TBTsr6vSW#&AH686eWc?soz({p}nfWMWZ{uWhcFgoMFBRUiR{K2_gwNG;4; z7L^wl*Yea`F9pi+zjQJu8c0ggtaz;S0e@jL0GjFGrDU|*e(X2}X}lJ!Zk2MqfY!8$QsG<>dQiyMD{W_)8v zWZFsrLk5hP|E`pXHIYHc#RovakU5cRi4BTlxx=V*#Ql1lfwW>9x5##HbZHXA~%jfeS^ma=U}>hr`3?x@XZ0oc;rzcjoDO{J4& zIOD_#M$AduTU*v_@P_I+$N20Yq5+*VZ=_kQ?WKCwW$|eSX-^@3ctbbZ67ty58dIJpCc|z%)wsMT32D3AYf{a@g6DfN3pg#)Vo3aF|ApPG z_FJ{a_OP(9e{dz)r!{%V@T_Gl#*6bh`f^jkyoXKqyeJ9L%-~0^XnQb7V&Vg8ELBGV z*?Y51l#J%7k7UdtULEt@D35)$2IUF+F$ zLf8G~$8yuCrPB5wkoS%#ZYb6`u%!xIPEmVfuntJIIp)pHoRV$Wp0O^E~_YO^0?lBxFTefy~ zLUMA*US527fYPz_?ixq+rG4;#S->98I6(1yp_;2M3|RMP!m$cNg@9z?G)7fY23q{ZhPsz2NbhSl-a;Oyg1BTKx&> zUCGP${)}OqOF%gR@_@f$k#L^kBv9F;~^4-uZm{y{({3v(D&`lF;|sb$ANjyL4lM0Ku-gh!Qv8h{3&kr!n+u z^04>B>gv+;m;(^i)9V+S#ksDoH#j&rK&xSYr35}ltZnFAsO9_1p&*cuXo<$-gfjGY zY{UMMX~{ec-L>~TY)3+%8v2_j#VT^#DgqX8uG&3V16ghxV@#F`h4NFaW8W zZN6g6DHMre&~8?CHxwu=EjxtR@48Jop^kSvvHQH4mlba@gI0ulxns#YP5iFikt35Q zxoX|=i6rD5`{%3P&X;+f*KKvCmB1u*?TmN_ht-|?bHH9k$EPpO4FgO56Rhf!Kr6;yD|GKMa zKqk+tlpifU^{M5#0R&Jh2uKwojupTqQ9YSz&ru>8fv;L5QrCXUC{TD<>=_$1dUlZ6u)I%e5)d zuMwXTC!^@MQ{S-HFO!rgKj#5-j4gzFIw{=T*kDK*c9A??ZMw}^XB?FOYel|p?;6#3 z>@bp(Jmj=G_Z6CEi4GbudtC1WK9qvtbkM^oh$PCDs8MZfY9i|x^Pl?fUYB7cfNMmj zLlmpYKazg@{(aTt-!jsV3=M#c|EFrh73Ru=CU%5{q6zIhjSTy|AtB&qBUn;KN0QmX=r!xl`fzk7njH5eZBvqCq+nn5-V$&WRX#yU ze0xXKSrAYDidEb$I+~l(HSITBc#qXwvi4HseoTpWxv4<$lv8f{q4DKk$6SU^7Txk& zAg&5Mg7IRdGq3N?Do+@4ZyZH^tRr_(5jZMM<`U} zT&PXG)~q(VftPBZQbK?*!BivY=&S`;_^75-!E#N;C_nKWwA|3@UFoK0rbP{PYUQ3YLb%7Yjk&^ zoR=cYn$-3s78z&)g~p;eG47YURX)!ieD~X!&90}ifHpchBqt?h*og@n%;^g$m#fPb zskmXMeKeuO5b3fJ_M<|mlPZ~IJ}kgXl?De}(t=MMCjF?Ey>3ochAA_=x|QU3`}!jY zV$^Cn+|{o4X>08#%_b}3vKFv#jp?|_-dLJ+8dpLj5%*&4(=mD?O5&9baOS|X+hK=`9 zz4g{GW5+gdT((a;UPUQNo_Jd3Yb@s(0z1AEMpU6k!Kgj7yAsHjN3zp)@cjGw&b-cN zT9)Ax=Y?N@R|!;=Bn+~3f{L*pB0>AP_!Ua%G>6?g$WLcWRv1J%cIHLG0hsU9j(rDm z(jHx^oGvT05(c6-JRE)AAUTU!S)G_KfUnjITiRo1_hB>kjGd07~_AfgRXpvbg3@+TW3wOL?LRsx!PIbu;1G&G?= ztYBaRszEg-1_myx6FLqh(;rV^&(@rAE=x=dgEL?`yXAH&Ckwyy8JlYY|sLXjt2 zqhEGrqrkGleAnurSx!pIIugK;(oJWYOPqVQ?UmK3%eB^FQ8mCp$Fe-_@?d` z#7zJp?yqX(Vw#4{Ukq@GKc~A?)KG)~I2E5Pjv)d>%RDoF#8a&mG55Hw$edP?<8Qx% zmFw1v5fhf-mxlzD0rr^9w4c>Qab^NoHs6(%v4FV#LQ48$XEh^b;F5J}%4>g9=^ED1TNGDtc5~ei{w8v_lxBbKSm&5lCk5Cy=|7JO z#e!6AzxO4w6ihW{pcUIurXG9AndGbrUxe^rFz9S#TOvi$$8&~0enaLMG-GA8hd#B4lmf3#A)dAh%JKYhOK6xb}k<=U8>7&S3Y?6YFU^ri|xUfP-<7Sz6gX*S;)_wv2x(Bc-gy1R7`Tc%c21`eOh*?Ugt@Uw+j8ed{yXmw3J*x z%Np%P7d7&MEL1kDkQqd{0yt(FS0WbB-&t5pM)dwv>RYY0;=#i&T@`7!x-o675(G(; zPwwx`371DzS;m@8;DszF4EAYP75Y7$|D8g@$tzz4g^*&1Z0NEjkj~YH;kC2r6p$*< z?)tJ+Wm_?9kqJGVui}IEk7On3Jyk~kVzJ9aXGf) zBH6sy8FoKBZurWLw|{3r;3ddAS#s@eQF=gfx-SxMg4D|d$qYKWHxmwWv z8bg-uRXlkzrNbHHFAAjtd|G^e%6Gzmh#IQj>$HJbYe>h^U?*bBy2zo|WFt#(S5T;B z^|nb_@*LdbWax1>H8n}6utxw`Te~wmjn(Ciq z@1ClIDPq%%ow2H4d%QMKe!U_soc$eb#R4%~95o=N?`O}Wdi6ODM#5xaGI+yaKx!lw z6yw8}aaF=KqjS=Di?B79ydqO5qfrJS@wxj6RB0?W%ba|VM=bbk7EV1oHY?2uz`Rk6 zp!b{Oz`9)hM&9vL3@8o@xQ+s;4fW~tR9x?nlzYzA5hKKa*WeWHqXoMJ7Gkzt4X48< zLPx3kH@__v<*b|IUuNvdA-pNlF2!$zg86OQlI<!EoIQi%*77kT2By9v89tOWE5ZrFqCtxRf!eN;dD`nsU!1;IxU@Bh@CD6_};NDAF%W@9Vp-lU6lCc;61t1gn|~0P(1W^ zDKVfBz@#jmH&*Xa2?v3?RG!B6>9W;u0F~WlHCU%2XG!XKf3>a*C7V7)z!GF)%N*0P z`IU_FD#_E{+H8$4s^M)6)oQm*9^A)uK`(eMEhURmK7qpWl}Fd}$2nsVXRmzb^!nN# z9~^Jw>AKtu#kjb`V4(qGD#0`bZ9bER2mc4t*O%vii8h_rv)W`7e|g!)iz~U#a-P}Z ziU8{`vfYhq_VAWItJR+AFSClgu_-%qM;?if`-RDMxzNGH5cSp%l;aO9eWMZRA)EAn zRS$o;eQpc*r@}<*aY9&sdO=ZzKI&{H^ zVoUnXLKSdk{1obJWvv@R%wlKEwhrf89U7V&8#(i(ll*}0cm`kE#KZ&vgX8LxyYzz@ z24|A_s~4@8=Hgy##R6T76HOX2K@QVa_^q}#g7soAgR_dNfB`Xe3no-%tbCTU7y#CW z;3%~Z{h)<{qla`-e5ac>ws<>7V02=q#Mg9svIBZ9(YFvez5Ev$B{zeLlv^b*OIUoQC~2eCIA2?-TsJ#Uac_4Z-E&@NV(QXy^`i2+F)l>0_K>D zg#exOe5}2sj7!K%P<_)!jai9U|6PmE51d365qJ$Yqjt!y?@4_Jk~BgkD+6X`l-nN; zXtQ&2%onQ3fByW*5f4fpH36!P-|CJg8=I%nw+%}hlY@Nxjk8S}vd=zAy*0p*s?UW6 zCq~l}9V^aXV>u&2DcntY?j_#2vDylkBtB$2(R0Zvk}+G5mlKd<^rgg$qg#)2fwAB$ z-~aj<(D6D_9(-H~>u6_@Q!C|1C4u3dhzymO%;YQVY%)B);h)*rpGc<_PP7)r-j48$ z%IBQdVD+QVD=1*`esBV+@!q@ht)}OjCG~0}#DOT13RU-55R=RDcOQ*2OyUUbCT{~% zEpO{JuwX2RnXIO%_A|CjIfTc!M&sDGaC|z(g(@VMEQGVEX=9BtHNWSrB{?<#3!5^# zs^aM5=|_QK9aW+S#UB9B|1@dF>IJr>5z9v1oOu(kFPVB|7qU>u7VBOdy$m<#Y96Ux z)S2gqlQOS_XA*~Zz4P`1^gZkQv%iyX(emz^8&!-d`#BRNalAtCp z-w9*`0S{3w-=b~f5sRLmuitUo%PD!C;auC@q~z2dOBYP(3k0#7>~F$jWUf4GpT`Y4E0pOBEy z$Fb(s1C67^1BR<~z0Uhk5&%hNK&qm3@Fy(1*~}!`sh*ri>%yeyua%0s(<_X1vyj#L*oMNRE<+}yYANMsOEq}a}$jNaOk%{{bPB>Vfo0*gTSocXb; zi^LazjZq|iVLZRgxNM5`Mcu=8NcGyLV)#>UnrQ?XY?A+WqQauCK|+|k61l9VLrZCt zGxy^~kt@&&_FdBZ)|2BOHG+n-Gg z4s90voA&eSwI0nOAeEkkq*DD~T65ux8yvMay9A|bxR9-fjMX`~1Fnts=7P-h#Qa67 zy{r9@zk}>LpHk!ki2-ynstlbtMLSG$XbTJJ|VHS|vhXA0R zB~Y!pKU>Q!!LYO5^e-WLAi)Ni4~9&{B<=e*Ef7&@aLo_>K=<}|^H50V)I<^fQ$`^m zAXsX+ArmMDR^9iAHn+C$SWG?u?77&*&x}1KiN%yX!}lC)B8GVk-#|KudaFMs#{jzj zPO-06t-x*(;oG4Wv$T%=QzcJgn0(6)D+vd~?!w}ST2u=nf{oUe{R}z4cgXnEnR*#^ zLIJ*0Zv3yY?)BMo{4{rh5mN=3Qp=jhZ^4Q+&bj_aqoaBBDr!Ogam=HDOoI?E8`o7L z^H(DR`C(r9y5oo(Egf3=BtP%GygVkyU1`~L9w<=Y{$rnM+^#_D-=i%Z5p!*8F96y8 z+BJXa(E7~WV96bERFnl;FeMQ+^kqj7TZi|gU@|i~1F@%YGRB!1GDD^oJ^ZQB-}#G^ z@TL$v{xfZc?+e&^ zslH5=)<8hu&ExIqz`!_s2SjI?6G0Wg5U|EzuLG>Bb&L+ zv36p9@P^>fad+mDsz35#y6c5w@DeJYv!jq372J}ryn7x>f&2QJghplma0b>xT%s#S))}vBcxrO|*GLgbJom63ucASg;wrGwRoY_o?I(6Ppz^tB-1y^rD%*V7J zp10fz0q;VAQ&Bmb$jD;7$a-;kiO20ix6oIO!*=K{J4u-gHwOiMj6XSh2AkB=K$n^2vDS3PTQs2 z+^#iBfeH{An@;awrU)jSgr69|Jd=tflNyjhTHa?9Qw&5(Mf)=|f6EquM)$cRC+6l- zD+f7|Xm36YczCsKJ|cU?JdC?Pq=cz`SLgF&7=8G96>v;FksPSKHovuQr0B3{WSLD~_3<*Rc^>x8u3%iFrMs zmQV8e2KotJkTFEN9}xZ~>MUckvDU5Zm5=tR?Kfyz2oau)w3&lb00A6~UIv2g93FCn zh38(r!Fdn2zOLh6}C9K(ruljA7mF3x(;9ABQ?fv$ozc1gMXcmSJP2tUN{m!*)_B1-2# z%kFMD+y2$Ib};C%7cbm`sL_9OaZ_R&Y0|=tOgP&No}>add>OUiM3eVlpvlkw4mV*Y zLlWmMASWCCxOa0)YD?G9LzF&Dku-v9fEhjI0F|50RHzr&SSD<>^tq~)uL&0=D^aU3 z8H%U=fX^D-7lt#PDR9lOP_ES!i^l&H4YU{lal8-cg<8!un=&U$aHWZE-@t_fSO68c z5YLbl`;?nR9y)_{J7PI>e| z%Fmw>fQ(aZv%>XodnzX?`W_(GMGjzq%m9D@+?(jPZ!k3`qnlYl#MSDlV8naj=Q#19 zK54?%xAvz`a2Lmx=N4;ACeHC<%qa?#eF|zcoxD&`x-X(s zCL!h{HY0GZn7$;EjP++=Lo;-+u?}*WmJ%1&yE$4&<@JQ%=z7Hf;%=rq)g2&|lqkyr z)q&waBsnuPhOVw|Bq3N3$Q4!?IXc#)FY+{MHz3li?kZ!oC-~Zqtd=%q2uQ*#c2hx@ zOG@A2EprY|b2mGuC(h=g#gCQ43I-^h0(yqPYLl>o;*{v`%BH1Ir?DeDCW!ICnfYW%~V}X>GJ-v_1>%lq=Oxii%0n!*y z$Fo?@(E&&5^>OVrI3i*PK#i6SkOH$*uFlBz&<&h}5*yW9jZOD8aV)m48sB3vQyh*@)RY)I$VC)H!3%F{`-v~j%Pe|V#zj)p zI!NuG0Pw{V6dYhuGdfI15!+Mj2*@tS=y2S$BNMUCszS2G;XLyYPByFXk@*)&VTstU zrg>y?G6HcL;vTh>CWcbn^B!AHN%y#hj?w1Ve?PoybUp7Z3nO^q4sh)D6`epgE*Oi{(fecqwg*!%MxyGoB*~L09Xz~r&)g#Xh1hIgWkp+ z@@I>hO3T~c{Fd}ho1bmr2tXgFhd*u)h>&qK<?FjxD8jqPxCM$L@U zWQ5g7W;=)JewmE-+hAzyTY79bd)be0GuNxdUFU}zJ(C61uTmHsE&qG5L>jlEV;UzEw<>O9#0)mw zq81$yBsE)!<}tcbnmIW6eo^V(KCm*S@xT-do+dIfmx2@srjnAVE&my%S8kvA()sH&bRyaUV>>56XWZltq_B6zAQx$;H2>( z!IV_-i>8{~wD4~F!Gs?=5oQFcw-rds2r*QUjU3-NAr2M^bum%MyAoG`;bJ_X_*;-i#kgzy>a;7cyV2N1NbF!v7qn;^+BaL`>z&X@h|Ny zwgNm8-~YgYS^O1KN3c!*Eobr!=<3xN^dWIMAN0mkE7{rEW$O0?CdgtaDJuSEHOBxN zghB<==O-(^&0X6Gn8-#sb5<0h7K>U&0hGQ3vWC@;1CdUx5 z${H=dicg8yosM^iqMgk1Gfj)yzJXL!tv`{0za5ut>DJt1}?|w99XnR$_#H02!It^+XF`3_a6w{G-Wi zmcV0u39IdQ?ZazcmnaJh3s-$y>nhO#pED!M| zocROt(O6Oz(kp~*R1zje$xhWQU(Q*!4dapQ4sm}B%@Y)MJ)+EE0%!`*pbKC_8z(1Y zmKAONwdT{sGlJM3KXw7aJEz+j=|7qTBut*W^<>s0xxF7_r z2fA4DvKAxTiA#JNQp$;x_{?z+GT}xQEkOkW)d|c=Fm2~BV;EngP9tpodSq`=eKLVj<3(REUqWZG%GCXC9@azdl@xA*T{$&k4!9bdz}BZ_x}AZ#f(Lr z*W+=+h~^n4Uef;GQ3^rg!yr@S$LmLy?Y-=X2+-@$J867+af~K==aNT2$-_mS`nuPj zIUFv?Y_4$cnI#W3zuj%4TA^J#(A1p`6Rs+!41$4I49icI$C+8C58i}WyqVaRsi@*A zA^WTIxSA(gm;&^AmRyhZwz_;9e`5>PCnDxG&^ES^$~AcNe*==_p2=r9ss8w!&)i+o z`aYK14yMwgYTFmn&R-N*_h&f|~;b9V=hgap+@Y6vU1&@xd|E+VoUyS z7C>9{vpOQpRWrod0-peC)G3e>E~)cFy1Z}Op#S&=n`&jng1gq^Gl07Q*w$Fg(){Z{ z1G)+VGIGh)jlI47(Mn4q5ZC_%X&^NX1b-we=KYb|$hb8Et^uf058EI?2VdDfp^InT zPzy2CNH7g6>}JRvNhvm3s{HTFsGXe`Mw8ahY*eQ$76MjWht03XVp-#IT?%=^v#dWv z(N;r-Dg>;9T&G)hF#0yPC$LBUv`2Z!PzHTr!aCrRh~;#6!Yy%m8oiG%$t_{!d}t9W z#K5~|TbD>@%^M5dCa29ZsY0HfFL6BgXyco3#!!H26rEBwE*hRQ%tSchBcl`Nu^ z5(5JNFL<;Ipi38*o^FGeih+->Q3R?2>Mo$w5Su5JXz&#mfUDN~-4tM?p+w^xcyik3 z@t7mum*p3&TKPK0dcY}B*{_)es!6QEMGSB(SWLNRwYiQFqu6@EK!;EUo)n zHvekfa)FWA#9~1=M{C1#zgjpG2}MGy(M5g`R8t@k9)AtW;G>1#R2r0!?(&illNEK` zz97wH00o*560z9b4s|W`1TTmL8K!(23E^wxmwz6P6`TbW)f%ULML?AlzCBrS2SS_H z+p=vF(he}*xa8!aG}l!q(4PfHW?{)h!wWCclz<@feL9Dyrlxjt^V~c-l>MbMx_?!A zd>XIlwAA_miBT-Z{(-Q0SrAL@s*`AtC{$w`E0VpeI`kYbI@gGhXzOe8W(;?-{5$r} zIu#ZqM&n7Z-snZ-a^l9K|IoQUJ0AKcLD4a8E!x*|J!p(PzSL~Dn(m)jG$^GbGX z5WmYrYH>-CET=b7`BVfhqWRRF(zYpcYM)|_Xku{tzqqnyTm1c{=|F>S;J* zp`aUCSjTx7mcp!1T7tOQrPcQTXnG5%D8KJ}_@f}w4bn&>4BahAcb9;4Nq3_lT@FZ> zbT>)~NOyNPLw8F3FW>k5t;MipF*q~#InTN0?6dd2TmI?YEf19AN|RrQ)wVFhvXlo+ z*{jT8nvZpU6#_rZ=#)rWm^zi(vvrz3J(Uz3oB$&4pn z1&Ef-GkL*3?2cEg6h)l8oYy^N3O)S3t+0>!K0bo2_h%^HR|jh?cSj}wf`msv(6nA~ zh7GfMo|(EGFGpo&lIKW98G|xIgJ@P&9w@6}O?(jT`Y)S5O!bHxHvBCxmp(N=TLOgb z_SjtUjhUOPc<_a%okIz@ba9y<>EQ%U{I8Y;<%{=*pZqnZ%6u!9n|6cDcY_eDa8)`< zyG$cdQsf7>d4ZsXy>E~=xsRHbBdo8JH>_2@#hNqK+&Gem4Iwa`n1P}EXEln;gtyjA z3yb^1!`LX&_@K*J0`` z@!ngNlr}x%S1d_%m3Ec+^wJN0E?KS$6DA@es$UBxzS-t!<)fw8zP>{W5>waGqC$L``FK&# z0Os-z4an|H;a$e}Cm|x6Usr_QQxkRRz_QQAb%%9XuihqC{p@ECYfjH~JEWOg5Yb~8 z(THg_;|ehQ_t_(L$Xs3FLjsNbu%h6={Av2tyKfuPIO?YB$z!d$b%H)a-~Pnpf9(&W zL$@eq)jM0NfcqKRrC|Uy8sFuNd9*^aKVBMav7}3u#c~dNCHr@DM!T7EXy~}2t%0ZQaYj=T*pHzoo1BSGV)_iz8&)-83DKc2i6SJ{k}V_s{3W#kkUh4uIM2Z*ny z+PCz@9NkbT-R~;Vhl@>(>rDE$5K2vT-fqh73WhZYcK*JEUiGl*mL*y5v+C&8C+J1A zvAedMk#`$c{VZfah{IYawbrv8^3YA8`{lFhLP>i@?X_Xrq}qAi^IZ*FGcG>ClS$8K zd8%|*=R=_g@6r+^iSXQ3p_VrdF<*?td;%}dFItRGBgiPi#6{`%lGi*rKvr;p4tiffLR{HmriPevCUQ=~;8LYfg zR4F-u00R-EFsJC~e5;+%HJ9MZ261?Ae0>>wSq=GeM%Ed5{jJ<0F?n<7>$sgb&rajqJj*DdR5uCn5)qON2^dNa$1tG)xug8Pffx%%auOjZ=0|8sXnsC zgyln#I%ST?sH>abu%-7LTpHP@$Zf2Yr#ZE1DX5K3{)e#iU-5j9Byvqhs7ZO$tT4-Y z>&0zce|0$n!`%BcdH)|aN=YXfex0U7ztqh8+TDcD`eGcq@U&J>J@T7M;<|sJbS2ZG zW8ekHb;#p{Soj@}#+$PXd;WTF@e)Or>c1ox2}fT1;Nak!heoMcq56mnk2g-PWO7A> zvTfWiKK83hQqDkWN#(PeXQM2C8`*yrt<+B1`%bSA$A&DLR?drG5IUUD&iOIq_yQR| z0)@cMC(>_KN+rME87DHocr!qzHj5KMMU-Wr&=|i)Ao(y@>1zLciK8w_Z(D;{QUK|~=WR6m*3~$R|i1%G~NxQx3m5BXW zI4fi>IEAm9n1EeU)`nNKom`NaesrWrs78s~`Z$`|wRU=gl0m<&jDN@>N#duCn{hyb z8zj*kU0iJA^}v}H_RPYI;~$r1>`*7lxpGWh>Ijvw_t+|V zkY#Hjt^wJ~Sq$XI9F&q|;D+$$W<5gi-%ifOolHx>gJ zW^iE2$LG8~y1YD`!1S@(=SYva$M?W3Bs|v4W}J==1(&;73Z>R zl#rjq6sEqPQ?A(x^=5H~WxSQ8jWHUIqd0a)dT0?I&<{-59{*fYIXSxJM0w2Hbj?r!bHWgv(_#+pZmxv19-oT%N%x? z<`nHYOeHI$iVm76OMI^}y?bq$^htCIdj-jM4Kz7`BVGw^^5^i|$&R?`=4ojIWN9mV z`ySXi=``580o2yB4uxOV_0bXTN;-=*!*&vmnIBVlu*#d% zp9-Gh8gfOlV8sC`GnSVG^StMYR?09Rv14Dvu@LT-@r|NMRG!S{MI%Oj6AGPREOnL9 z27N+$_$?s1G3i+b+gkwBgFkplok3MQu zD*0AKvb517-?M&C%6!O+@pS#A=XMISw6Y^Rt-0$aT``Z_?fjFO>w>^VAet#{G>PjX zi?5)lqWkKX#VxwL3;tiR>(2~aLvg7W{?)wn=;Xc^D*x{8Ft9?T#Be42ZU;U&flg~; zZcfJ5mMQb$z{2zXw5Lapp9MSYWWw98zavIa90*a&3!vfLECcoiUutY_gr*;0`Ho@Y z8Y)P~h_Ux?6>B+AQ_w%>rN+|K6gHVV?Q!`NC}@1gela=w)+v{mCho5tSC!2vW%=X6 ze#6!LXUC?cdr*L`HDNpvTpv`+98ZX6Ga%n8e=8LU<;8p}#QH6Ego@y=hIO}={Z=hw z|GUpN?<;0%u3EVrk5-sFZAAEBLt&fsLF?k79oeiT#N_zFbi@*(yj2G)D}D1YG7Eo0 za=1RS$uq%dRg{~*&LjnRunmff&o<+f zoQ_A1w}yCD-m6mk)aY~SY0KQLJIBcV*@~lFYgVBYFcxnzHjU+jZwi`^FB|-)eU~fs z0>hpn!t~DFq_?L}>NS=NLk;m>{XxzfrzN_l0>jq9DruBp=-e} ziWaK++*cbxt>ImoPXW`YHb$4L!MWA}@maha;Ci&F zL#{3(iTn){AU?g?KOj+2c=!Hwz9C>#tT69MN34+mr83fsl}=s~4H}SW80b4F<}1~1 z{9*CQFGc?<@xT4AJ$(|iaceU^drk2GH|4*+T-0TEIA#;F5{Qs-el zSmbURV9>6E@|?#0&nbdkCUMh<*p@NNnAurdY*{QJI@^ zb$#SNCC<~fKmo_PNtH%Rrz5R*@w5}iQU}D;QxhR6Llou{rG?xM8zT3w$scy4*wPKn zPB;}l$kO(`f}?MH+t4NoAmqS&)%9~nFF6!Bk$+f67ss0wEuPyh?$^2IgJO=fHjGNY zS<{#wO&p(kTURpU(z`R{Atk!M72Mw_T7wZ3i=EHcp{8YH*69!QJkrM*|DBf?20J;# z)aV&-r%+8KODR}|>Ld$d4@;2Qly#sK^g+I4ze6@=jieyyDn^eGOQrbWof;)UUc_s- zb&5@E1i9j#3rG&GDLs!Wp&;O&%5WjM$TCK$x z|9o4~?){InA?Pl-_`!MH-jT$xX=Ta<=j6QAC%yjUr%Ke2j?Pv;D z(G0kBvLw-oJJdSq`Dz4@dGvzG^x^G&QVC`T-VYiEOK0ql9xQDKZ^iPy<#Zy`tae4V zmQA^x*OjmtMwrGcl3kg!<4^S^elWzzn#gom$3>+ z*IBi-KY(^5?bE}a7FCf=%hSU#`S>>Inl_fbkGH^{B{jkMTopXGRc49$Zi9!bptNQ2 zJ4KnkUsK`d=O0B<=I$9vlPlKto4*Cav@3fuQwJ@Z!I__-$ZJQuSwcwTP)-*AJ2ZK8 zj^F&Re`yW2sR(&4JUMAnk|JVxT{4a9H%s^7n!nhyK7i=%Y?O}t+PF+7D92AJrs&?- z44~LFOgi|I=>tKimKRPfU}rhMZT&}IqFH9#7fVCuf;rvSO(9lAk4l#jCquA2Iqll} zbZt&I!cyB?i7}Pn&Qr5?2_p!-X8my>rIpa3V<(}N-4XacYnjSelX5wkf?P%UjA+*d z|3d@W1PRJA|C?yfIF8+-Sh3;EZ|~6~iaSbsS1}wO^{584M%s;&3H|<>hz^^pbf~yg z!Q-pTr-X_Q8{w+YtTaHd=z6snG( z4nMJfy0XuqZA&mqKK6kL2wu&aTwGtP=>uY*)~6w%>%|YAw_{XaIFeC85y68YbcP9< z+xHTAxnR7&F>rg6INZUC{^_p^ubjiD$klR!tRsTrQe&p7wT%7FgX+qQk0uM-%(!e& zs;M_L3&eC)BB4J9jo5eCQeDzM;%yv!UZAf?L&jL$_@IXCv_{`xh)9D;$+06PnK#V?QH+RY0g}FO&PNf{Sn_uDTc=6s|0#pyhGBb4@;Q)$}#$NfPt-bZg??153#-Nc(b$0 zN0GK}(Fq0Ax97tGF~s(NpxdpXydu(|BWrt2z6q5gGXg!OI3*T{bs@Xf2RF?!T~~EE zRch?Dudm5gmHhwV0H_m|5>t_Htcc`Vkmz&?OE9U${q3Mi9VG1@FuKeeD9~ZL!3Q6Q z^)V_wyen_;Zc^_eSmfGbwd}nSc`vxf^Fa3!HC}jv%@8!A;9CD#X ztdg8~h%sUX0lGGdGeN)04<=?&R;7F88BR1d3hZ4J)$AFgDNgxV@dlZ-(k_D(mZJ32 z1t}*@G1UAqF}}fYvYKL}AEuGny=m+y1w4srAGgd0qF=N#$IqQBMSok2>uP=6Z>@IP z>i>|TrV$U=^=E(KFiy5p?Lqht4Grlz4{??1)CA|}(~Pv&&AtqKln8Sp>Vee?g<=4IEgvA%oc21PPg4KmhE*T&+R${saUbZ}k@ zOaFfTlK|r6M6qRNEMztAhomtH9oU4rVDrblm^llaZV&qa#dQiKoTMO(E0y}ri5e>& zwea4yEOo@E*zV;BcU5S%w3O6q@`J^;>AGbEHT1aBx6;^Tq9&&{JO$}1Up%opFN(U` z;AfxngjVZ6yl0Wdu1m_le_rMF>&Qoq`^?29B{8#)V6d>p(|U`>(sDx?7#KKv=r$~P zE^pUzYhK>CSNtKs&+l>HJ9<9R1tL|+A?ct*^3;N8EZJ_#k%dGQkJ7K>w9$?vrVJf(F8MY`{lusikANEq2rT( z`3e`P7dUfcAqG04{sU@VGiO%ZapeEZN%>nen}So@wW$Khj-yV%%VAK)x4^r!dhg z<=hKL`R_-t%(T&WGe|EaW8ZMi%r!*8rK0?re1?zirB1?JtG@{O!MqGL!Fw#{!q{(= z+gQp)?-=u3HSuZ=Y0Dcnd&Tm4PaQ9(wBi&CiV6!?s|T1jk}Wc_ii)fzO=x7+0Sseo zY5B~Pz>euT^=eLYU-rD;q!U>SKw&1RdD~aeWu#Ki(zp7W!bt`zaO_L-xTI%Ei1TAH zX`Jn>NVR)JW|sb`V}!Vbx->?<^mU%JJB`d0owCHM)Gle)y!79+pN({B^m*APh{FeOigl=H_=f+>8_m0QU zsjv3pSMT6P{n30Fb})x1ZU!P)$Nb$RG3dK&lg}7#t;s%`w5bEeWn3zb-J+TGVHBCT zeQ2A|4)zA=3_VChv%m+FqOdEPEso&|=~!H`ubdzJpl#(mY<=!IvYzTP@DllrlTs!M zcm*t$X-DN5)r(&HWqSS(mpLuJfi{QC@5bmEd;w9LlCSdVQ_Ph0766|u*4nG$BNo8& z$A~=gF5P((-1v92tn#O$O9i2=2=d6ajs{Qp-j8h+m&RTc$e`!ST<3;eQuoqU+dQm& z{E;|sRp?y3vyPxU-;ZVfMMYGDi*gP1L!iw4BWIR!Yy?XqVxU1xaB$CVZh2!YSP#2D z+a_sKEr=C&C#G64!j}+xdl4?#HbvS7z39V*x*BJg;`3bf@!@Xw=m?-~iNcbIs96uIvYAUTc&G(X_(3=jc`e&Y`o-(5L9 z*C`DuJeT6)VoAI(&}CgM*q?XeC{ayT}g+|6IJxrV6ZyBz->M$MMHyJ2X%=KksTNq;2Ev7_`0~ebFi|$ zXC~l|=}A5!3TQLgEz{7Z;c|RJ!g@TOB>z@MbIDSF(~|L?gva*);_ArjjTU0FrPnx_u|0_Zf+g&l6ma5m8z1d>pnY4>o zIp@E~umfdse}v{+)(dI&GuS|^nX`8H%+oS<``nAH5Im-p{*MblG-iq4DiXAkX>Ry- zs6|M$<#q}NHA7=n*3?z>wWUINqxZK!E3>aUPfm*IVYp)KQS>$N!8gKhvy_78?-Tp@;ThqeyEn zN#TY6PeQ=Yh<9vkFvl?)vAqW7L+U*==z1iQ{En~xZF*=mbRvqOBsV}Ol*oZV&!bdW zP?OvsHO8|Bc0PR;ZKmpS_MG}(GaXf-efZZ42#n}}~Nvv!JmtvipWiBi?kB?*H z9rSd6<*wL3J&6;PZ@oFuv92^gG+ONiE`w%UurRcZgO#|XFIcD2h=;GRyxizYCu&lC zB)hg2H_&MPjohc(ey#f5{M2Z#r^CgDIPh^&fXg1>LZH9=`k$+->$A}Tpb4A}+55$5 zlxRlnw~TT|=?N+svnn{Te#qug@Oc}=P=v@&#idbGSj+iyaO5u-kPUmsDMeUXBLV?(pUA)k3|(EH^EtO~6Rt(>X0lB(Oil|yeepNrfvx1B8Hm?i|t^}i^>>IllpByuP`l~WqUXqYI%%kJwuf^nPwSGm#l7b0T*n?Qen^?}H zQ-s?^uF-JD%0G*1gS*NiZaRY^9A;zE8aHoexD|9ol+?vls0mQl$%#x?GB85l8new; zB5Oiu1-RqTO2(qQEW50$K_~H{qk2wVLsLytliONszi9KIW`qoj)2}u2IV%AoYqjgX zCYUp-XyDZ?C^$QF0Ol$z;iKIe75OcqpTE%y6@Up@at0gKL@G|=9Lju;h_Ga@Ph;NZ z9NZf3N_2RH4a3p^&LQqnuHTgK^w7l=M~Tg)K!r7cg`AJ{iUa;Z2jO+>fyc^-K*jah zYG6}k668nx4^=IFrTzOYpR;Oid=^WgY*xR`zDo&cZzZFcyE{*l`*D6wPGEUCGrxeq z&XZxNmS0t%3w0o**fKmgKj7yZ2Y&q@|744b3k%Bfqq`@FlSTZ6L3vrKT@{dM;1veY z+1-{}!V#6AbyLND4jokPt?d`Ab+;7-4M5e;Wlp78RPXA++2V59%Gy*81y7f$x+g)> zQAG@4{{}}nRvF5$uVO|To}0C)j;oS2X=P!c@D9dQ*lko(IgAa{OP!0H+4?zt_%o~V z$9W>ls?zOs!%@Xk^Z<*F=RsT=CFn)Csi3l(VLj~kYZ(5kff#NRBBN4oG2aqJ#SU$c zDvM71hZZOCcbnD7J=w7y{(u=rGa~BK;uW#3uI`Cf4_ToXWmL(oVkkvIO$`Uc$2;I@^0T?wcasC)_OOJCmG)O}^jIl;wM^s1IprW}G-Sh=Xxm{o zYTw}Ab*4p9mgG)&9^I{6(>n?jUNvZ|YmIzjDKm0Y*j4H2|EJ|9FHLR%_%pF10~hW+ z(qIgXX4z_Lm zB5_6CWT#wML9Fq)J$v_OTrFlpagQ^FAWc#CAmk$hqiUB6VURLccV`Eos}J;8f|g7s z_T=sXkjG+dEdJvgsXYJnvKW#R&Yn`NyvL!UWdU1sW~iEbv{{;~V~ONbZ6hozh_<(7 zX2DU~md-uvj71(ZCDTFBc%?CsML+*FBwPfOraZr>+-=Q~_#Goh&CfO&o#c(AcM)Ws z*)e-w*SPvq7f!o*iDZ=6&J85?&6oHL~N7MW~x=zE2!%7vkNeREm4!AW%iJ_|EA z=j|V>4yZBl{*U9%i%*BG>7y+};-)$@Btze&w?gThJL5c!`vjrd(b9ra)EN}e!K^}t z@KW&2^6i$y<4x+}tnEw10%$BYb~OV<<< zDT9?HMOZ6oyH|%Uh4WP+I$HmeV9OZ`S1ZVpit5EaO!STG@TTW?3d1&JJ zW+$iTI|T!IiXxpsx1eP*k<8|DD^p_uyzi#T9+Wbi(6`u1*pc0#1>+rYNyU_mMB&+Q z8IkpcKHOi0!B-ec_NE$NEbLPUbD%q>g&rj}HjxX8yy+4VV%_(Y8# zffdp9Wo_r;?92&(o|d+@TR<5C14-L_x>SeC7Lx>~1i-jikRx8K{PMlH zaAV`deG4i!>yCv4uR!#WfyjZ+qOsz8){A<6Mx;^BKJ|KZ$A2gpk=HCEEh%LnP--G2 zOa*F0N#k$XDgjXXHOn+p{;1;O-f%I7bP8x>^+O=VfhLDr$*aUA`J$fT(s8F@n^WbF zyLp5A{5H^wqK|&V*DdaC7kV~OnGgT5?z!fKw-sgE1jlox6ea1KN%{IhvMYPT+O+I% zUnT{=${M3IakH$KgJ}CoqVkh+KRPX_j1MpKnfPi zRefh_=0U8*ccP_|>3l{|dksa>ccdJ*ALXKH5F*luEW6<^QC{S8`}Umv zq(=@jjRo-qfxab)z>1da+dk`{RMNme6e5&RnVYDJd1`rZbMX?YhM3eXykla@Yb*|* zZ{$}LIUoEmu6j@Nbo_b+=3G*dvd#!`f;`)qWJ^Ry`ZD1nN2wR>?CoXO)g`vIwLvd< zZ+*zp6+`l^05KEP#)XB2h9Kh7+~%$HybpiX{{H=JhayjlV*&ZtDOFLCQ|n}|fk}jh z7v(@LCZ+YJ$|JyoT?Rr%hYj9k7otQqRYa~jKZo&>8g9^g-ocF5xG3B%;{bhXc|)3V>4?X!RvyzzpD>zo{VhU7?buz|{(dAe)y^tnWv(n?XL z(`EEyE18GUa8Rr2IC)}8sHmvhdPEj76v;<3H63q_xhfgg=sNO~)RUn1%liC?PpC9} z^s#1OOw!N@n%NNUB=WvR^B-ZPv&`P6q7kTV#HlO;>**&il-C@XrUERY~lBj zzD;)Q+fsREM(9YNiyx*jEEUe989!DgOkI{bc@Qca(HqOoF3D-jngYtxHTqt!QdL>UL71z5pa@XdiiJ6Pr`jA?7(kcD|^?L+hL5yx^NN7N0_KKa)5xr zoM<)ZXMA@Rgw?*4Hl`}jr=_`Ry8Umz!U7BfUe(2!CBJ|BW#yQT02LcKC{&yhK)c3O z1Y?#z#3@DDld0onp^62&N4u+9PZJ?s#^MvamH&;8s^e))jS^pgtr~oqoW3t(xjm+A z-$N}N`Q^1C{0xlxH$Iv^!i)wLm*3_8%Q=l_5gs^vavJgw$)J=_l+M?q&(PLs3&%|+ zOVPC$V{I&%QJKR%HW^McHnoH9u69Mk_nJ?)}U4OD{k=1_K_KO^Qg>i00zr z@V2)00Y%+X^T7n;>L*GG+Eg6teej=vKOEF+xyWOQ`ux8iITEv#!9_yAK9OSeM0TH) z?i_bA8_Vrr_UoM94d3f~Ket1s`!uL!Wc2d; zH5f`~?-owdP|)!o@eUaTFXWK`OagiQMf1jI9|{z7c_f5DA28WxzR_zI^0o29lVvz~ z^=p4OwDP$5KbB_o*#xfltZA#sGr!*~miyDUn`d+s#STU;|J_%EA`TnHnl7AuP1#iMdgSll z|5gBpBRVNyU)pA_ItYlcWA@WFs?tW_;r~NJi*L6Uis2EYE{Sf=EnzcyS^<12UDP4i!b$rJRr<4A6uO1Q&fHku$#E~-}0N57&~w=wYqeW9v=1vE5j z%xbI1HkUTryF1lCk7plV)$K2}hGF1nk}^2 zh61YS5thg@e9KQH(qt-5FFv#~)a%p6tq#>?^jN>Mp_mrJ6qj62Zzjj}QA{`J@m>f) zwtJ(rJqkg%Izq>rRD{Mmu80J@H6);!Ij>?RK%KSuZ9?vWtx`*m|BfB5=yPeVxzU=K zAP2nM2(zG5!{<)~pZh!4Uj@;@6vR99>PvsEx~0P*F$;fYGgn&^xo86{F%r?$48G+<(IYt$WMAq-R%;0F6W?7FIz2x0pB%?z!Sm+AR$nSGgA^5|=aHpU*Y&^up})bRC+!k30es@M+CTC(=ecqDX8JG#Ll4*E6Y_E^^MKOIWi8 zmxfALhn9xZ7k?|2?(IK$GSd;$l(;~^3)JZ_9G5O|?xfU#a8sGrWbuB*Pgb>SzMKxI z%P0Xaet1ZOi_FH!DGsnbkQUKHq_FK?2Z{nUy1R7yVfio_*&nKaG3uW)`|n@#1D~A^ z|0wepB}1W8cJ0PI##Kn#HZR-Scptne59STRrmQ=yIgD$Ft8}9fyVdGAZK0G>#^aE1 zDePE2S05wR1UAhideu$S)$Z0i7#nGU715kcf+@QUuymI4tvl=g?2XBR99xJkV6%@# z@Jh%lkPLvnZ9kEc~1qV9Hk2{2k6zKo8!*Q5Zn6;&a&*HrbkBoXA82R2^ zjV&$?0!OwUy`GPl@F3L{m69~Y=z4n#h&-OgG^_@opnEH5XkdrIgBi)qgWt=qe?xD4 z7M}3EYbvV!^k1tQ5c-9($L9VdE!@eT*_R|k2t-fqh+MLx#8x<8HCb@vkK`qlJmAJb zPer=>T4h{ESd|pC{<5rBrVFX&GEGfGZ2cxXgKbOlQHLh#Fr-8pit_>#P($V&<~1rR zDxzu=f-dnv1*4+RKZ#Sx2t^UXsMOEC;8`cL5B0a8`+yVc+6F7gs1wX%7pDAFP zC~Im0-WlGnU%vo63qWQ>_?I}k$2t`=8>b#89)h*CBt-A4-41oxTMxFwTXk6TuVZO~ zK%*-dYjzziid!J71X0Z9iAmDvvxr~w+UFyb`JrNp*DM+$Dgxm}^CE3i4!^ELJDtBv z_ekUZqeyHQ@+z?-V8X7=st*0>mri9;lth+}sib57LjVSmbC2-Of3aofm9YNUD4e-; zN(pm#{-w&PT)W?ijdMW~SF-%^&dhaaFisRYq@eqQQuA8uUdQ)CNEoN{Xhn+At<#nfZH}n{+x{lxltB$Qo6E-{vb7+{wqS&dn=NqNz*e{~6 zwRK0%cBh%bkr^us1w(tVOYgA(IOcp{IGZ8*u)Md_wM>lA-TGd1L z0r1a&wD5x5=?w!DlNo5p0XVk)9rm0Dc6a$U8vu0!MAU4vHxDT(sSPlmdmh0Wvho@i z0j`Ul=T}S+Tbm>mH)_oLGco;4&AYN6b3* zYsoMZrlAr#W8pfRmh$uT{ITDE2w&8m;x_SlyV#Rlx=!&mVpxpD>X<_4s{?2m2o&fN z)E-YXvtGsYyfk5*?PY1?J&s+=t;?q0xR#m~`9WDNMTw;bJtGP*($+)vdXZx^8#}l3 zX0;Ekqs>jT$ynUr z;Boku@BVcd{l?ht%T=!?1V_oxX2z-Dx^{*q_icuDs$F1opL*Kf2x7AwppAR4pB~c4Kf)G+cE8*etI-i>O9`c7P0G#@`QX$f z&rf6W_lpdxF((l#QE*-FD>ziNu3jSQb_%S-h0qDxzq{3j?znUVt((u19n*cj#DUXc zf#Z|ukM>mnUOxJBuGn(*s{%TNuB8SJRDur_EpL7FnqOGZsWN_bcz9@1o&*ki(*~}V z5pP(8_Z+LVBY{{plT^U%1ZcH!&^A4{zxq)^S&M0Ncy=%&`F+gLeek&dnBfcNX$sPS zuirR!Yp$3%DoPSTfjTvdCU)od=XbMHSgXVV8X0>m)+zyE}XBTcyz;$6y_JVM$`&a zMI=JT^E$N%B<Y|KU}j_o8u+Cu4GMeA6Af)dwEUgNw;yQB zW0e>Y1Hi^$$cfzXLZsaxx74750uhraoNd;&eU077Iek%c0N5!`%+7}Pa6smn@COPP zhF&AVzkG(2_x7wa{2x92u4*!|!ogvkTmd;x+0}I6r z{03koGoSn)zMHToqdwaK0}`VNtUTStZf+no&{sSgip544m49=qw47f&FXI^>AImO~ zXXd6yHXy^LDNp;gQIf?q%H&#Wc+0fK^}I%%$2$}?@8&0!3@rt8gnqLcG?1Le4Y=Rd z-jg>?M9zH9s}qpbCBe@`uOn<4i0m-yHfFR78-Z73&~Tupc(?Tg`BrRx!`VC^?PmG&kEI%$jz)FS>6Brnq93p}XA4Gj$%vOa7gd2sAfr&Xa8xlOLg-G6Jn|DAe7 z{z;N5m>4AtR`Z-oGY46SIrCM>!neL`x_J3hpnMpgpAR2_rEZo8awR)W7s>2ll0YO;nFmUe|m!QN%rz6>b<6nVqQ_jpjfZ8^LiS1UwgLgAYzsco{0*!Wyj-EHnu>R!(rSt~cg;?uEIxA? zt>BOR&-O`W=|%>g&R<*vmAI)W5xwLkh4S*ytv@eKPR7a`v1PXyquhw zi4g=~EdW2vz??ONG*g;-_Sfe(-q%NYU@i!J#R2Ti9qZ8yz)Kpr1k^V)tOTIa{gIdm z2A&E4OmW^G%xY*z2F5SSs;cbqiToP`{$6RVNjr4oTpQAqPK~cNMX$`FGY0GFsXdt=j=_4_g+cDDFLJunMfhI%}PVz+>I$TY0nYt!#rFQuA z15OkWAI5#OZ^jF3d#|QOuZjEb|F{4+K+?Y1xL*#SA3my{=i+I6ydCi8QBeze07qqe z&LVRQFp<`t)tvdMc4GgdBRubaz!8c~OV6>3EzXHteh5@>*&PNE;*>VCm0zFkTA!$h zqMW96ET98hpfi7-m`^AQL^+QLC4wu5r%sWN2|VS^G!*-b(;z~}Co>>$D(MtwmJ#g_ zPvU0jvBUBkP8s)Ek-fkm>Q{~6&EffMDZ!jWtgqJt#hf^e1bVb1#h9I}sR+r?2!8EJI@%cF~aDh zB-sDdFp7JqiM&Lx!RNq_`!ZM9VLYv(Zf*#4T$2c z|E4OW3nqBe6%&~C`+J11*veb}S=(?gNDBbFuAMaT6Ueo6D&LDRk~fE3KKpD&d(R4(zpmkiNCGwJp+XUXCbY{9sdh z3Cwf1rb>J=%&(Hi#>TRAe_5-SXddQVr}Nm8Wo2anXO&=ZBRj9Pzj_Ah^q5DMV`V6z zU`)!&$vL>p3DzJZH#e8kgS%hL(p%tAvG1U`||<(`J!@*f#fQ);D5VWw10l=Jb!r zp9@n59vZ?s(rajcyD0Qx%Kw>Fo|k?#9>n4s-2{< zw34g*J>EU9Tc&|!{3Q)fJz+B$^_xkngfPesPV6}?!hB;R>5MdEq5Mbj{ z15z@uk^Nw8%>Y;p`5^c>KTk&jIh={1;r9Yqc0oZ%YpclP11}V-mN}UpTYvEUM?mkree*q z6q8S5UYC2#&d4e$DCKRcmkhEdV7ht-OR z%Bi8bx*~ZYs6uROSvlUE|M{^7Sdu@jr;48qc7Z`DAz1qi5&!7sW+5is+MoVUk8>!} zlarIcu(G4KHxx|OUpQ!;u7($|uZoZJVl z&dq*BE3e-f;%onAY1utS&RSU`Tl-MKt9PduuDyf3km}{0I+;9G8R@&6|U*(O`4fR zeH7{Qf1Gyyc#wAj^NEz(GWVH2S-3L}9e5}3(|h_5w`{VS8Wc|m7LtWC&xh6)Mw=x( zN7!|;6Naw7jfF2MQFagYxw`WPoxE5AuNdWJr`tKpe`4$Y{=LNX)9ZXynd0@-v&zbc zM@Ft(FKcAa*Am_-EO_eszhspmwE&{q=IsI5iT2DuG&gB#YPyip%DB#wnw*?#Kcs*@ zI92Fdi=l@r>+9b?d3$?!csNjs^>lX&IZtS%s>D&0bj#S|lJJlnixcgb zXM9xJ?QdP)*^z!E{qZM5XrJ93aut30YcSfRyUg=6gc#1_$H~mh%y5k4!BXdzmiSwE zuE4&36y9opfSs3{OElF)!*GYes@;XQz4c$>6pOchQCtuf6#e!&F-ge0{;=`1@%_SZ zx3WoXy1ge(@?0rMGHrJmJ^B`>yPRVm2nS!DPLeawIn^fqL+ivOogBkR9&HMA{4FUhRZFBx^!YusGx0h`m4o_{XeU#zrUAo8lwu_cXY7g zk;qi2Wbr!-G$SmM?g5?MPI$+IaDE3af= z5QqM^-_q6DXeh|A00c>COpswdc<`X!J4>I4i2W%SKXqGcUcMX#TNXh>Ad;n-{$`9& zSw;H?#CO7-=NQR&czX6<{fXfLl`qfvF^F1H&E6PuM+pm2BTmhx@G>#+9NPSi_m!ST zeD$6geCEBrtUQ^V%RP_yHZilKf6@U1!`RR?f z3a9JruWgtq#Xj%Le_AZ=_z7t;Pr1wWAD^4*^gR?d4{K@V-;A$)5A^bDaxx?*$1Z$w ze0)3>ja+x^+IM?NUp#QLs3|16nM<33iSvww{9g)^l9G~i+>OfK%(|a6m!LE<{Yy78 zkvj5ymLqLwWfru$JN^U8@7f5sz6j^J$X?s+S{uGc{^;}^K}*7=tBpGi3y(V*M;hw9k}aT$o=UVzi$>;yV&nkIh9l6{QgF!zI8zAFDOe^?3A0 zfi=2n2Vgp!v6WSDSlC{oEo0q7mS@kOk4#8_u@EnacFS*b`~w5?5pS`uXJuu#W4+s6 zYli@Tx0JXpY?SHGESAys!7Z?eibhth@25KKN=bHzUD~zj%Z^7y+V86>YR;OwkELjE z6DU$SibtZ!t*No`H~M3v(Lx|F&jCipOXzKhFef4+0(yWsrXMv@caU$LFyc;0mt*sI z{+YUOZv=(>m)M0ByO})^$F?Uwbb+Ri=ZMxTn7Co&J~v2K8@~0m;M%C`lCV!QeO~%_ zNmYf)uDy9`ndgz{XgU*i{KSbc90EbKE(T*$MJq2$aNzJ3^6UF=R=&{wiZ-Z!|Mb29 z*ig^VIF6|{7tWq7-{l?`8y5%fxZj}|lZC_cPx3V&Y&&hKfe%rLI`Hpj)8 zSA(`ci$3EI(G$;ZtmnNzbAn85Rn>iLRO<(4>lEgNrRLm4nqQae957r|ZKCFL%VbrR z;aLMsUr*PAj0R!3ymr1miB>ry(aI?^Z+rv219F$Adusbi-IXp}ILq;bB}$oFGnKOa zwe~9zdZ2N>W_JsU8J%A)*7o-mxJvR<`}c`!1ao$I@a(zK$2qxpBHaH%MVcJiC)nkT z+;uM<&r;{2L0{PU{PA@fmY2*2)n5fLlr^!Xcx9>k|92!4SKO*L zk21+b{dzX+x#!VY(hDpu><4x)E$!>-S#BtMinf0-`Dx-VbK*(@gLl`2JWeKq!jaZD0 zjqiap!T9R?rq(@ytxaRmhh z9F#`%P#ydBY8P<|bBq#T8WuA$88%=PPE%cvK=p1I0SPl5Ic4*!+(&xDeum+KFjory zITrQV^R^+08CFyN&yRp#OB9;a10GZ(Q&2rn8Mu4zUU~lL9d>05XnQv}GZT@JV3eK4 zSu8mW{^HjxF8xHfhV1ZxUQ&bBQF}|_Jtw*n*z=ep8M$0ua$xO`&~n|c)l{V?iBall!AV2 zutaqO{@xXvra0;4E-nGiO_YxO9a9In6g+jRroTVo5u2i^iOHkUQFA-H=EfM27zsy? z*&BbZ-@YyAw{tJ+nKMj4l$g8~Y1R{8@$1*GaxB){(VaIib;hKE^h(xd%q^MTk@0-a zu_IO**>5S=gB5gt9HHx>j$bvmu&Dj@*$>11ZZ8$UyW7~<qaTAhaZ>rY2=& zh2`gqI8U@CVm6>ww*J)(Zy(klx36i-vUz-fgOWB$WoNw1MK1rPwe|77>CNtA8%XKI zN;$_m(yPv{$nz-)m~y8igcfHtS$w2Vdaa?OlLm?|dh16d&RU^OcLiWC0m8tj-&uF= zlas4-VH!mb-4D)_BzIS4S>ysJS)`;G9UUDHpR%c|3ObmfmC@?mk(H8Cjd=G=*qj3W zNAJT|-<>ms%OQdjo|c7+Ys@di>P$^{HzA*1-|_$#MH>dCXnunW7cRWS)!uhj?ZKe^ z|15GW&w(Vu;n_Q9RN?lWkC?OrG1alZ$-t)A`_Rd~xsJjqZ!)P1X)m>OoNz5&z(K{) z1#0z+i!)eS92>JFkb0tA;0iRlyYs(y;~!kRc1=o3>TQ~Whi$M&hl_oH0@u$zg}c1s zn_Du6tBc|km83iMsDguWg?MrDRI*oZK>3T}@b|X8zgxbQvR9pd@|QK7rkaiYIrAB7 z11`6TiHUc1{qb0u@Igd`1>69UL8CjN zH#^bJ3tT}QABO?~)3C!QiS9@wyLa#A(|gC|t{#TD(_k$xEt=z*duP|>`V6Z~Y;Bv~ z_j{qeKY4t7d~!;Pda;AKq|2X6Sh;xvMO*Y|9_|_ymXL^PX;IsxT#u9cl)wf+7E`b- zJnHg=iwEt<*sv)UA4YT}=T7PFLtMMQ5>J6aGAsISlX;?%7q*l8rMPB@0psl(wc?_+-c?3o~{B|yRyO-)$| zO&w_#2!udmW*jQ95AyRD6epvDfiO?uvNR*7?4*?!VGQ&$+@Fx)Yoo4!u9$UXqvG+*lljm;x zV8YOzGp^=yAS0ZNXHYg8Hoz%(=g{b>k32ner0W<}0bZF0QMD$5Sru*RkxwE-L3Gs} znwc?5Fa0F1WNx}OrSi$5KlozmV8S(%3tzQ<7iIWHA3DU-$#G8YI6US%>+jSD&7KU} z2G1gh&|%Uxk>d}bJX8VJbo0kMZggB6YKl9}>=B!h!HprJCmua|r2oNbHy#mmH}~DU zWau~gxE`jnn3<6Q$zVTp%1c;1!o$LGPIcw^fkwCDFF@DyUXG>%{I?{^NjUr_2V?-? z0J>7fY!ac9CsP1^x*h)n%XU1ve=(Y`vaW>z%|b!PxULoQ0Z7!=*Ha*-VoV6|qtOK= zCGN*}Xff!_H!Y1*#G>gpK32+O!|c=b3V2LRObDn6eQ0WW`et8=1hP}SdCdmq zzJoo%rv)pvcCZD@8eB>Y{;W>h!%pt|PzT_Y*j#D%CACjpo>2Gva&iRlhQ~z~{wYRP zykM$;kDx+aK&lB(T;0&H2hszRv|ClF`?5pt&i(uM6ZePV&c^_~Yiep%*46;dRY2i) z@82&lyMR#p8!cRhfG*kD*$Ha{*j8|I5{25BjHcPlo=x@eJ`$Ld@&ybP9_SYkbz8c+ zA6SjCwRK2J%5lin7_$(Hqey%8BgG5ELa4mPI5G$yPaZxjM_cL3*f$BUjTLu#qbO3I zLp1s6vI1-y2O0Lbli6CO`ilAw`n}Mm-$l(xc8=={p+Zb{a$-auev%-1z)|BJSx0v5 zV_dPc)JM%U3^!KBn+Z@HU2grdvQD4@>=(^CZi5e^&_vnM+8Q@A0q2$BmI!`UTN?;s z!8=@xmNfb3y#}pLQCF7%?GcC(E7*^pKYu=hIE%*SWZAp|Z{ECNK$r)#JkG-6W8ImJ z2D^JUSBCb-#>RG`eKt~{CJ1~9TDR|uIZFBY`VxN_9v)uZ8|$Gy{&JO{ObEoda(3Y8(aRwHD@Yy-3JE0|mbz`A;#zrpo2a0m@y{ZAtV(=U z)p~>eX-A2B$$T)PA|m*SEAhEH6I`XG}~AhESoEV;F}s{p#C*&-Y?46)f$s{N<$xthc3%@T*X}M=SjI5PO~AwHEa383UC3@t?&az}Nz< z@~0C*R5`eAsHYg#@X6CMoGXxHJGTARF>)SN)<Sj=+*a1^!aQX6Mc zQB{o~2E5|u{`8ez1lVMNG!J%j_wLbkCoe?hw3)BHX=P7&duE-+Z$Tnr<2F!e&}35U^>}3DrIPQI|!zQcqD-_2_bYR zDw>-kWVSX$bR2g9)nsUx=sFr(MEVR_^|I zceC=DkQt6MF?3fhaNqFIRj+69@l0UaBbXN3T{-Y+Yx8tRM@OW9Q9MQ~QPI<1?De611 ze2T*NSo&L{F+99@F0_KAq@>xUr5kWahyuSS=Af&0ua9eI>Cs{i64r&7@3&BJK@Nf% z{0A#5D*FlnG)!7+Yik6guV;^$9BJ3G60DOZg*rAf!XSWwgSr&^VU9+QQQ$SR>p$OUW+ zQGEc>8U*wiKJfPZZzY=I74O$ipVATIH}Gv!xYrKB-R#yas;yGC|5poe84@0rMz!n* zFkv-dPqEiONs!sG$w?6m4B|U+V!Sh_U-A9c7evebD2Kt3pd1(&NYBjt{#u(CW&)*U z1o&M!MMqV6M@Y(tQMBZWKrOFYSaNg&jLg+^kLI!dp0s8!DP08Swl9&}1ur{CEzR1s&Ju=U2WftXyUChcZ*-E&0y;7nXhkwiB)zz5bHW z*MM-jKuy@8Ed9L~p%<0nk{xXOCEy*d3JDM2N1Q}J2JAQ$^4q1R>$o6(9f^`+F9V7fD2zh{y^ck|C`8A#zc=fn z1)66EDhW9D^=la1!9sq|-)p4R%W55Tr~PU5g4s%FhXV%dkGUNI+ED>TAPyoyo?+2E zSKd5`j;05T`|_QY!oa|Q&?!pWLqK<6Cg!6}ab#9Tct>&P2^xex(VMOJ|4(mif~#

TEK_{;0Ew<78=mz=DHmY z0{CrMJ!J+x2Q`gM5<6+lAi3>v7QV8}_vOz~1z(I2Hix6yNx;vOC*c_SrR+LQZEP-q zZ~;1lvj{o-z5w=*k^n8A@ZRq&Eyl3IpC6n+Dtwms>OGIV!EEg@vae?wU2nqn*8e3|8g<1H-e-SKIqLQZCXH$QGl);3x

;#^N-byt= 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%0A6}CPnl=n65!^XLHZsae zI1O^<#pxY0)fWeZ(`DAYy3#5>ypSubwEi5SOTTe2)gz_!-ol8{`$sQc1fJWmKG(MC z60n~+9LeU&@81t1F+MvtH}LOIr#ubU74?CIQIdP`iDS$5MsdUE4{$#hvkNG^Wn^AJ zAGG?NJ3Z&YX_rC6-jc&UTDJuFw2pqXrr#wlDH++LvM76aasLkP{@~rUhqZFKo>p0g zIczI$>Ro4f@3J-<=)Wz}gvasy-)?Yu^w`X)a2?Yhk!{^UyB(@F(3`ol? zA0_wG=kIhi|=Jx>{`fU zB^~$0=UYrnJsBK2hzviv0{(U=zG2@XV{UF<=^S|koh1`9U+s`}neth#D9&vWYEgfh zn8@-bi;wycZP@hbWmXoU-6rcUTDo@4eSXh|CHDI?YzR(H9x5@vGb8-~MF=JvX*tVc z{kX$~9FiRFY7oZ@twLUz)qe2qyk{$|^GLqO<+C7VI8#K6+vP+xOO5VXY4hX9hlTo1 z*}c+M7$jiM?V%7J$oWy$QP8@qo>{WaD-nuIj^p% z>71mNS&PEfR}SX0rtZ*ZUCM-1HhD&*`?c~M*YC~^FrR+YE4 zks@O|XhW}*JT@C&+EJqSNH@6Ys1cdX(`i06UEK$J=yNQmKiW*Zi;Ydw%gNOFS12Sh z^e%r$X2j~XqFBSuhp2%o4`H27dy10(P{z~Lhz&UK<)$;MR22TYbSolh`dF@wr*Fzr z8a~~euI&CoEoRqS^Vpns;FRsV8_r@RD3&Atbe#9L*nInU?S0IL-3wO&~)ohRfLy*z5J8+45gop3g(K>1$@bJ-UqIPNYa! zRAOtmPMnaJH9b(F8n4i`iF-|%yUv?(D?~6hWmw<5=@Sy2WBRX#3hQ%z*;XaDpddi^ zz$-_ekg$TN5#@F~=>L==B-Hbke*+I{qz7zv3~s_N&|6FuLW%}McF zh0H4o4?Z$SghXe{(zxy*neAT5n>Bd5eTc(jck@*y%eHi+cTbb%vF{vET>9Ll8x^i3 zE&DCwQteXdXs5W-3WI(?SPkj>yt;;l+SG^Bh-=~=#%ZasYwqP@lAV2q&Zkko8J7R= zZ;a7E!7s&)l}f3v8|(?pBZ=2?A_^2}>D|^pH+AfE{FLyuJ8+Ki;mAH}A=JD=VN8V(eV4=Hc&nLCLA)24) zCQ!c>!AkpDb@c58zTwiM2s)*Abk-Sm+q{K6(r@%62icPA(}sRaQ1Pt|{Q|^y4nxlV z$cM0m1^J2UEjA7gysAN@H8tLfFt+X6sigFUe0T5ev}^-GtK`fP>G=Xp_NPfm@Wd)! z$N8yDtgKDc;yJl+=<3tz-#7cu9zGaot&3h6O8cQ0@g_LEO}wD0+8N{N zSzEYwtSeD^>8N<(5Jq&4a2mvOHsh#6#~5pA)CHKU}N2;S2bH{W=^n;++%o>Xji`9lggy zg|9s1$ZE195A5&sk=$DxEtwUSJGosux{Pymb@gs0_tv`|&WiMh-!ifE+%e7jWVJX< z744%-TSS_g%0WVMUw{NDGo{8=?QwY1~9V6k75*FjSUp~6|ULsN! z?!VA?wW7Dq9VR_$K>jVspXEoP=dS8%;l_VnbfYI1)5AU(!jB}$AHc>GFBBg=Tq!8- zIWGuH6tXB2lPs}_KrK?`x>pl5vncqFHKBML$7rTRJzY;+&{Wo5#Mm>l3wMvM3F0`C3+b$ZohBGZVXd)*!>6| zG(Ci#!qxBliz=;~Y`)edW#0*A*T_<@A-I%2f1oa3yN621zo!Fm5#shvGLli<%^St> zU57s$Y4Fwy%X*>xr9wde1F@GkPjqY}sf}iP@IBQdvG`T$oq<7GUEPw9{cGtX?uP%S z52ITRh}SdGm=|pAT}3C)B#Z^zzt3*-laT_}7<<#iJdZB~B^{j|%#z~baNI%Pbl>b;dEs+g3fIeJ3}RH3 zfyKsC7C)M$4fAaej-1dBP4W$O6YBoa=`B$aexFUn;bXnCMdRQ5q8#C3K6lWdb4pT@ zP294$LqF}DoMNJR2%WfAkc6g{`|?rW+BXtK&i@`?S)(loeMd9ZU%V~zJ)^wB72Ec{ zOVS1Nwc`w;Hk6DXmfGC1%HkTFsTa5kF34k zH;?)HiXCG)bpRaf`E*7`gvrfLvQPJ!E8y4l7M%(le?5Gp#uHWKVYuwr(U~=0E%0g6 zC*+gPWcio#PtEshjczmKlqNa2jeSRY!tQ&UDf~y@q>__{?jo7K+Pe7gYqHy;GE&a)DZl-jC5#iSi9!Py37TcC#89(ri7yBi@@S#e206fd-1x zG5Pch#0_|QK8lcmIkZod1HThs<=NOL9?v(Cky>|~3?3LHzHr(ZWbQm}dGgGV!yiA2 zJsnK#OGix@M)uupGJCm6EI_5;N{yK$pihRwONKkY#U)ERpebB@G0 zRuaT=`k|W8H%<@9NhZYtj*XiL+Zue*x0Ud@r!HP%ama0Mxo(0%;wEMJc9N}EaaP== zA86V)Wyn@P?B7`_n*8m`Q}e4Imf!RgKes)rO}hGFbW)l7#G{&|e+@sa7Xf^@mE(1! zPoZU0`FGC!5$ z@tXKzr;A$lU-VM+%Gl18ePAxo?Qa_XP>;iL_iK!S{b%oI8^fc-uh?7a>feeu5137_ zoe(@JG_v>1KRSWe^Lb@)!#;Kvu3Ea`CJY^IMdk`8mjcCJ-~7}ba7FrH>%H_**$jFg zs%!*F)4}NP_J20yZF)-r#C(J^j*jVPCwN4^DQ~>$`0Y*1Hr8*Th>{& z=i44np^#r~UVY6;;~>Ehu=+8z=bT~Yf#MCjyk^nbLHa?w4 zDML$^C!EimA$DPYzpLT*>5LPR%EJS@>>sxtxN2YRzk7ARX_ZU6OJ`Gu(>1Gu6g1AW z^ZU6?uip9o)jFEWbzSoJ{F;l!(oGePeKY-fdat=W_Zh4D(_Sz*@P(YTQzej@?{a9w zwlKa9+vYucZm(6HJ2k0vxbm${@7Km_(s#ZL&(jAk+wpon*W`S>@1dju|JD(87u#Po zGxS%Vnu~q+KTQ9MH$!xruSYK#$*FC(=_wW?Q*ZU%=(qWKUbmBzAG-V7Rae!E3k&fR zLX=M$-rC3rY&{%%ZcFc4il5ob;PZ(1M$o`64>&o=MlQN(p$R z)-_$~+;MEzY)rIw-M8nqI=2q~p6rVBt0dVZ;^V{2kBus)GYasiM|RxaCP;JEy2bR;yqnan zW7}?5HOM6M5A*-~lz8?Ll`J{S{n;dm;QRmmj-KrQ-+$A&MI!#?ilBDy&f_HbPf1?o Le73Cd|Fz*(bq@@{;e+h|!RcklsP0#FUVbUWOncy{`Pm~`)z-LrjDGdiCBuxG1*Na@?95W=Ok4O-)ugb0|`-^Vc;};bFPNr+| zzVg2Q@bv?(a^n&IaCu`1+pz37TUGg*iBWvkMwD@qnGsAw)69GmN^Z8a`WpNPB{%4! zJvdPN?(s2ER`JV7_&Zl&ibz4nd6%?dkF|z_rr|s#+}D(TSRyEthb9KwNdNoK&n{XF zit>CER|;GFf8RnsLU8?`&l39ug5m=2eps*n-$^|KBQH?&2k-}ArsxwdEiuSKfiq7M z*?!h?8~Zp^)nY34@`Z@3*Lk&1$X;JA_*7O^SC)fFGzkKArc=3<1*gIia~<} z4rzi5er^4KL!_IGewltABE1wDxGPoU>k69UHxe7VHD!4r4JJB;bSffQN<=Jdz)-6v zKTM45sF?yR)G|+(NZ(a578*gjz-V^Uzcp|y9JnDItgKlIPbMcPRzcFA9GZcf$5Qk{ zf-UDtL#}K0kgWgle0ToZ-N*e0>k4D&L18{(F?VZ=8Ipk|5@era&dL7j&wxEp%0ij3vWi1VAtYmC7-(K*#&+$ID}S=){MZ=i6sH~@!;$Uis>etCNI_#|ERNW#5Z=49L5G4}q+_&~bq z@N{(=@i_AMu#}{+{2z7Zd266UmEH8^3AZE9Mpv^B=DLT1UbFVPG&ti`S0fALuHO0J zq%ytT4Rqy&(7?3UA0e*H+-OpcP`Ye82UH5lPaAx)+>7y?U^`~#Ge)$ zi>pkB$FA#fQMOkc^yb}uXo8v*QuFmLiGe|}u zCF-w#W@aJ}3)1VUN49lz_$BBO4_mMsN2jI^HQuCE{20x7P44l85Y^kVv+FyUT|>3B z%tunJ$}iGg#qyu8yiq`Ub55VkXei?I?1tMaOMVr(>kgB?FTaocY)*v1b_J_X z&9|3dG(K)NfJ53Mg^RYv6^spyRKAx)kDAVB<5|sDvN;msDM?GCHC)|?1_z@)q`LKu zte{X+>pV}~PIGRP`TqB#Z)$sY3Gd~kAZy9K6lacRr8Od4VUrQW$SCJgs9BWlwWT{} zUC%{UpQ&0+imlYS{gatG6{#nLV0Ig60dY%(VEu|kLkGBxEHYz25ZDFk3p$ho?T z1*bh7k#LXaAQZJ1yh=-*+lFR+FX0|#rY8x1b8;*q`wy11D=rBRtey^q)wc=;^Pw=MFx=Yz>Uhq1;Ppf%5SAC$bouBc{G_?M6-zH5K&7YQ^Hg#5%TTlW zAiv4yG#(@+OCr9`03N93cK+s1Hs}y4*V{zfaj4Jb}LMorMTg7O0e2sR0zW) z|MiXwEcy^mrkF$P^6BBJuF<}M5xDAyarA0#Yeg<*6P08t`wO{0_Cy{67@v;>hlhJC zUteD*H=ay2aF{N<*)!*SeyGmHz^Q`P_wh2{pwz7O!_Co ztdQd_XG1qzKT>X`#&utxr(R}_IKfOxN~*M;d}*?Ee?}B?=RNH7v^BKJIBza3yt3d(~@jqXWRz-_3IYWOw*PgpWq2-YSMgJxjmGXS(b{D zl2y+wI2h7+b9v{uH%XvyBr!8H-O)A|yvy0Nb2EW7^;r4%i|~+Qnuwgd^|!dpiPZ!e zFk=itfsCH5|DvNsfOW5mbje@o+!;5ix}xAG|JTEcb9`>?7boXrxoVF?65nk{k^|x<5#Iuy}+)r#K zzCa*hQ{)tGD}_oxP+dN{QTY4;CqepVfBJ^_`}hvv=BM@vX8fg6KlK`Of}{tIEOy*WG$cS3uChte=SAU94>HXd$oZ z(ys0T*D2}ZP|Ke@jXPkfNE5udxrv#gpsK3ccT>@QDtLHw;IrdDK8e&;V=clU{ z1P6r~Jd`9$$;o|U*(U9e_vsFs=EUI=5HLTv7!wa8e4s+2@Z^YG5^P|->`XXw>W&~` zKaDa#G#nu@!nil`mIP5S_;Sc19nXwkGB>fo7x`-hD#HMjT%Sffjp*6{a4Xp0vaxWZ zcyO>KDni71EAD)>AkvRNm?(TCI`vc^jPoJ~Dfe4vM@jg4T-`DXN= zgIZ6kn}e@NN%vn|UtA5&tr1^O=D1bRMCzn9S6VK~-aR3|#oTJJInUi96x>~M-h2(8 zufy#;o^RX?Uzs^UT3B2pWc36mlxQ0*GQ;rK!@@A)J?m0RTC`t%(O!7><{e4r!Fo?81UHHaTD@bg0_aq+uPcHH{HF*a$ccA0(>xxf*ZSrn6s9g zq~AX@Va8`!v8>w;mYh6Z87vIgu(Nmc14%O7-|TGr<74RMAwSYT$+Uqj|1#=4XnWN^ zw)fCWNMAp^Y8?_?(*1*Q3yY4I<(_{8DI4G!X zbo5uvQli9l7K-BR9I58bMc>XM`c`%V&r@uy9`AwwtT8M*W$W_u0Go z!fdjfh-tFmTU9=z%i+Sx#7>3fVl}cjRK4n!Ru{$+5zh$2BkcBh8#z+?i+T9m4ZBJ+ zJV~Rq-GGgaZJT?W_mYC=)z4(Dcg{yMVUY?tNY4BBfi))He*~Llw%!YjX5nz-V5>i@ z4TC;?a=7n+&@`R$2^VQ-WK5s$;UO#{cSf7&b@-ec z75yV@Y-&<3H)UF*HP@}kD{0C+xMkz!-U6IGPbo|KME5_c^Zk=oLQ77l4YpAO1F}19K)a-NcZ=F>q}XBHolnVH#r znGwm)O95o{=2Z`?X!VM0657azf`=DuPJJMA*9lr`YTuwBus5RC-y{%oa|q5q*X^>i z@QYdKi9v4>@Sug-4|;_>9vAx(C8>)j=nXx2<0io^Za5AO?5VqpzM0)GrDSBN`T3It zJ+98~gY;j=vwH3R!1umnMG}2;kpt0UZho-HZ6lkl@e z3Zf(%n=R}ppn@X%hU;Iml++o`oM0hbi-t``cJ|Lo&#UaGZ(t<$hYwkD*m81m8h7nz z`Km>?J*@9Y*c6jNF9n_!6s4k7Q_#hRaSxk{~_alO8>gXbxdm5uxm$t4_R%QII~w$eS2>!8oK?XF2Xo{c7WrnQB}!Rn z^70XLclLTDBj>O%Z~ZY*Emib8exyd$hd8Pjv5yGEY<~e4u$Zljf=|3I+s93Yk2B@( zaQc4>@8OEC^o*`y5YHU_xBKb`8`7RU0zE|OC-6gx%76) z+2i>p>sld&%Z|~}uQ^V;FjhyRJ>MM3BH#+fBd=du@K?@He*-c)x@nPM#ccrX%6^zn z#Y8oFC?UDoj=8}gJQc7`^)5t|mZ=+EQUJxksp9t57l{>}->IorsRdbCMgWycvrw{s zyn%JJ-^(L&eCId>ia7hvGX_!FSENTQS*?p*mwXebHseqym#dz zB@||u8eiO4By!c@ur-9t9?s6rp2Xv(*=(KCt&$~;*A?a-pQTrX#1Z--?H$I{lCZPm zXa#xr*Cl2T9Gnd2?{QnlXMx3>Y2-E2GqiV2{~dV}o$O-?CEukx%cfUo>8zer zW)RREVMF}|hwl&#Wp>=Bdd%OAU5cO4DY!18p+T$pq}oj@b7d59G!;irpy^_lm`sqG zv3@}LS=QW~&gZe}n@5vJ4O5|dH6doCX09@wW|apO!q&e{T}$}hZK7~T!oUC<;72Ja zJe}hYfn{sMh^l@i4J|E0YwKdGFWZw9B!cx$pDP=yU1FNw8hl>oEYcVc7rk?_+ff2_ zN4&KK9>@gQcee3@xxAtRa6=mRtKF_d=%=Us=;w9XH%`_2%?RU67eC8ROiHrb8X~K{ zuWK6VHZn3gS;#$^V^R@D+|J!CrSc~K6VMZ=JJjP!XW8>v6mxd2zPttUYvq$#o-!sp z7Fv?ZeR+8m-C4EAwSG65>Jkq-7ov&vlQ<}h%RLaVxLb)JHpN9gGA<0qZDjW`HSrQVQm$&=3f!TzceJSTNOPw?>Z zlU&H2zE;6v3rJSCbN2ACFV6JfNl;)Rlx+Gz+QN-gr{CkfZe)0-406F$ zMrve@v!y0rNhmadm6J0|XMReSP&fdf_p3(-SDG>7V`D%HRR6KajdNP_<{j~fS~BSH z?&?cfbjNDG9)cDzvye9Zlx@YUgzKN?{n@iFSD4G99)2hE@S}O2V(Yu zdAejiPXV9up9Ye?Oqg>z?Ygpg&U{=-zM*M(EQis0I8Bo~?4D=7qmFuBu|jV_8>Rrg zm*4lQ$zWB3De!BnwRlf)pqPeL_`Ao_5!pK`;3k& z>lrkpuhRGd5lqlE-vtx!cMB6iU*i#PIA5x`5G@W4PIe1l(v{E%Mxn6hIw4v8dA7+_ zaSA4CKR185MM4CJ`NS8GCgao>voB~B*bgph@^&@@va()((@jPBa_4MS+3lxOE2XIk z<3b&{n7-8UtdnKOVR2d5oc;G*H;E7V=d|&_Ux)6?i2|1rC-9Ml(ikey(vt2o8{&64 z7@B6}Jgw7DOvJq>xr5Sr;hxv7cInP|(aJAbeBPO9KA`SYiRKBhKbUg@B#_%L(+Sd9 ztG-uD*~8zO$a$OFWIgQ|&i1Nf)1I!XTQUh}1j;v=;{Fbm_^q|mCT6+G_BOi6G{o>`-T_Ac9CD+l=HC+)XZuQZ1@`p^_^@OzM zZa_jKDrxF#_TjYXPUZ88e@*uDZduMs)%&f}V9y5U*z`G3$*LYln{J59gBbgHhnC)a0E)QEH z;7`vqrg@%>bpOVEC&M7_WJs&Tj*CV8?vou*NJNkdrXCRjxKa3^FWx+Vdv(wbls=M0 zs(_&OoG*~%)MTwQ)N8EC1Oyg>L+VB3<=+EXHIn5ZX+>04W*6plVsvm}RwADvdROge ziij7kwp>eFyaO2NS{-za_Y@&Kr*{#_FK^Sgj=JB-3>lHEarkP7&wbez!SA`ggvgex zDUQTfM_mO=8yjyTZ|N2%zYgnkpWr(aDt31=@z!ezpd5~%;l06!KzeUzY&Yn@H-g@) zpl*c}hSG>%4{5#JF;yP{67q}^8!ib9b@rcNn8H&7e-4+5(6>a}P8o@xO1Dl~9E^w8 zfr(Yh+}$@keFS7Z6jN`MO&VIaevEfbUrc9S1J(FwmP6p%KF^7(23DY~Tst5duaX%9 zfk13Fk6TC_=G&6+xm5quggWV4A<~lt#p3QRwzY$+7eH7WcPXT_UD3C!_AUt~@|)nZ zBc4!z+9XRRib3;!64_|O+DHSNE-qwm+VIBh!RGbS(en4KpEELr%iYwH*V#Np0_|@wm#gxa&sMtA>~|eM z8XIRj?#(6DIT+*dkQD!6larNIZ?VP`<-RnTggL!R5s(uRp_-bC%hMYUY(>6fGh0Ph z&R717SR>}P?id#K?#@BS2jWz=;Z^U0Qy9sEK!s2W`ac_znspi6?yxjj&wDvw3e6XL zCnteNW=C38r}V^}7LxX-jPhxyKQ=umPG%c1Uj&6V)Wr5?4up8`_NGo;dhW&*ty%|JFu94ZPQ1u_fjLZ@MAGl_ z3hr8rHfa(3mM1gbQKO%^xw2*w7mG?wm7mP7cAdV+@M@Sk_t^Y=f6vh_useNbykg?O zo6Ht{qZ|3$STP0q*p8sDTNpAH}?+TA&$UF^BBTlIl}V41x-^1&2fs!>ZH zjuAv(U^;^$jxa-?^h4bB1oj2M+s)jF#E@_~ym$s3`5zNTfLh{~tzfe`l+^hzeVAYt z1~@Hrrta$Y{IhmsxZ%o{9-wkP*WojBbEU2;0?#mUxLAKYIZe-Nd(1LjtV2sn`&Lr& zE$|qlS>N6UVC?Fd>i8$|Z+SUCR3rcrPf#;{`(QF^Vsi4g{w5j)$Ag}*XnPK-1I9ONO0`GHfWy$D5K-#izeMC}T2rrLTja`*@=~uA{5# zr2iH{bh0oa$;4cFL2Z>0QO` zDd|GKJv~qcXZ&iqYT?#+SYrm*D2vZ1L1Y~G@agD}v#dU(-tWcc;8O~xh0mxiz`#83 zS3EFfOL?7c8ER}0&svazko(c20fxa^b`c<{1p~=)GJ)3IWF9T5e{#}4h5vQQIBmzn za{;uG$ZFN3N($f|s9SFeq9H>tY_hW&t#JR#!!Uw@kuh&iC3)u?ExYr%uhwOi=~Cs0 zVDvkqp5;djqWfh+T1r3HFRV0sQb2D^C)8v64i~Sypbkyqp%Dt7nKT!juJbPAvo`EO?dlMxJB9jYc|q3;D`cOp)iV5^7Dt1 z*iD~RgIR= zElcR*sG(6Y0zJUiv3%^!_$e`+@XY)sbk2pQ{|(Tc5nTja>>9Mk9UWXxEIBb*`wvk= z#$&ea8X{vXi2iKOpqD@|^Lc8NXrN%A8~SYj|A4mQa|<}*OEehm|K}v}S{$dqTm=p- zvZ6-k@TchL9w;tg3hDXq0a>cC@pohaK=+joFa=o5{Rdx8LkbN&6Z%i5vNA^jFW5>2hQBdfQa=dz@fxm z*vE*;{#z5oL~`afYl|`-be$X={5OiKGanP%5kSJNhz3FGuB$yRNTb-K!$bD#>KS4XS)dgZi2>ygsBp|q`yKnVzhHspnd)0uEN}Y>$rfnD zOfN1%^ORpN=?yNVveii?&Z}8iU60-Whr&1un2v`E^)5@yBHVSzXVA_Q^a&K-(C0ly$ z5{-I93P<1n-3w5!5x;$MBq?TlKE)^~P75r+K&>m3ovV!WKR|B!cpyTY!>=oU&b@8B4(*0M+u)Rp4>oGVIwe1%M#l_Rr zR42}9NbMS!3hVM9Hr&xH2YvWA*5TI_PGV?G)zTC;`MW6c0z9>{qtzTC-%B{4oGGj4QRb!WxW8fdV2ACS{T6pZ7YziR zfBaUoIe2WF>f~%Je=z4>kdu~4{Xj}~q1ueq7Gz{1DvhRGV7x8mD32`;r8J8X3v7U7 zRDgmv;{1bA?~=JXM;97LHf(^s0%Ze4d_hW#E1Agm6eOVxp}f$h%Sq!2_m6oU z?!rA~5uF$x)9!!nNUWBZQN!2K-fPb#g3<)zK;?60aDh zlx%@e{Yze1Ip=W*NDRYhngZ~p?Wd>b_vJ65lIaA|;1D$GPhjyFQ2l}&HvAm1D9}HS z^DQm}@b+>?>DRHDV85&^B0daCzv9o*NsDG#e*tX66OsOoW>TNpIyR^@zPPW>XNV1F zU{GIKYu7_XEo}B~Qr^YwT3ZZ4;e+#udm3k_i+&K<9?MA+3B^}@F*Ot?295RjY{J19 z9Df+k@tAWS-Jw0q!*>cfn5&HP%8=>AWM#FCh~#!8L~7jKl!(t@*;o}94W#lL$+BDf z-iuvY#_9-iS9_GuL5q^?OTv|R;SY}s#0!724y$Xb`?~6ylfuxbiN7x^+tE5O0FKYM ztE&6~S*#DkK-G7=*gbc)WpR`e2@2evZx+P8FdQF^Vtk9)_8(;yLF@|vRQihMb8H;4 z=ZOl<5pviE7%`xbv8tiz1WRgSOgq7p;}qLAOTEU8d7)ApC};cOd_klzUb3c@86 z%$%|+&P;7>3^Ms(Z7GE!<|ParHTS*qC$PUy`Ko=xgQMYjK{w39vrN}w>5r8$b6ahLd2-@UvAp~*UNn&7siw;RY^!y_ zmD`Yo3kXs+N;?IrUkY!Ps=QQ)t*zCIqs4v_9Ugjm9S}QYWL)=kcaN+DDLFH7;sLSi z9!F2YhfCR)dhJ^6=a1*^g4mrrLwtl71WQd%WmMO zH#7*Uclh5Zf5B+JzkS`P1r|oqQJ_LekmQ*)05%D${Cu!EAO<-NjKOhzdeMm%(u1(V zSmpBXJhG6iUY>uz~?M!H*D zNAywj?{QyuMfl%da9U8IHAUNe*H^ZFbc*@&_;u#0G64i^LhJBVraQh2fN{PfgZO`B z3~4i6Sa6Q{^Xu!3u$hAIyLT*Q|2>~Z*EphB>+qJCyV+%aAnEGyXj=-AL4LHIThc@K z3YZKu2tllH{O3FAEzfezl0vlD^6<6mqnx~Pb3(#1YNE6g@#C9MjO^zs{RBWN-u??- zC@7?Dd9|hkM}UVg(1i5(t`if-0fPNvwY(ffPKH{hsH^e!kl%Y*NP2n|XTH4v7Zl|L zYj5gTK|y+EZYhA?Z}3`pQiJ{z z1u1R1s2{{#Gluz*3t!jc-I5o9rz}c>xk}d%WfS#3Hj7(Cr)8mi2&mit&81}`l>_Z*SD|Utp2bb(tCV#|J>4ceEf6y zd+s+$?hOqs3(Z6sLxwCYqsfE$<1v|2-+YW{1+H|LGT}~p?+LejVLkXQfJuU6Hs&ShTxz49xq{VtOCU<8* z5J1PlA*uoQ(V(LbMt|ew4TunneJ&kJic6a0d$zH(CF&H9=G`S?K&g#h$-lmS{hL2| zzgWwvbFfd|q9|AcerIRDYG`4x6dJUgMk9Bwsa98E5@~!_B1xq5{S|h3xvA&stFyfc zeOEIE0+3&^hGrYWM>O#Lc~v#jJFRlU-}P~c?aqryU_N$TF(Bi-$wv2;mzg3WgopbBzp~{nVn8obc#$hi z+E3Q_7^_P%sS9?enOz{Oll(5*UY88Q-JLtlwtzJWrc!w8nHxTC4O`%EOqE5NPt$M+ z!mG;4_?Wd&;CGi=gMBaUo8#R8&v9hh3?vlk_FujIO)rGF22=*ZcZdo zl9J5=zL1F4Sd|H;rjhrHAmhZj7fYfE&KSu{JTgQfqX^jxExz`&B89AuYSj?p;)=a5 zErH<7B}|E7L9k{1eub{ZlZ!i7>l;(;oxJUdY;JzdjKu6$#>zR^QV<2M=u>-&W68Ck zFZpmQ0_LQdVu689<}IeT9d~g7+JIuZ)Cf@7yT!T~9}k{%z4Y|uHRK!x60V38Qm}#E zd~`GjN?3F-zv7FDLFPY#48Xs0)j<6&wHLq%e;ouFl_@>d^2-S>i}X^ z%D$%NgLzTUdtaA@`qz1RBc+sD@5$&M{)y!Q<(xotflP`0$znB)EEQ4!WowYUHL_P%GSn@hx)a#a!%OY!TyJ@@*h0bQ65#tb zU59@$u7Ey0-F6!*jI1DL6<0j{E{WY$Ex&{L9r5;GSxRy&is5)FnjaTUZWXw`9|FF2 zAhO%kb#&~xA)brJ5Q7Ogzax)R$UAQ9(y8f$;k_x&Ll7(F*O&p%v+#6k)g6<7tg$y*#9Jt%-d}oWHNRUdtE1UMzBxR-ubz$!i0MW`LJY-PYP1`ulwx21ibG?2 z;yTq((#Rw3FkE&$HM{>nR#Q8~0^t0Tc;CLg=d_Z>AtCYYRId`0ByjC9p5JMc zm+i2td_0vU<5*F#W+E(1+NVTd`I=Z%?LR=0IJdLSb+vfeH()|3M)ae@%dss{ zTh}(}c)C6B!kN*RCOD6mSHR)m1;ATo%^V2ht9CI~kSWDzCgUbJXVJpQe2jqW%;cbrQV=uP9cDQ_K)bko&Mj4zvQ zzWMvtbn5n7fs^WbP6G4z<~qc{iR1my_G0aelBPF4k7nCa(#EYX<$lxqVM#n!>VNyw zbT`Me5{_Mmedio75YXBsH4~qZ}G~6D*qZ5?Q|s18&WJl~F)X^Dpe! z79M9dk&?39_L`8hZzL*qz#kp!LwZ66PDS~-QZZJB!E@Q62zAH|y4HI|ULlbC@YTw< z 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 A9#S!`3e-NKvp0 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 literal 0 HcmV?d00001 diff --git a/images/scatter_example.png b/images/scatter_example.png new file mode 100644 index 0000000000000000000000000000000000000000..1f382707add53073e080477ad72791d07cdc750b GIT binary patch literal 53488 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 UXqgjq4gN`q%ZvRKdFS*00JR(TZ2$lO literal 0 HcmV?d00001 diff --git a/images/statistical_example.png b/images/statistical_example.png new file mode 100644 index 0000000000000000000000000000000000000000..02ee0300a5fd7cdc5bf978fb1f87b95786b00dda GIT binary patch literal 29378 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

|0?)hCoykAKZXSnc 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 ~4``yQ~aN(J}5{S7D1RP}C?NhG*9 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 K#7aeUeg6k3d}jCn literal 0 HcmV?d00001 diff --git a/solutions/2.1-bar_and_fill_between.py b/solutions/2.1-bar_and_fill_between.py new file mode 100644 index 0000000..125de02 --- /dev/null +++ b/solutions/2.1-bar_and_fill_between.py @@ -0,0 +1,37 @@ +import numpy as np +import matplotlib.pyplot as plt +np.random.seed(1) + +# Generate data... +y_raw = np.random.randn(1000).cumsum() + 15 +x_raw = np.linspace(0, 24, y_raw.size) + +# Get averages of every 100 samples... +x_pos = x_raw.reshape(-1, 100).min(axis=1) +y_avg = y_raw.reshape(-1, 100).mean(axis=1) +y_err = y_raw.reshape(-1, 100).ptp(axis=1) + +bar_width = x_pos[1] - x_pos[0] + +# Make a made up future prediction with a fake confidence +x_pred = np.linspace(0, 30) +y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred +y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred + +# Just so you don't have to guess at the colors... +barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue' + +# Now you're on your own! + +fig, ax = plt.subplots() + +ax.plot(x_raw, y_raw, color=linecolor) +ax.bar(x_pos, y_avg, width=bar_width, color=barcolor, yerr=y_err, + ecolor='gray', edgecolor='gray') +ax.fill_between(x_pred, y_min_pred, y_max_pred, color=fillcolor) + +ax.set(title='Future Projection of Attitudes', + ylabel='Snarkiness (snark units)', + xlabel='Minutes since class began') + +plt.show() diff --git a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py new file mode 100644 index 0000000..0629513 --- /dev/null +++ b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py @@ -0,0 +1,20 @@ +import numpy as np +import matplotlib.pyplot as plt +np.random.seed(1) + +# Generate random data with different ranges... +data1 = np.random.random((10, 10)) +data2 = 2 * np.random.random((10, 10)) +data3 = 3 * np.random.random((10, 10)) + +# Set up our figure and axes... +fig, axes = plt.subplots(ncols=3, figsize=plt.figaspect(0.5)) +fig.tight_layout() # Make the subplots fill up the figure a bit more... +cax = fig.add_axes([0.25, 0.1, 0.55, 0.03]) # Add an axes for the colorbar + +# Now you're on your own! +for ax, data in zip(axes, [data1, data2, data3]): + im = ax.imshow(data, vmin=0, vmax=3, interpolation='nearest') + +fig.colorbar(im, cax=cax, orientation='horizontal') +plt.show() From f8b0fd7402030c252994fc413e29d13a3b0fdb53 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sat, 4 Jul 2015 15:34:27 -0500 Subject: [PATCH 13/61] Made example images link to the example code --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index f3462f4..864b84b 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -43,24 +43,22 @@ "source": [ "## The Basics: 1D series/points\n", "### What we've mentioned so far\n", - "\n", - "\n", + "\n", + "\n", "### Other common plot types\n", - "\n", - "\n", + "\n", + "\n", "\n", "## 2D Arrays and Images\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "## Vector Fields\n", - "\n", + "\n", "\n", "## Data Distributions\n", - "\n", - "\n", - "\n" + "" ] }, { From 4f50917735c0690aaf745378126b5bf3d86408b9 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 14:50:10 -0500 Subject: [PATCH 14/61] Fixed readme links --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 74791c2..b83314b 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,6 @@ Cheers! [Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb [Part 2: Plotting Methods]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb [Part 3: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb -[Part 4: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Limits_Legends_and_Layouts.ipynb -[Part 5: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Artists.ipynb -[Part 6: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb +[Part 4: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +[Part 5: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb +[Part 6: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb From 9629da3951c240b1be9075b9f09570e68d7a35fe Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 14:51:16 -0500 Subject: [PATCH 15/61] Missed renaming one of the notebooks --- ...toolkits.ipynb => AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb => AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb (100%) diff --git a/AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb similarity index 100% rename from AnatomyOfMatplotlib-Part5-mpl_toolkits.ipynb rename to AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb From cfe52c3abc245bb11747a7a8d5da0877b95eb5cf Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 15:18:09 -0500 Subject: [PATCH 16/61] Fixed broken image link --- AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 864b84b..e145df8 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -165,7 +165,7 @@ "metadata": {}, "source": [ "### Filled Regions: `ax.fill(x, y)`, `fill_between(...)`, etc\n", - "\n", + "\n", "\n", "Of these functions, `ax.fill_between(...)` is probably the one you'll use the most often. In its most basic form, it fills between the given y-values and 0:" ] From 18c91c15049b8751098405f6d8293adc1bd944e4 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 15:22:11 -0500 Subject: [PATCH 17/61] Revert accidentally applied stash --- ...lib-Part4-Limits_Legends_and_Layouts.ipynb | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index 7972659..26dbf76 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -351,49 +351,6 @@ "outputs": [], "prompt_number": null }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another common " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(4, 4, sharex=True, sharey=True)\n", - "for ax in axes.flat:\n", - " ax.set(xlim=[-20, 20], ylim=[-1, 1])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 22 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `ax.locator_params` to reduce the density" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(4, 4, sharex=True, sharey=True)\n", - "for ax in axes.flat:\n", - " ax.set(xlim=[-20, 20], ylim=[-1, 1])\n", - " ax.locator_params(nbins=4, prune='both')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 27 - }, { "cell_type": "markdown", "metadata": {}, From f32d7820f948fbb640c96b6d96a4d7d3bc85cbb3 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 20:43:49 -0500 Subject: [PATCH 18/61] Forgot to clear output --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index e145df8..cb44d34 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -123,7 +123,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 73 + "prompt_number": null }, { "cell_type": "markdown", @@ -151,7 +151,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 14 + "prompt_number": null }, { "cell_type": "markdown", @@ -185,7 +185,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 32 + "prompt_number": null }, { "cell_type": "markdown", @@ -216,7 +216,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 76 + "prompt_number": null }, { "cell_type": "markdown", @@ -239,7 +239,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 2 + "prompt_number": null }, { "cell_type": "markdown", @@ -285,7 +285,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 97 + "prompt_number": null }, { "cell_type": "markdown", @@ -310,7 +310,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 99 + "prompt_number": null }, { "cell_type": "markdown", @@ -352,7 +352,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 107 + "prompt_number": null }, { "cell_type": "markdown", @@ -374,7 +374,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 108 + "prompt_number": null }, { "cell_type": "markdown", @@ -397,7 +397,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 101 + "prompt_number": null } ], "metadata": {} From e93c5c4c928073fb6cd9a167517b2c800fb52a73 Mon Sep 17 00:00:00 2001 From: Joe Kington Date: Sun, 5 Jul 2015 21:30:27 -0500 Subject: [PATCH 19/61] Update MEP link. Fixes #9 --- AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index 90ba626..2b22bdd 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -75,7 +75,7 @@ "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", "\n", "### Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://github.com/matplotlib/matplotlib/wiki))." + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." ] }, { From 368663e90ca7aeeb239342070bd4a7dcb0d359fc Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 6 Jul 2015 17:55:18 -0400 Subject: [PATCH 20/61] Fixing up some examples, typos, and prose. --- AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb | 5 +- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 26 +++- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 113 +++++++++----- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 142 ++++++++++++------ ...lib-Part4-Limits_Legends_and_Layouts.ipynb | 90 ++++++----- AnatomyOfMatplotlib-Part5-Artists.ipynb | 54 ++++--- AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb | 24 +-- 7 files changed, 295 insertions(+), 159 deletions(-) diff --git a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb index b0797f4..6f1edd1 100644 --- a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb +++ b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb @@ -1,7 +1,6 @@ { "metadata": { - "name": "", - "signature": "sha256:291c02e0eda1008690ba35d47865fd743d899737c6c702e384430e08988052a0" + "name": "" }, "nbformat": 3, "nbformat_minor": 0, @@ -268,4 +267,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index 90ba626..791826d 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -143,11 +143,11 @@ "\n", "\n", "\n", - "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures. However, ``Figure``s can contain multiple ``Axes``. \n", + "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures and ``Figure``s can contain multiple ``Axes``. \n", "\n", - "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases we'll deal with here, ``Axes`` and ``Subplot`` are synonymous. We'll be heavily using ``Axes`` instances for plotting, etc, so you'll be seeing a lot of these.\n", + "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases, ``Axes`` and ``Subplot`` are synonymous.\n", "\n", - "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things much at all. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things all that much. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" ] }, { @@ -316,7 +316,7 @@ "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", "ax.set_xlim(0.5, 4.5)\n", "plt.show()" ], @@ -338,7 +338,7 @@ "collapsed": false, "input": [ "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], marker='^', color='darkgreen')\n", + "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", "plt.xlim(0.5, 4.5)\n", "plt.show()" ], @@ -453,17 +453,29 @@ }, { "cell_type": "code", - "collapsed": true, + "collapsed": false, + "input": [ + "%load exercises/1.1-subplots_and_basic_plotting.py" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", + "# Try to reproduce the figure shown in images/exercise_1-1.png\n", + "\n", "# Our data...\n", "x = np.linspace(0, 10, 100)\n", "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", "\n", - "# Can you figure out what to do next to plot x vs y1, y2, and y3?" + "# Can you figure out what to do next to plot x vs y1, y2, and y3 on one figure?\n" ], "language": "python", "metadata": {}, diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index cb44d34..725f9de 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -32,7 +32,7 @@ "\n", "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and matplotlib gallery is a great place to get examples of all of them. \n", "\n", - "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down a bit, give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", + "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down and give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", "\n", "Here's a simplified visual overview of matplotlib's most commonly used plot types. Let's browse through these, and then we'll go over a few in more detail. Clicking on any of these images will take you to the code that generated them. We'll skip that for now, but feel browse through it later." ] @@ -82,8 +82,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -91,14 +90,12 @@ "source": [ "# Input Data: 1D Series\n", "\n", - "We've briefly mentioned `ax.plot(x, y)` and `ax.scatter(x, y)` to draw lines and points, respectively. We'll cover some of their options (markers, colors, linestyles, etc) in the next section.\n", - "\n", - "Rather than revisiting `plot` and `scatter`, let's move on to a couple of other common plot styles.\n", + "We've briefly mentioned `ax.plot(x, y)` and `ax.scatter(x, y)` to draw lines and points, respectively. We'll cover some of their options (markers, colors, linestyles, etc) in the next section. Let's move on to a couple of other common plot types.\n", "\n", "### Bar Plots: `ax.bar(...)` and `ax.barh(...)`\n", "\n", "\n", - "Bar plots are one of the most common plot types. Matplotlib's `ax.bar(...)` method can also plot general rectangles, but the default is optimized for a simple sequence of x, y values, where the rectangles have a constant width. There's also `ax.barh(...)`, which makes a constant-height assumption instead of a constant-width assumption." + "Bar plots are one of the most common plot types. Matplotlib's `ax.bar(...)` method can also plot general rectangles, but the default is optimized for a simple sequence of x, y values, where the rectangles have a constant width. There's also `ax.barh(...)` (for horizontal), which makes a constant-height assumption instead of a constant-width assumption." ] }, { @@ -109,12 +106,13 @@ "x = np.arange(5)\n", "y = np.random.randn(5)\n", "\n", - "fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(0.4))\n", + "fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))\n", "\n", "vert_bars = axes[0].bar(x, y, color='lightblue', align='center')\n", "horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')\n", "\n", "# I'll also introduce axhline & axvline to draw a line all the way across the axes\n", + "# This can be a quick-n-easy way to draw an axis \"spine\".\n", "axes[0].axhline(0, color='gray', linewidth=2)\n", "axes[1].axvline(0, color='gray', linewidth=2)\n", "\n", @@ -122,14 +120,13 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort.\n", + "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort. Most of the time, you will not need to retain these returned objects. You will want to capture them for special customizing that may not be possible through the normal plotting mechanism.\n", "\n", "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus `for bar in vert_bars`)." ] @@ -141,7 +138,7 @@ "fig, ax = plt.subplots()\n", "vert_bars = ax.bar(x, y, color='lightblue', align='center')\n", "\n", - "# We could do this with two separate calls to `ax.bar` and numpy boolean indexing, as well.\n", + "# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.\n", "for bar in vert_bars:\n", " if bar.xy[1] < 0:\n", " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", @@ -150,8 +147,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -184,8 +180,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -215,8 +210,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -238,8 +232,40 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "np.random.seed(1)\n", + "\n", + "# Generate data...\n", + "y_raw = np.random.randn(1000).cumsum() + 15\n", + "x_raw = np.linspace(0, 24, y_raw.size)\n", + "\n", + "# Get averages of every 100 samples...\n", + "x_pos = x_raw.reshape(-1, 100).min(axis=1)\n", + "y_avg = y_raw.reshape(-1, 100).mean(axis=1)\n", + "y_err = y_raw.reshape(-1, 100).ptp(axis=1)\n", + "\n", + "bar_width = x_pos[1] - x_pos[0]\n", + "\n", + "# Make a made up future prediction with a fake confidence\n", + "x_pred = np.linspace(0, 30)\n", + "y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred\n", + "y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred\n", + "\n", + "# Just so you don't have to guess at the colors...\n", + "barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue'\n", + "\n", + "# Now you're on your own!\n" + ], + "language": "python", + "metadata": {}, + "outputs": [] }, { "cell_type": "markdown", @@ -252,13 +278,13 @@ "\n", "\n", "\n", - "In short, `imshow` can interpolate and display large arrays very quickly, while `pcolormesh` and `pcolor` are much slower, but can handle much flexible (i.e. more than just rectangular) arrangements of cells.\n", + "In short, `imshow` can interpolate and display large arrays very quickly, while `pcolormesh` and `pcolor` are much slower, but can handle flexible (i.e. more than just rectangular) arrangements of cells.\n", "\n", "We won't dwell too much on the differences and overlaps here. They have overlapping capabilities, but different default behavior because their primary use-cases are a bit different (there's also `matshow`, which is `imshow` with different defaults). \n", "\n", "Instead we'll focus on what they have in common.\n", "\n", - "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." + "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap will return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." ] }, { @@ -267,7 +293,7 @@ "source": [ "### Colorbars\n", "\n", - "Next, let's add a colorbar to the figure to display what colors correspond to values of `data` we've plotted. " + "Let's add a colorbar to the figure to display what colors correspond to values of `data` we've plotted. " ] }, { @@ -284,8 +310,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -309,8 +334,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -351,8 +375,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -373,8 +396,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -396,11 +418,34 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "np.random.seed(1)\n", + "\n", + "# Generate random data with different ranges...\n", + "data1 = np.random.random((10, 10))\n", + "data2 = 2 * np.random.random((10, 10))\n", + "data3 = 3 * np.random.random((10, 10))\n", + "\n", + "# Set up our figure and axes...\n", + "fig, axes = plt.subplots(ncols=3, figsize=plt.figaspect(0.5))\n", + "fig.tight_layout() # Make the subplots fill up the figure a bit more...\n", + "cax = fig.add_axes([0.25, 0.1, 0.55, 0.03]) # Add an axes for the colorbar\n", + "\n", + "# Now you're on your own!\n" + ], + "language": "python", + "metadata": {}, + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index e756d09..02bf569 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -38,8 +38,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -99,8 +98,31 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()\n" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [] }, { "cell_type": "markdown", @@ -143,8 +165,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -162,8 +183,19 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()\n" + ], + "language": "python", + "metadata": {}, + "outputs": [] }, { "cell_type": "markdown", @@ -182,7 +214,7 @@ "' ' | draw nothing\n", "'' | draw nothing\n", "\n", - "Also, don't mix up \".-\" (line with dot markers) and \"-.\" (dash-dot line) when using the plot or scatter functions." + "Also, don't mix up \".-\" (line with dot markers) and \"-.\" (dash-dot line) when using the ``plot`` function!" ] }, { @@ -195,14 +227,13 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "It is a bit confusing, but the line styles mentioned above are only valid for lines. Whenever you are dealing with the linestyles of the edges of \"Patch\" objects, you will need to use words instead of the symbols. So \"solid\" instead of \"-\", and \"dashdot\" instead of \"-.\". Hopefully, this issue will be fixed for the v1.5 release and allow these specifications to be used interchangably." + "It is a bit confusing, but the line styles mentioned above are only valid for lines. Whenever you are dealing with the linestyles of the edges of \"Patch\" objects, you will need to use words instead of the symbols. So \"solid\" instead of \"-\", and \"dashdot\" instead of \"-.\". This issue will be fixed for the v2.1 release and allow these specifications to be used interchangably." ] }, { @@ -215,8 +246,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -237,8 +267,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -282,8 +311,20 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = np.arange(0.0, 5.0, 0.1)\n", + "a = np.exp(-t) * np.cos(2*np.pi*t)\n", + "plt.plot(t, a, )\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [] }, { "cell_type": "markdown", @@ -292,7 +333,7 @@ "# Colormaps\n", "Another very important property of many figures is the colormap. The job of a colormap is to relate a scalar value to a color. In addition to the regular portion of the colormap, an \"over\", \"under\" and \"bad\" color can be optionally defined as well. NaNs will trigger the \"bad\" part of the colormap.\n", "\n", - "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap is used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. Ultimately, it doesn't really matter what the default colormap will be because an arbitrary colormap will be a poor choice for many datasets.\n", + "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The upcoming v2.0 release of matplotlib will take on a new default colormap along with some other stylistic changes to the defaults. The defaults will be discussed this week during SciPy 2015.\n", "\n", "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." ] @@ -305,8 +346,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "code", @@ -394,8 +434,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -416,8 +455,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -437,8 +475,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -464,8 +501,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -482,10 +518,10 @@ "\n", "styles = mpatches.ArrowStyle.get_styles()\n", "\n", - "ncol=2\n", + "ncol = 2\n", "nrow = (len(styles)+1) // ncol\n", "figheight = (nrow+0.5)\n", - "fig = plt.figure(1, (4.0*ncol/0.85, figheight/0.85))\n", + "fig = plt.figure(figsize=(4.0*ncol/0.85, figheight/0.85))\n", "fontsize = 0.4 * 70\n", "\n", "ax = fig.add_axes([0, 0, 1, 1])\n", @@ -518,12 +554,11 @@ " bbox=dict(boxstyle=\"square\", fc=\"w\"))\n", "\n", "ax.set_axis_off()\n", - "plt.show()\n" + "plt.show()" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -541,8 +576,25 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "t = np.arange(0.0, 5.0, 0.01)\n", + "s = np.cos(2*np.pi*t)\n", + "plt.plot(t, s, lw=2)\n", + "\n", + "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", + " arrowprops=dict())\n", + "\n", + "plt.ylim(-2, 2)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [] }, { "cell_type": "markdown", @@ -564,7 +616,9 @@ " \n", "Letters can be combined, in which case all the specified\n", "hatchings are done. If same letter repeats, it increases the\n", - "density of hatching of that pattern." + "density of hatching of that pattern.\n", + "\n", + "## Ugly tie contest!" ] }, { @@ -573,12 +627,14 @@ "input": [ "bars = plt.bar([1, 2, 3, 4], [10, 12, 15, 17])\n", "plt.setp(bars[0], hatch='x', facecolor='w')\n", + "plt.setp(bars[1], hatch='xx-', facecolor='orange')\n", + "plt.setp(bars[2], hatch='+O.', facecolor='c')\n", + "plt.setp(bars[3], hatch='*', facecolor='y')\n", "plt.show()" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -613,8 +669,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -643,8 +698,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -657,4 +711,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index 26dbf76..2124b0c 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -38,8 +38,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -72,8 +71,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -102,8 +100,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -150,8 +147,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -176,8 +172,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "code", @@ -193,8 +188,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -220,8 +214,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -246,8 +239,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -262,6 +254,16 @@ "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" ] }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%load exercises/4.1-legends_and_scaling.py" + ], + "language": "python", + "metadata": {}, + "outputs": [] + }, { "cell_type": "code", "collapsed": true, @@ -280,8 +282,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -319,8 +320,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -348,8 +348,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -371,8 +370,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -408,8 +406,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -438,8 +435,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -457,15 +453,13 @@ "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", "ax2 = ax1.twinx()\n", "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", - "ax1.set_xlabel('X')\n", - "ax1.set_ylabel('First scale')\n", - "ax2.set_ylabel('Other scale')\n", + "ax1.set(xlabel='X', ylabel='First scale')\n", + "ax2.set(ylabel='Other scale')\n", "plt.show()" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -505,21 +499,20 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Exercise 2.2\n", + "# Exercise 4.2\n", "\n", "This one is a bit trickier. Once again, try to reproduce the figure below:\n", "\n", "\n", "\n", "\n", - "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the left and top sides.\n", + "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the right and top sides.\n", "\n", "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", "\n" @@ -533,11 +526,28 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": 5 + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Try to reproduce the figure shown in images/exercise_4.2.png\n", + "# This one is a bit trickier!\n", + "\n", + "# Here's the data...\n", + "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", + "animals, friendliness, popularity = zip(*data)\n" + ], + "language": "python", + "metadata": {}, + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part5-Artists.ipynb b/AnatomyOfMatplotlib-Part5-Artists.ipynb index 307dd1f..9b25d3e 100644 --- a/AnatomyOfMatplotlib-Part5-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part5-Artists.ipynb @@ -38,8 +38,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -154,16 +153,15 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Containers are objects like *Figure* and *Axes*. Containers are given primitives to draw. The plotting functions we discussed back in Part 1 are convenience functions that generate these primitives and places them into the appropriate containers. In fact, most of those functions will return artist objects (or a list of artist objects) as well as store them into the appropriate axes container.\n", + "Containers are objects like *Figure* and *Axes*. Containers are given primitives to draw. The plotting functions we discussed back in Parts 1 & 2 are convenience functions that generate these primitives and places them into the appropriate containers. In fact, most of those functions will return artist objects (or a list of artist objects) as well as store them into the appropriate axes container.\n", "\n", - "As discussed in Part 2, there is a wide range of properties that can be defined for your plots. These properties are processed and passed down to the primitives, for your convenience. Ultimately, you can override anything you want just by directly setting a property to the object itself." + "As discussed in Part 3, there is a wide range of properties that can be defined for your plots. These properties are processed and passed down to the primitives, for your convenience. Ultimately, you can override anything you want just by directly setting a property to the object itself." ] }, { @@ -178,8 +176,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -192,13 +189,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "fig, ax = plt.subplots(1, 1)\n", + "fig = plt.figure()\n", "print(plt.getp(fig.patch))" ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -226,8 +222,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "code", @@ -247,8 +242,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -266,8 +260,8 @@ "fig, ax = plt.subplots(1, 1)\n", "offsets = np.random.rand(20, 2)\n", "collection = RegularPolyCollection(\n", - " numsides=5, # a pentagon\n", - " sizes=(50,),\n", + " numsides=5, # a pentagon\n", + " sizes=(150,),\n", " offsets=offsets,\n", " transOffset=ax.transData,\n", " )\n", @@ -276,8 +270,7 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] }, { "cell_type": "markdown", @@ -297,11 +290,28 @@ ], "language": "python", "metadata": {}, - "outputs": [], - "prompt_number": null + "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from matplotlib.collections import StarPolygonCollection\n", + "\n", + "fig, ax = plt.subplots(1, 1)\n", + "\n", + "collection = StarPolygonCollection(5,\n", + " offsets=[(0.5, 0.5)],\n", + " transOffset=ax.transData)\n", + "ax.add_collection(collection)\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} diff --git a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb index eef1537..8ebaede 100644 --- a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb +++ b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb @@ -1,7 +1,6 @@ { "metadata": { - "name": "", - "signature": "sha256:e9c856312773c2ed88df57c5620883f24768b7e7288be4fc8f9bd7f0d7d73ba0" + "name": "" }, "nbformat": 3, "nbformat_minor": 0, @@ -12,8 +11,8 @@ "cell_type": "code", "collapsed": false, "input": [ - "# Not using inline mode here because I want to demo interactivity\n", - "%matplotlib\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], @@ -176,7 +175,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "And finally, as a nice, teaser of what else axes_grid1 can do..." + "And finally, as a nice teaser of what else axes_grid1 can do..." ] }, { @@ -198,7 +197,7 @@ "import mpl_toolkits.axisartist.floating_axes as floating_axes\n", "\n", "import numpy as np\n", - "import mpl_toolkits.axisartist.angle_helper as angle_helper\n", + "import mpl_toolkits.axisartist.angle_helper as angle_helper\n", "from matplotlib.projections import PolarAxes\n", "from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \\\n", " DictFormatter\n", @@ -348,15 +347,22 @@ " radius = np.random.rand(10)*14000.\n", " aux_ax3.scatter(theta, radius)\n", "\n", - " plt.show()\n", - "\n" + " plt.show()" ], "language": "python", "metadata": {}, "outputs": [] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} From 53925ee0f0fef2d679804d90ea3dc47ae3062152 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 27 Jun 2017 20:49:27 -0400 Subject: [PATCH 21/61] Refresh README and such --- README.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b83314b..6e405b9 100644 --- a/README.md +++ b/README.md @@ -7,22 +7,21 @@ ideas of how to improve this tutorial. Please fork and contribute back improvements! Feel free to use this tutorial for conferences and other opportunities for training. -The tutorial can be viewed on [nbviewer](http://nbviewer.ipython.org): -* [Part 0: Introduction To NumPy] -* [Part 1: Overview of Matplotlib] -* [Part 2: Plotting Methods] -* [Part 3: How To Speak MPL] -* [Part 4: Limits, Legends, and Layouts] -* [Part 5: Artists] -* [Part 6: mpl_toolkits] +The tutorial can be viewed on [nbviewer](http://nbviewer.jupyter.org): +* [Part 0: Introduction To NumPy](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb) +* [Part 1: Overview of Matplotlib](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb) +* [Part 2: Plotting Methods](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb) +* [Part 3: How To Speak MPL](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb) +* [Part 4: Limits, Legends, and Layouts](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb) +* [Part 5: Artists](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) +* [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) -Cheers! +* Installation +All you need is matplotlib (v1.5 or greater) and jupyter installed. +You can use your favorite Python package installer for this: +$ conda install matplotlib jupyter +$ git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git +$ cd AnatomyOfMatplotlib +$ jupyter notebook -[Part 0: Introduction To NumPy]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb -[Part 1: Overview of Matplotlib]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb -[Part 2: Plotting Methods]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb -[Part 3: How To Speak MPL]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb -[Part 4: Limits, Legends, and Layouts]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb -[Part 5: Artists]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb -[Part 6: mpl_toolkits]: http://nbviewer.ipython.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb From bc6fcd927ecde297d5be535be01c47256848049f Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 27 Jun 2017 20:54:36 -0400 Subject: [PATCH 22/61] I seemed to forgot how to do markdown... --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6e405b9..7ffd8cc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -* Introduction +# Introduction This tutorial is a complete re-imagining of how one should teach users the matplotlib library. Hopefully, this tutorial may serve as inspiration for future restructuring of the matplotlib documentation. Plus, I have some @@ -16,12 +16,12 @@ The tutorial can be viewed on [nbviewer](http://nbviewer.jupyter.org): * [Part 5: Artists](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) * [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) -* Installation +# Installation All you need is matplotlib (v1.5 or greater) and jupyter installed. You can use your favorite Python package installer for this: -$ conda install matplotlib jupyter -$ git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git -$ cd AnatomyOfMatplotlib -$ jupyter notebook +> conda install matplotlib jupyter +> git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git +> cd AnatomyOfMatplotlib +> jupyter notebook From d8510cc52d93b360ccc1999048f0258b8f290cbf Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 27 Jun 2017 20:57:54 -0400 Subject: [PATCH 23/61] Use code blocks for the install instructions --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7ffd8cc..ee93428 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,10 @@ The tutorial can be viewed on [nbviewer](http://nbviewer.jupyter.org): All you need is matplotlib (v1.5 or greater) and jupyter installed. You can use your favorite Python package installer for this: -> conda install matplotlib jupyter -> git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git -> cd AnatomyOfMatplotlib -> jupyter notebook +```bash +conda install matplotlib jupyter +git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git +cd AnatomyOfMatplotlib +jupyter notebook +``` From 321894f91561dc663a8d0975d5cae8829c910564 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 27 Jun 2017 21:18:20 -0400 Subject: [PATCH 24/61] Add a "test notebook" --- Test Install.ipynb | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Test Install.ipynb diff --git a/Test Install.ipynb b/Test Install.ipynb new file mode 100644 index 0000000..62a6fd6 --- /dev/null +++ b/Test Install.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import print_function\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "from matplotlib import pyplot as plt\n", + "\n", + "if matplotlib.__version__ < '1.5':\n", + " print('Matplotlib needs to be updated')\n", + "\n", + "plt.plot([1, 2, 3, 2, 1])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From a823c05527884b19942f6c02bbad6317be7861cd Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 27 Jun 2017 21:39:15 -0400 Subject: [PATCH 25/61] Update notebooks to v4 format (and fix a few links) --- AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb | 559 +++---- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 946 +++++------ ...tlib-Part2-Plotting_Methods_Overview.ipynb | 870 +++++----- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 1407 +++++++++-------- ...lib-Part4-Limits_Legends_and_Layouts.ipynb | 1081 ++++++------- AnatomyOfMatplotlib-Part5-Artists.ipynb | 599 +++---- AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb | 747 ++++----- 7 files changed, 3151 insertions(+), 3058 deletions(-) diff --git a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb index 6f1edd1..b2ff673 100644 --- a/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb +++ b/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb @@ -1,270 +1,297 @@ { - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NumPy\n", + "The NumPy package provides the \"ndarray\" object. The NumPy array is used to contain data of uniform type with an arbitrary number of dimensions. NumPy then provides basic mathematical and array methods to lay down the foundation for the entire SciPy ecosystem. The following import statement is the generally accepted convention for NumPy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Array Creation\n", + "There are several ways to make NumPy arrays. An array has three particular attributes that can be queried: shape, size and the number of dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "a = np.array([1, 2, 3])\n", + "print(a.shape)\n", + "print(a.size)\n", + "print(a.ndim)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = np.arange(100)\n", + "print(x.shape)\n", + "print(x.size)\n", + "print(x.ndim)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y = np.random.rand(5, 80)\n", + "print(y.shape)\n", + "print(y.size)\n", + "print(y.ndim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Array Manipulation\n", + "How to change the shape of an array without a copy!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x.shape = (20, 5)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NumPy can even automatically figure out the size of at most one dimension for you." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y.shape = (4, 20, -1)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Array Indexing" + ] + }, { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# NumPy\n", - "The NumPy package provides the \"ndarray\" object. The NumPy array is used to contain data of uniform type with an arbitrary number of dimensions. NumPy then provides basic mathematical and array methods to lay down the foundation for the entire SciPy ecosystem. The following import statement is the generally accepted convention for NumPy." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Array Creation\n", - "There are several ways to make NumPy arrays. An array has three particular attributes that can be queried: shape, size and the number of dimensions." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = np.array([1, 2, 3])\n", - "print(a.shape)\n", - "print(a.size)\n", - "print(a.ndim)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = np.arange(100)\n", - "print(x.shape)\n", - "print(x.size)\n", - "print(x.ndim)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "y = np.random.rand(5, 80)\n", - "print(y.shape)\n", - "print(y.size)\n", - "print(y.ndim)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Array Manipulation\n", - "How to change the shape of an array without a copy!" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x.shape = (20, 5)\n", - "print(x)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "NumPy can even automatically figure out the size of at most one dimension for you." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "y.shape = (4, 20, -1)\n", - "print(y.shape)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Array Indexing" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Scalar Indexing\n", - "print(x[2])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Slicing\n", - "print(x[2:5])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Advanced slicing\n", - "print(\"First 5 rows\\n\", x[:5])\n", - "print(\"Row 18 to the end\\n\", x[18:])\n", - "print(\"Last 5 rows\\n\", x[-5:])\n", - "print(\"Reverse the rows\\n\", x[::-1])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Boolean Indexing\n", - "print(x[(x % 2) == 0])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Fancy Indexing -- Note the use of a list, not tuple!\n", - "print(x[[1, 3, 8, 9, 2]])" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Broadcasting\n", - "Broadcasting is a very useful feature of NumPy that will let arrays with differing shapes still be used together. In most cases, broadcasting is faster, and it is more memory efficient than the equivalent full array operation." - ] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "print(\"Shape of X:\", x.shape)\n", - "print(\"Shape of Y:\", y.shape)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, here are three identical assignments. The first one takes full advantage of broadcasting by allowing NumPy to automatically add a new dimension to the *left*. The second explicitly adds that dimension with the special NumPy alias \"np.newaxis\". These first two creates a singleton dimension without any new arrays being created. That singleton dimension is then implicitly tiled, much like the third example to match with the RHS of the addition operator. However, unlike the third example, the broadcasting merely re-uses the existing data in memory." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "a = x + y\n", - "print(a.shape)\n", - "b = x[np.newaxis, :, :] + y\n", - "print(b.shape)\n", - "c = np.tile(x, (4, 1, 1)) + y\n", - "print(c.shape)\n", - "print(\"Are a and b identical?\", np.all(a == b))\n", - "print(\"Are a and c identical?\", np.all(a == c))" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another example of broadcasting two 1-D arrays to make a 2-D array." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = np.arange(-5, 5, 0.1)\n", - "y = np.arange(-8, 8, 0.25)\n", - "print(x.shape, y.shape)\n", - "z = x[np.newaxis, :] * y[:, np.newaxis]\n", - "print(z.shape)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# More concisely\n", - "y, x = np.ogrid[-8:8:0.25, -5:5:0.1]\n", - "print(x.shape, y.shape)\n", - "z = x * y\n", - "print(z.shape)" - ], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Scalar Indexing\n", + "print(x[2])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Slicing\n", + "print(x[2:5])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Advanced slicing\n", + "print(\"First 5 rows\\n\", x[:5])\n", + "print(\"Row 18 to the end\\n\", x[18:])\n", + "print(\"Last 5 rows\\n\", x[-5:])\n", + "print(\"Reverse the rows\\n\", x[::-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Boolean Indexing\n", + "print(x[(x % 2) == 0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Fancy Indexing -- Note the use of a list, not tuple!\n", + "print(x[[1, 3, 8, 9, 2]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Broadcasting\n", + "Broadcasting is a very useful feature of NumPy that will let arrays with differing shapes still be used together. In most cases, broadcasting is faster, and it is more memory efficient than the equivalent full array operation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "print(\"Shape of X:\", x.shape)\n", + "print(\"Shape of Y:\", y.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, here are three identical assignments. The first one takes full advantage of broadcasting by allowing NumPy to automatically add a new dimension to the *left*. The second explicitly adds that dimension with the special NumPy alias \"np.newaxis\". These first two creates a singleton dimension without any new arrays being created. That singleton dimension is then implicitly tiled, much like the third example to match with the RHS of the addition operator. However, unlike the third example, the broadcasting merely re-uses the existing data in memory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "a = x + y\n", + "print(a.shape)\n", + "b = x[np.newaxis, :, :] + y\n", + "print(b.shape)\n", + "c = np.tile(x, (4, 1, 1)) + y\n", + "print(c.shape)\n", + "print(\"Are a and b identical?\", np.all(a == b))\n", + "print(\"Are a and c identical?\", np.all(a == c))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another example of broadcasting two 1-D arrays to make a 2-D array." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = np.arange(-5, 5, 0.1)\n", + "y = np.arange(-8, 8, 0.25)\n", + "print(x.shape, y.shape)\n", + "z = x[np.newaxis, :] * y[:, np.newaxis]\n", + "print(z.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# More concisely\n", + "y, x = np.ogrid[-8:8:0.25, -5:5:0.1]\n", + "print(x.shape, y.shape)\n", + "z = x * y\n", + "print(z.shape)" + ] } - ] + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index 12aab97..ae34b0d 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -1,4 +1,477 @@ { + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "-" + } + }, + "source": [ + "# Matplotlib\n", + "## Introduction\n", + "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Online Documentation\n", + "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", + "\n", + "## Gallery\n", + "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", + "\n", + "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", + "\n", + "## Mailing Lists and StackOverflow\n", + "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](https://mail.python.org/mailman/listinfo/matplotlib-users). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "\n", + "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too! We are also on [Gitter](https://gitter.im/matplotlib/matplotlib).\n", + "\n", + "## Github repository\n", + "### Location\n", + "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", + "\n", + "### Bug Reports and feature requests\n", + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quick note on \"backends\" and Jupyter notebooks\n", + "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "print(matplotlib.__version__)\n", + "print(matplotlib.get_backend())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", + "\n", + "Inside of IPython, it's often easiest to use the Jupyter ``nbagg`` or ``notebook`` backend. This allows plots to be displayed and interacted with inline in the browser in a Jupyter notebook. Otherwise, figures will pop up in a separate GUI window.\n", + "\n", + "We can do this in two ways:\n", + "\n", + "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", + " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", + " \n", + "2. ``matplotlib.use(\"backend_name\")``\n", + " - Figures will only be shown when you call ``plt.show()``.\n", + "\n", + "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", + "\n", + "One final note: You need to do this before you ``import matplotlib.pyplot``." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "matplotlib.use('nbagg')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# On with the show!\n", + "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", + "\n", + "## Anatomy of a \"Plot\"\n", + "\n", + "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", + "\n", + "\n", + "\n", + "\n", + "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures and ``Figure``s can contain multiple ``Axes``. \n", + "\n", + "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases, ``Axes`` and ``Subplot`` are synonymous.\n", + "\n", + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things all that much. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting Started\n", + "\n", + "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Figures\n", + "\n", + "Now let's create a figure..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Awww, nothing happened! This is because by default mpl will not show anything until told to do so, as we mentioned earlier in the \"backend\" discussion.\n", + "\n", + "Instead, we'll need to call ``plt.show()``" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great, a blank figure! Not terribly useful yet.\n", + "\n", + "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", + "\n", + "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Twice as tall as it is wide:\n", + "fig = plt.figure(figsize=plt.figaspect(2.0))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axes\n", + "\n", + "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object.\n", + "\n", + "Typically, you'll set up a `Figure`, and then add an `Axes` to it. \n", + "\n", + "You can use `fig.add_axes`, but in most cases, you'll find that adding a subplot will fit your needs perfectly. (Again a \"subplot\" is just an axes on a grid system.) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", + "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. \n", + "\n", + "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", + "\n", + "For example, we could have written the third line above as:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "ax.set_xlim([0.5, 4.5])\n", + "ax.set_ylim([-2, 8])\n", + "ax.set_title('An Example Axes')\n", + "ax.set_ylabel('Y-Axis')\n", + "ax.set_xlabel('X-Axis')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Clearly this can get repitive quickly. Therefore, Matplotlib's `set` method can be very handy. It takes each kwarg you pass it and tries to call the corresponding \"setter\". For example, `foo.set(bar='blah')` would call `foo.set_bar('blah')`.\n", + "\n", + "Note that the `set` method doesn't just apply to `Axes`; it applies to more-or-less all matplotlib objects.\n", + "\n", + "However, there are cases where you'll want to use things like `ax.set_xlabel('Some Label', size=25)` to control other options for a particular function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Plotting\n", + "\n", + "Most plotting happens on an `Axes`. Therefore, if you're plotting something on an axes, then you'll use one of its methods.\n", + "\n", + "We'll talk about different plotting methods in more depth in the next section. For now, let's focus on two methods: `plot` and `scatter`.\n", + "\n", + "`plot` draws points with lines connecting them. `scatter` draws unconnected points, optionally scaled or colored by additional variables.\n", + "\n", + "As a basic example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", + "ax.set_xlim(0.5, 4.5)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Axes methods vs. pyplot\n", + "\n", + "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", + "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", + "plt.xlim(0.5, 4.5)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", + "\n", + "\"Explicit is better than implicit\"\n", + "\n", + "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon.\n", + "\n", + "The advantage of keeping which axes we're working with very clear in our code will become more obvious when we start to have multiple axes in one figure." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple Axes\n", + "\n", + "We've mentioned before that a figure can have more than one `Axes` on it. If you want your axes to be on a regular grid system, then it's easiest to use `plt.subplots(...)` to create a figure and add the axes to it automatically.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`plt.subplots(...)` created a new figure and added 4 subplots to it. The `axes` object that was returned is a 2D numpy object array. Each item in the array is one of the subplots. They're laid out as you see them on the figure. \n", + "\n", + "Therefore, when we want to work with one of these axes, we can index the `axes` array and use that item's methods.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=2, ncols=2)\n", + "axes[0,0].set(title='Upper Left')\n", + "axes[0,1].set(title='Upper Right')\n", + "axes[1,0].set(title='Lower Left')\n", + "axes[1,1].set(title='Lower Right')\n", + "\n", + "# To iterate over all items in a multidimensional numpy array, use the `flat` attribute\n", + "for ax in axes.flat:\n", + " # Remove all xticks and yticks...\n", + " ax.set(xticks=[], yticks=[])\n", + " \n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One really nice thing about `plt.subplots()` is that when it's called with no arguments, it creates a new figure with a single subplot. \n", + "\n", + "Any time you see something like\n", + "\n", + "```\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "```\n", + "\n", + "You can replace it with:\n", + "\n", + "```\n", + "fig, ax = plt.subplots()\n", + "```\n", + "\n", + "We'll be using that approach for the rest of the examples. It's much cleaner. \n", + "\n", + "However, keep in mind that we're still creating a figure and adding axes to it. When we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Quick Exercise: Exercise 1.1\n", + "--------------\n", + "\n", + "Let's use some of what we've been talking about. Can you reproduce this figure?\n", + "\n", + "\n", + "\n", + "Here's the data and some code to get you started." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/1.1-subplots_and_basic_plotting.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Try to reproduce the figure shown in images/exercise_1-1.png\n", + "\n", + "# Our data...\n", + "x = np.linspace(0, 10, 100)\n", + "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", + "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", + "\n", + "# Can you figure out what to do next to plot x vs y1, y2, and y3 on one figure?\n" + ] + } + ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -15,474 +488,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" - }, - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n" - ], - "language": "python", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "# Matplotlib\n", - "## Introduction\n", - "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Online Documentation\n", - "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", - "\n", - "## Gallery\n", - "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", - "\n", - "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", - "\n", - "## Mailing Lists and StackOverflow\n", - "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](http://sourceforge.net/mail/?group_id=80706). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", - "\n", - "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too!\n", - "\n", - "## Github repository\n", - "### Location\n", - "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", - "\n", - "### Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quick note on \"backends\" and IPython notebooks\n", - "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib\n", - "print(matplotlib.__version__)\n", - "print(matplotlib.get_backend())" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", - "\n", - "Inside of IPython, it's often easiest to use the IPython ``nbagg`` backend. This allows plots to be displayed and interacted with inline in the browser in an IPython notebook. Otherwise, figures will pop up in a separate gui window.\n", - "\n", - "We can do this in two ways:\n", - "\n", - "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", - " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", - " \n", - "2. ``matplotlib.use(\"backend_name\")``\n", - " - Figures will only be shown when you call ``plt.show()``.\n", - "\n", - "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", - "\n", - "One final note: You need to do this before you ``import matplotlib.pyplot``." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "matplotlib.use('nbagg')" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# On with the show!\n", - "Matplotlib is a large project and can seem daunting at first. However, by learning the components, it should begin to feel much smaller and more approachable.\n", - "\n", - "###Anatomy of a \"Plot\"\n", - "\n", - "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", - "\n", - "\n", - "\n", - "\n", - "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures and ``Figure``s can contain multiple ``Axes``. \n", - "\n", - "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases, ``Axes`` and ``Subplot`` are synonymous.\n", - "\n", - "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things all that much. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Getting Started\n", - "\n", - "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Figures\n", - "\n", - "Now let's create a figure..." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Awww, nothing happened! This is because by default mpl will not show anything until told to do so, as we mentioned earlier in the \"backend\" discussion.\n", - "\n", - "Instead, we'll need to call ``plt.show()``" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great, a blank figure! Not terribly useful yet.\n", - "\n", - "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", - "\n", - "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Twice as tall as it is wide:\n", - "fig = plt.figure(figsize=plt.figaspect(2.0))\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axes\n", - "\n", - "All plotting is done with respect to an [`Axes`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes). An *Axes* is made up of [`Axis`](http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis) objects and many other things. An *Axes* object must belong to a *Figure* (and only one *Figure*). Most commands you will ever issue will be with respect to this *Axes* object.\n", - "\n", - "Typically, you'll set up a `Figure`, and then add an `Axes` to it. \n", - "\n", - "You can use `fig.add_axes`, but in most cases, you'll find that adding a subplot will fit your needs perfectly. (Again a \"subplot\" is just an axes on a grid system.) " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", - "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Notice the call to ``set``. Matplotlib's objects typically have lots of \"explicit setters\" -- in other words, functions that start with ``set_`` and control a particular option. \n", - "\n", - "To demonstrate this (and as an example of IPython's tab-completion), try typing `ax.set_` in a code cell, then hit the `` key. You'll see a long list of `Axes` methods that start with `set`.\n", - "\n", - "For example, we could have written the third line above as:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "ax.set_xlim([0.5, 4.5])\n", - "ax.set_ylim([-2, 8])\n", - "ax.set_title('An Example Axes')\n", - "ax.set_ylabel('Y-Axis')\n", - "ax.set_xlabel('X-Axis')" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Clearly this can get repitive quickly. Therefore, Matplotlib's `set` method can be very handy. It takes each kwarg you pass it and tries to call the corresponding \"setter\". For example, `foo.set(bar='blah')` would call `foo.set_bar('blah')`.\n", - "\n", - "Note that the `set` method doesn't just apply to `Axes`; it applies to more-or-less all matplotlib objects.\n", - "\n", - "However, there are cases where you'll want to use things like `ax.set_xlabel('Some Label', size=25)` to control other options for a particular function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Basic Plotting\n", - "\n", - "Most plotting happens on an `Axes`. Therefore, if you're plotting something on an axes, then you'll use one of its methods.\n", - "\n", - "We'll talk about different plotting methods in more depth in the next section. For now, let's focus on two methods: `plot` and `scatter`.\n", - "\n", - "`plot` draws points with lines connecting them. `scatter` draws unconnected points, optionally scaled or colored by additional variables.\n", - "\n", - "As a basic example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", - "ax.set_xlim(0.5, 4.5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###Axes methods vs. pyplot\n", - "\n", - "Interestingly, just about all methods of an *Axes* object exist as a function in the *pyplot* module (and vice-versa). For example, when calling `plt.xlim(1, 10)`, *pyplot* calls `ax.set_xlim(1, 10)` on whichever *Axes* is \"current\". Here is an equivalent version of the above example using just pyplot." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", - "plt.xlim(0.5, 4.5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", - "\n", - "\"Explicit is better than implicit\"\n", - "\n", - "While very simple plots, with short scripts would benefit from the conciseness of the pyplot implicit approach, when doing more complicated plots, or working within larger scripts, you will want to explicitly pass around the *Axes* and/or *Figure* object to operate upon.\n", - "\n", - "The advantage of keeping which axes we're working with very clear in our code will become more obvious when we start to have multiple axes in one figure." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple Axes\n", - "\n", - "We've mentioned before that a figure can have more than one `Axes` on it. If you want your axes to be on a regular grid system, then it's easiest to use `plt.subplots(...)` to create a figure and add the axes to it automatically.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(nrows=2, ncols=2)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`plt.subplots(...)` created a new figure and added 4 subplots to it. The `axes` object that was returned is a 2D numpy object array. Each item in the array is one of the subplots. They're laid out as you see them on the figure. \n", - "\n", - "Therefore, when we want to work with one of these axes, we can index the `axes` array and use that item's methods.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(nrows=2, ncols=2)\n", - "axes[0,0].set(title='Upper Left')\n", - "axes[0,1].set(title='Upper Right')\n", - "axes[1,0].set(title='Lower Left')\n", - "axes[1,1].set(title='Lower Right')\n", - "\n", - "# To iterate over all items in a multidimensional numpy array, use the `flat` attribute\n", - "for ax in axes.flat:\n", - " # Remove all xticks and yticks...\n", - " ax.set(xticks=[], yticks=[])\n", - " \n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One really nice thing about `plt.subplots()` is that when it's called with no arguments, it creates a new figure with a single subplot. \n", - "\n", - "Any time you see something like\n", - "\n", - "```\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "```\n", - "\n", - "You can replace it with:\n", - "\n", - "```\n", - "fig, ax = plt.subplots()\n", - "```\n", - "\n", - "We'll be using that approach for the rest of the examples. It's much cleaner. \n", - "\n", - "However, keep in mind that we're still creating a figure and adding axes to it. When we start making plot layouts that can't be described by `subplots`, we'll go back to creating the figure first and then adding axes to it one-by-one." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Quick Exercise: Exercise 1.1\n", - "--------------\n", - "\n", - "Let's use some of what we've been talking about. Can you reproduce this figure?\n", - "\n", - "\n", - "\n", - "Here's the data and some code to get you started." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/1.1-subplots_and_basic_plotting.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# Try to reproduce the figure shown in images/exercise_1-1.png\n", - "\n", - "# Our data...\n", - "x = np.linspace(0, 10, 100)\n", - "y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2)\n", - "names = ['Signal 1', 'Signal 2', 'Signal 3']\n", - "\n", - "# Can you figure out what to do next to plot x vs y1, y2, and y3 on one figure?\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 725f9de..4dfcd49 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -1,4 +1,438 @@ { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 2: Visual Overview of Plotting Functions\n", + "\n", + "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and matplotlib gallery is a great place to get examples of all of them. \n", + "\n", + "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down and give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", + "\n", + "Here's a simplified visual overview of matplotlib's most commonly used plot types. Let's browse through these, and then we'll go over a few in more detail. Clicking on any of these images will take you to the code that generated them. We'll skip that for now, but feel browse through it later." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Basics: 1D series/points\n", + "### What we've mentioned so far\n", + "\n", + "\n", + "### Other common plot types\n", + "\n", + "\n", + "\n", + "## 2D Arrays and Images\n", + "\n", + "\n", + "\n", + "\n", + "## Vector Fields\n", + "\n", + "\n", + "## Data Distributions\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Detailed Examples (of a few of these)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Let's get our standard imports out of the way\n", + "from __future__ import print_function\n", + "import numpy as np\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Input Data: 1D Series\n", + "\n", + "We've briefly mentioned `ax.plot(x, y)` and `ax.scatter(x, y)` to draw lines and points, respectively. We'll cover some of their options (markers, colors, linestyles, etc) in the next section. Let's move on to a couple of other common plot types.\n", + "\n", + "### Bar Plots: `ax.bar(...)` and `ax.barh(...)`\n", + "\n", + "\n", + "Bar plots are one of the most common plot types. Matplotlib's `ax.bar(...)` method can also plot general rectangles, but the default is optimized for a simple sequence of x, y values, where the rectangles have a constant width. There's also `ax.barh(...)` (for horizontal), which makes a constant-height assumption instead of a constant-width assumption." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "x = np.arange(5)\n", + "y = np.random.randn(5)\n", + "\n", + "fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))\n", + "\n", + "vert_bars = axes[0].bar(x, y, color='lightblue', align='center')\n", + "horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')\n", + "\n", + "# I'll also introduce axhline & axvline to draw a line all the way across the axes\n", + "# This can be a quick-n-easy way to draw an axis \"spine\".\n", + "axes[0].axhline(0, color='gray', linewidth=2)\n", + "axes[1].axvline(0, color='gray', linewidth=2)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort. Most of the time, you will not need to retain these returned objects. You will want to capture them for special customizing that may not be possible through the normal plotting mechanism.\n", + "\n", + "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus `for bar in vert_bars`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "vert_bars = ax.bar(x, y, color='lightblue', align='center')\n", + "\n", + "# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.\n", + "for bar in vert_bars:\n", + " if bar.xy[1] < 0:\n", + " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Keep in mind that any plotting method in matplotlib returns the artists that are plotted. We'll use it again, particularly when we get to adding colorbars to images." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filled Regions: `ax.fill(x, y)`, `fill_between(...)`, etc\n", + "\n", + "\n", + "Of these functions, `ax.fill_between(...)` is probably the one you'll use the most often. In its most basic form, it fills between the given y-values and 0:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "np.random.seed(1)\n", + "y = np.random.randn(100).cumsum()\n", + "x = np.linspace(0, 10, 100)\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.fill_between(x, y, color='lightblue')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, it can also be used to fill between two curves. This is particularly useful when you want to show an envelope of some sort (e.g. error, confidence, amplitude, etc)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = np.linspace(0, 10, 200)\n", + "y1 = 2 * x + 1\n", + "y2 = 3 * x + 1.2\n", + "y_mean = 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "# Plot the envelope with `fill_between`\n", + "ax.fill_between(x, y1, y2, color='yellow')\n", + "\n", + "# Plot the \"centerline\" with `plot`\n", + "ax.plot(x, y_mean, color='black')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 2.1:\n", + "\n", + "Now let's try combining `bar` and `fill_between` to make a nice prediction of what will happen as this class progresses:\n", + "\n", + "Can you reproduce the figure below?\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/2.1-bar_and_fill_between.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "np.random.seed(1)\n", + "\n", + "# Generate data...\n", + "y_raw = np.random.randn(1000).cumsum() + 15\n", + "x_raw = np.linspace(0, 24, y_raw.size)\n", + "\n", + "# Get averages of every 100 samples...\n", + "x_pos = x_raw.reshape(-1, 100).min(axis=1)\n", + "y_avg = y_raw.reshape(-1, 100).mean(axis=1)\n", + "y_err = y_raw.reshape(-1, 100).ptp(axis=1)\n", + "\n", + "bar_width = x_pos[1] - x_pos[0]\n", + "\n", + "# Make a made up future prediction with a fake confidence\n", + "x_pred = np.linspace(0, 30)\n", + "y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred\n", + "y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred\n", + "\n", + "# Just so you don't have to guess at the colors...\n", + "barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue'\n", + "\n", + "# Now you're on your own!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Input Data: 2D Arrays or Images\n", + "\n", + "There are several options for plotting 2D datasets. `imshow`, `pcolor`, and `pcolormesh` have a lot of overlap, at first glance. (The example image below is meant to clarify that somewhat.)\n", + "\n", + "\n", + "\n", + "\n", + "In short, `imshow` can interpolate and display large arrays very quickly, while `pcolormesh` and `pcolor` are much slower, but can handle flexible (i.e. more than just rectangular) arrangements of cells.\n", + "\n", + "We won't dwell too much on the differences and overlaps here. They have overlapping capabilities, but different default behavior because their primary use-cases are a bit different (there's also `matshow`, which is `imshow` with different defaults). \n", + "\n", + "Instead we'll focus on what they have in common.\n", + "\n", + "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap will return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Colorbars\n", + "\n", + "Let's add a colorbar to the figure to display what colors correspond to values of `data` we've plotted. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.cbook import get_sample_data\n", + "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "\n", + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='gist_earth')\n", + "fig.colorbar(im)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You may notice that `colorbar` is a `Figure` method and not an `Axes` method. That's because `colorbar` doesn't operate on the axes. Instead, it shrinks the current axes by a bit, adds a _new_ axes to the figure, and places the colorbar on that axes.\n", + "\n", + "The new axes that `fig.colorbar` creates is fairly limited in where it can be positioned. For example, it's always outside the axes it \"steals\" room from. Sometimes you may want to avoid \"stealing\" room from an axes or maybe even have the colorbar _inside_ another axes. In that case, you can manually create the axes for the colorbar and position it where you'd like:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])\n", + "\n", + "im = ax.imshow(data, cmap='gist_earth')\n", + "fig.colorbar(im, cax=cax, orientation='horizontal')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One note: In the last module in this tutorial, we'll briefly cover `axes_grid`, which is very useful for aligning colorbars and/or other axes with images displayed with `imshow`. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " ### Shared parameters for `imshow`, `pcolormesh`, `contour`, `scatter`, etc\n", + " \n", + " As we mentioned earlier, any plotting method that creates a `ScalarMappable` will have some common kwargs. The ones you'll use the most frequently are:\n", + " \n", + " * `cmap` : The colormap (or name of the colormap) used to display the input. (We'll go over the different colormaps in the next section.)\n", + " * `vmin` : The minimum data value that will correspond to the \"bottom\" of the colormap (defaults to the minimum of your input data).\n", + " * `vmax` : The maximum data value that will correspond to the \"top\" of the colormap (defaults to the maximum of your input data).\n", + " * `norm` : A `Normalize` instance to control how the data values are mapped to the colormap. By default, this will be a linear scaling between `vmin` and `vmax`, but other norms are available (e.g. `LogNorm`, `PowerNorm`, etc).\n", + " \n", + "`vmin` and `vmax` are particularly useful. Quite often, you'll want the colors to be mapped to a set range of data values, which aren't the min/max of your input data. For example, you might want a symmetric ranges of values around 0.\n", + "\n", + "As an example of that, let's use a divergent colormap with the data we showed earlier. We'll also use `interpolation=\"nearest\"` to \"turn off\" interpolation of the cells in the input dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from matplotlib.cbook import get_sample_data\n", + "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "\n", + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='seismic', interpolation='nearest')\n", + "fig.colorbar(im)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, we'd really like the white in the colormap to correspond to 0. A quick way to do this is to make the `vmin` equal to the negative of the `vmax`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "im = ax.imshow(data, cmap='seismic', interpolation='nearest',\n", + " vmin=-2, vmax=2)\n", + "fig.colorbar(im)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`vmin` and `vmax` are also very useful when we want multiple plots to share one colorbar, as our next exercise will do.\n", + "\n", + "## Exercise 2.2:\n", + "\n", + "Can you reproduce the figure below?\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/2.2-vmin_vmax_imshow_and_colorbars.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "np.random.seed(1)\n", + "\n", + "# Generate random data with different ranges...\n", + "data1 = np.random.random((10, 10))\n", + "data2 = 2 * np.random.random((10, 10))\n", + "data3 = 3 * np.random.random((10, 10))\n", + "\n", + "# Set up our figure and axes...\n", + "fig, axes = plt.subplots(ncols=3, figsize=plt.figaspect(0.5))\n", + "fig.tight_layout() # Make the subplots fill up the figure a bit more...\n", + "cax = fig.add_axes([0.25, 0.1, 0.55, 0.03]) # Add an axes for the colorbar\n", + "\n", + "# Now you're on your own!\n" + ] + } + ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -15,437 +449,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" - }, - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Part 2: Visual Overview of Plotting Functions\n", - "\n", - "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and matplotlib gallery is a great place to get examples of all of them. \n", - "\n", - "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down and give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", - "\n", - "Here's a simplified visual overview of matplotlib's most commonly used plot types. Let's browse through these, and then we'll go over a few in more detail. Clicking on any of these images will take you to the code that generated them. We'll skip that for now, but feel browse through it later." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The Basics: 1D series/points\n", - "### What we've mentioned so far\n", - "\n", - "\n", - "### Other common plot types\n", - "\n", - "\n", - "\n", - "## 2D Arrays and Images\n", - "\n", - "\n", - "\n", - "\n", - "## Vector Fields\n", - "\n", - "\n", - "## Data Distributions\n", - "" - ] - }, - { - "cell_type": "heading", - "level": 1, - "metadata": {}, - "source": [ - "Detailed Examples (of a few of these)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let's get our standard imports out of the way\n", - "from __future__ import print_function\n", - "import numpy as np\n", - "import matplotlib\n", - "matplotlib.use('nbagg')\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Input Data: 1D Series\n", - "\n", - "We've briefly mentioned `ax.plot(x, y)` and `ax.scatter(x, y)` to draw lines and points, respectively. We'll cover some of their options (markers, colors, linestyles, etc) in the next section. Let's move on to a couple of other common plot types.\n", - "\n", - "### Bar Plots: `ax.bar(...)` and `ax.barh(...)`\n", - "\n", - "\n", - "Bar plots are one of the most common plot types. Matplotlib's `ax.bar(...)` method can also plot general rectangles, but the default is optimized for a simple sequence of x, y values, where the rectangles have a constant width. There's also `ax.barh(...)` (for horizontal), which makes a constant-height assumption instead of a constant-width assumption." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "np.random.seed(1)\n", - "x = np.arange(5)\n", - "y = np.random.randn(5)\n", - "\n", - "fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))\n", - "\n", - "vert_bars = axes[0].bar(x, y, color='lightblue', align='center')\n", - "horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')\n", - "\n", - "# I'll also introduce axhline & axvline to draw a line all the way across the axes\n", - "# This can be a quick-n-easy way to draw an axis \"spine\".\n", - "axes[0].axhline(0, color='gray', linewidth=2)\n", - "axes[1].axvline(0, color='gray', linewidth=2)\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort. Most of the time, you will not need to retain these returned objects. You will want to capture them for special customizing that may not be possible through the normal plotting mechanism.\n", - "\n", - "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus `for bar in vert_bars`)." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "vert_bars = ax.bar(x, y, color='lightblue', align='center')\n", - "\n", - "# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.\n", - "for bar in vert_bars:\n", - " if bar.xy[1] < 0:\n", - " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Keep in mind that any plotting method in matplotlib returns the artists that are plotted. We'll use it again, particularly when we get to adding colorbars to images." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Filled Regions: `ax.fill(x, y)`, `fill_between(...)`, etc\n", - "\n", - "\n", - "Of these functions, `ax.fill_between(...)` is probably the one you'll use the most often. In its most basic form, it fills between the given y-values and 0:" - ] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "np.random.seed(1)\n", - "y = np.random.randn(100).cumsum()\n", - "x = np.linspace(0, 10, 100)\n", - "\n", - "fig, ax = plt.subplots()\n", - "ax.fill_between(x, y, color='lightblue')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, it can also be used to fill between two curves. This is particularly useful when you want to show an envelope of some sort (e.g. error, confidence, amplitude, etc)." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "x = np.linspace(0, 10, 200)\n", - "y1 = 2 * x + 1\n", - "y2 = 3 * x + 1.2\n", - "y_mean = 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1\n", - "\n", - "fig, ax = plt.subplots()\n", - "\n", - "# Plot the envelope with `fill_between`\n", - "ax.fill_between(x, y1, y2, color='yellow')\n", - "\n", - "# Plot the \"centerline\" with `plot`\n", - "ax.plot(x, y_mean, color='black')\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 2.1:\n", - "\n", - "Now let's try combining `bar` and `fill_between` to make a nice prediction of what will happen as this class progresses:\n", - "\n", - "Can you reproduce the figure below?\n", - "" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/2.1-bar_and_fill_between.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "np.random.seed(1)\n", - "\n", - "# Generate data...\n", - "y_raw = np.random.randn(1000).cumsum() + 15\n", - "x_raw = np.linspace(0, 24, y_raw.size)\n", - "\n", - "# Get averages of every 100 samples...\n", - "x_pos = x_raw.reshape(-1, 100).min(axis=1)\n", - "y_avg = y_raw.reshape(-1, 100).mean(axis=1)\n", - "y_err = y_raw.reshape(-1, 100).ptp(axis=1)\n", - "\n", - "bar_width = x_pos[1] - x_pos[0]\n", - "\n", - "# Make a made up future prediction with a fake confidence\n", - "x_pred = np.linspace(0, 30)\n", - "y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred\n", - "y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred\n", - "\n", - "# Just so you don't have to guess at the colors...\n", - "barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue'\n", - "\n", - "# Now you're on your own!\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Input Data: 2D Arrays or Images\n", - "\n", - "There are several options for plotting 2D datasets. `imshow`, `pcolor`, and `pcolormesh` have a lot of overlap, at first glance. (The example image below is meant to clarify that somewhat.)\n", - "\n", - "\n", - "\n", - "\n", - "In short, `imshow` can interpolate and display large arrays very quickly, while `pcolormesh` and `pcolor` are much slower, but can handle flexible (i.e. more than just rectangular) arrangements of cells.\n", - "\n", - "We won't dwell too much on the differences and overlaps here. They have overlapping capabilities, but different default behavior because their primary use-cases are a bit different (there's also `matshow`, which is `imshow` with different defaults). \n", - "\n", - "Instead we'll focus on what they have in common.\n", - "\n", - "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap will return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Colorbars\n", - "\n", - "Let's add a colorbar to the figure to display what colors correspond to values of `data` we've plotted. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from matplotlib.cbook import get_sample_data\n", - "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", - "\n", - "fig, ax = plt.subplots()\n", - "im = ax.imshow(data, cmap='gist_earth')\n", - "fig.colorbar(im)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You may notice that `colorbar` is a `Figure` method and not an `Axes` method. That's because `colorbar` doesn't operate on the axes. Instead, it shrinks the current axes by a bit, adds a _new_ axes to the figure, and places the colorbar on that axes.\n", - "\n", - "The new axes that `fig.colorbar` creates is fairly limited in where it can be positioned. For example, it's always outside the axes it \"steals\" room from. Sometimes you may want to avoid \"stealing\" room from an axes or maybe even have the colorbar _inside_ another axes. In that case, you can manually create the axes for the colorbar and position it where you'd like:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])\n", - "\n", - "im = ax.imshow(data, cmap='gist_earth')\n", - "fig.colorbar(im, cax=cax, orientation='horizontal')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One note: In the last module in this tutorial, we'll briefly cover `axes_grid`, which is very useful for aligning colorbars and/or other axes with images displayed with `imshow`. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " ### Shared parameters for `imshow`, `pcolormesh`, `contour`, `scatter`, etc\n", - " \n", - " As we mentioned earlier, any plotting method that creates a `ScalarMappable` will have some common kwargs. The ones you'll use the most frequently are:\n", - " \n", - " * `cmap` : The colormap (or name of the colormap) used to display the input. (We'll go over the different colormaps in the next section.)\n", - " * `vmin` : The minimum data value that will correspond to the \"bottom\" of the colormap (defaults to the minimum of your input data).\n", - " * `vmax` : The maximum data value that will correspond to the \"top\" of the colormap (defaults to the maximum of your input data).\n", - " * `norm` : A `Normalize` instance to control how the data values are mapped to the colormap. By default, this will be a linear scaling between `vmin` and `vmax`, but other norms are available (e.g. `LogNorm`, `PowerNorm`, etc).\n", - " \n", - "`vmin` and `vmax` are particularly useful. Quite often, you'll want the colors to be mapped to a set range of data values, which aren't the min/max of your input data. For example, you might want a symmetric ranges of values around 0.\n", - "\n", - "As an example of that, let's use a divergent colormap with the data we showed earlier. We'll also use `interpolation=\"nearest\"` to \"turn off\" interpolation of the cells in the input dataset:" - ] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "from matplotlib.cbook import get_sample_data\n", - "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", - "\n", - "fig, ax = plt.subplots()\n", - "im = ax.imshow(data, cmap='seismic', interpolation='nearest')\n", - "fig.colorbar(im)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, we'd really like the white in the colormap to correspond to 0. A quick way to do this is to make the `vmin` equal to the negative of the `vmax`. " - ] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "fig, ax = plt.subplots()\n", - "im = ax.imshow(data, cmap='seismic', interpolation='nearest',\n", - " vmin=-2, vmax=2)\n", - "fig.colorbar(im)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`vmin` and `vmax` are also very useful when we want multiple plots to share one colorbar, as our next exercise will do.\n", - "\n", - "## Exercise 2.2:\n", - "\n", - "Can you reproduce the figure below?\n", - "" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/2.2-vmin_vmax_imshow_and_colorbars.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "np.random.seed(1)\n", - "\n", - "# Generate random data with different ranges...\n", - "data1 = np.random.random((10, 10))\n", - "data2 = 2 * np.random.random((10, 10))\n", - "data3 = 3 * np.random.random((10, 10))\n", - "\n", - "# Set up our figure and axes...\n", - "fig, axes = plt.subplots(ncols=3, figsize=plt.figaspect(0.5))\n", - "fig.tight_layout() # Make the subplots fill up the figure a bit more...\n", - "cax = fig.add_axes([0.25, 0.1, 0.55, 0.03]) # Add an axes for the colorbar\n", - "\n", - "# Now you're on your own!\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 02bf569..5cd063d 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -1,4 +1,712 @@ { + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n", + "# Turning on inline plots -- just for use in ipython notebooks.\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to speak \"MPL\"\n", + "In the previous parts, you learned how matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many plotting methods that matplotlib has to draw on those axes. With all that knowledge, you should be off making great and wonderful figures. Why are you still here?\n", + "\n", + "\"We don't know how to control our plots and figures!\" says some random voice in the back of the room.\n", + "\n", + "Of course! While the previous sections may have taught you some of the structure and syntax of matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of matplotlib.\n", + "\n", + "# Colors\n", + "This is, perhaps, the most important piece of vocabulary in matplotlib. Given that matplotlib is a plotting library, colors are associated with everything that is plotted in your figures. Matplotlib supports a [very robust language](http://matplotlib.org/api/colors_api.html#module-matplotlib.colors) for specifying colors that should be familiar to a wide variety of users.\n", + "\n", + "### Colornames\n", + "First, colors can be given as strings. For very basic colors, you can even get away with just a single letter:\n", + "\n", + "- b: blue\n", + "- g: green\n", + "- r: red\n", + "- c: cyan\n", + "- m: magenta\n", + "- y: yellow\n", + "- k: black\n", + "- w: white\n", + "\n", + "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\" are valid. See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (Note, I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", + "\n", + "### Hex values\n", + "Colors can also be specified by supplying an HTML/CSS hex string, such as `'#0000FF'` for blue.\n", + "\n", + "### 256 Shades of Gray\n", + "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a lighter shade of gray.\n", + "\n", + "### RGB[A] tuples\n", + "You may come upon instances where the previous ways of specifying colors do not work. This can sometimes happen in some of the deeper, stranger levels of the code. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", + "\n", + "In functions such as `plot()` and `scatter()`, while it may appear that they can take a color specification, what they really need is a \"format specification\", which includes color as part of the format. Unfortunately, such specifications are string only and so RGB[A] tuples are not supported for such arguments (but you can still pass an RGB[A] tuple for a \"color\" argument).\n", + "\n", + "Note, oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this problem.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 3.1\n", + "Try out some different string representations of colors (you can't do RGB[A] tuples here)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/3.1-colors.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Markers\n", + "[Markers](http://matplotlib.org/api/markers_api.html) are commonly used in [`plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) plots, but also show up elsewhere. There is a wide set of markers available, and custom markers can even be specified.\n", + "\n", + "marker | description ||marker | description ||marker | description ||marker | description \n", + ":----------|:--------------||:---------|:--------------||:---------|:--------------||:---------|:--------------\n", + "\".\" | point ||\"+\" | plus ||\",\" | pixel ||\"x\" | cross\n", + "\"o\" | circle ||\"D\" | diamond ||\"d\" | thin_diamond || |\n", + "\"8\" | octagon ||\"s\" | square ||\"p\" | pentagon ||\"\\*\" | star\n", + "\"|\" | vertical line||\"\\_\" | horizontal line ||\"h\" | hexagon1 ||\"H\" | hexagon2\n", + "0 | tickleft ||4 | caretleft ||\"<\" | triangle_left ||\"3\" | tri_left\n", + "1 | tickright ||5 | caretright ||\">\" | triangle_right||\"4\" | tri_right\n", + "2 | tickup ||6 | caretup ||\"^\" | triangle_up ||\"2\" | tri_up\n", + "3 | tickdown ||7 | caretdown ||\"v\" | triangle_down ||\"1\" | tri_down\n", + "\"None\" | nothing ||`None` | nothing ||\" \" | nothing ||\"\" | nothing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "xs, ys = np.mgrid[:4, 9:0:-1]\n", + "markers = [\".\", \"+\", \",\", \"x\", \"o\", \"D\", \"d\", \"\", \"8\", \"s\", \"p\", \"*\", \"|\", \"_\", \"h\", \"H\", 0, 4, \"<\", \"3\",\n", + " 1, 5, \">\", \"4\", 2, 6, \"^\", \"2\", 3, 7, \"v\", \"1\", \"None\", None, \" \", \"\"]\n", + "descripts = [\"point\", \"plus\", \"pixel\", \"cross\", \"circle\", \"diamond\", \"thin diamond\", \"\",\n", + " \"octagon\", \"square\", \"pentagon\", \"star\", \"vertical bar\", \"horizontal bar\", \"hexagon 1\", \"hexagon 2\",\n", + " \"tick left\", \"caret left\", \"triangle left\", \"tri left\", \"tick right\", \"caret right\", \"triangle right\", \"tri right\",\n", + " \"tick up\", \"caret up\", \"triangle up\", \"tri up\", \"tick down\", \"caret down\", \"triangle down\", \"tri down\",\n", + " \"Nothing\", \"Nothing\", \"Nothing\", \"Nothing\"]\n", + "fig, ax = plt.subplots(1, 1, figsize=(14, 4))\n", + "for x, y, m, d in zip(xs.T.flat, ys.T.flat, markers, descripts):\n", + " ax.scatter(x, y, marker=m, s=100)\n", + " ax.text(x + 0.1, y - 0.1, d, size=14)\n", + "ax.set_axis_off()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 3.2\n", + "Try out some different markers and colors" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/3.2-markers.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linestyles\n", + "Line styles are about as commonly used as colors. There are a few predefined linestyles available to use. Note that there are some advanced techniques to specify some custom line styles. [Here](http://matplotlib.org/1.3.0/examples/lines_bars_and_markers/line_demo_dash_control.html) is an example of a custom dash pattern.\n", + "\n", + "linestyle | description\n", + "-------------------|------------------------------\n", + "'-' | solid\n", + "'--' | dashed\n", + "'-.' | dashdot\n", + "':' | dotted\n", + "'None' | draw nothing\n", + "' ' | draw nothing\n", + "'' | draw nothing\n", + "\n", + "Also, don't mix up \".-\" (line with dot markers) and \"-.\" (dash-dot line) when using the ``plot`` function!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t, '-', t, t**2, '--', t, t**3, '-.', t, -t, ':')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is a bit confusing, but the line styles mentioned above are only valid for lines. Whenever you are dealing with the linestyles of the edges of \"Patch\" objects, you will need to use words instead of the symbols. So \"solid\" instead of \"-\", and \"dashdot\" instead of \"-.\". This issue will be fixed for the v2.1 release and allow these specifications to be used interchangably." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "ax.bar([1, 2, 3, 4], [10, 20, 15, 13], ls='dashed', ec='r', lw=5)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plot attributes\n", + "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For the [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`plt.scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) functions, you can mix the specification for the colors, linestyles, and markers in a single string." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0., 5., 0.2)\n", + "# red dashes, blue squares and green triangles\n", + "plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "| Property | Value Type \n", + "|------------------------|-------------------------------------------------\n", + "|alpha | float \n", + "|color or c | any matplotlib color \n", + "|dash_capstyle | ['butt', 'round' 'projecting'] \n", + "|dash_joinstyle | ['miter' 'round' 'bevel']\n", + "|dashes | sequence of on/off ink in points \n", + "|drawstyle | [ ‘default’ ‘steps’ ‘steps-pre’\n", + "| | ‘steps-mid’ ‘steps-post’ ]\n", + "|linestyle or ls | [ '-' '--' '-.' ':' 'None' ' ' ''] \n", + "| | and any drawstyle in combination with a \n", + "| | linestyle, e.g. 'steps--'. \n", + "|linewidth or lw | float value in points \n", + "|marker | [ 0 1 2 3 4 5 6 7 'o' 'd' 'D' 'h' 'H'\n", + "| | '' 'None' ' ' `None` '8' 'p' ','\n", + "| | '+' 'x' '.' 's' '\\*' '\\_' '|'\n", + "| | '1' '2' '3' '4' 'v' '<' '>' '^' ]\n", + "|markeredgecolor or mec | any matplotlib color\n", + "|markeredgewidth or mew | float value in points\n", + "|markerfacecolor or mfc | any matplotlib color\n", + "|markersize or ms | float\n", + "|solid_capstyle | ['butt' 'round' 'projecting']\n", + "|solid_joinstyle | ['miter' 'round' 'bevel']\n", + "|visible | [`True` `False`]\n", + "|zorder | any number\n", + "\n", + "## Exercise 3.3\n", + "Make a plot that has a dotted red line, with large yellow diamond markers that have a green edge" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/3.3-properties.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.1)\n", + "a = np.exp(-t) * np.cos(2*np.pi*t)\n", + "plt.plot(t, a, )\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Colormaps\n", + "Another very important property of many figures is the colormap. The job of a colormap is to relate a scalar value to a color. In addition to the regular portion of the colormap, an \"over\", \"under\" and \"bad\" color can be optionally defined as well. NaNs will trigger the \"bad\" part of the colormap.\n", + "\n", + "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The upcoming v2.0 release of matplotlib will take on a new default colormap along with some other stylistic changes to the defaults. The defaults will be discussed this week during SciPy 2015.\n", + "\n", + "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load http://matplotlib.org/mpl_examples/color/colormaps_reference.py # For those with v1.2 or higher" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Reference for colormaps included with Matplotlib.\n", + "\n", + "This reference example shows all colormaps included with Matplotlib. Note that\n", + "any colormap listed here can be reversed by appending \"_r\" (e.g., \"pink_r\").\n", + "These colormaps are divided into the following categories:\n", + "\n", + "Sequential:\n", + " These colormaps are approximately monochromatic colormaps varying smoothly\n", + " between two color tones---usually from low saturation (e.g. white) to high\n", + " saturation (e.g. a bright blue). Sequential colormaps are ideal for\n", + " representing most scientific data since they show a clear progression from\n", + " low-to-high values.\n", + "\n", + "Diverging:\n", + " These colormaps have a median value (usually light in color) and vary\n", + " smoothly to two different color tones at high and low values. Diverging\n", + " colormaps are ideal when your data has a median value that is significant\n", + " (e.g. 0, such that positive and negative values are represented by\n", + " different colors of the colormap).\n", + "\n", + "Qualitative:\n", + " These colormaps vary rapidly in color. Qualitative colormaps are useful for\n", + " choosing a set of discrete colors. For example::\n", + "\n", + " color_list = plt.cm.Set3(np.linspace(0, 1, 12))\n", + "\n", + " gives a list of RGB colors that are good for plotting a series of lines on\n", + " a dark background.\n", + "\n", + "Miscellaneous:\n", + " Colormaps that don't fit into the categories above.\n", + "\n", + "\"\"\"\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "cmaps = [('Sequential', ['binary', 'Blues', 'BuGn', 'BuPu', 'gist_yarg',\n", + " 'GnBu', 'Greens', 'Greys', 'Oranges', 'OrRd',\n", + " 'PuBu', 'PuBuGn', 'PuRd', 'Purples', 'RdPu',\n", + " 'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']),\n", + " ('Sequential (2)', ['afmhot', 'autumn', 'bone', 'cool', 'copper',\n", + " 'gist_gray', 'gist_heat', 'gray', 'hot', 'pink',\n", + " 'spring', 'summer', 'winter']),\n", + " ('Diverging', ['BrBG', 'bwr', 'coolwarm', 'PiYG', 'PRGn', 'PuOr',\n", + " 'RdBu', 'RdGy', 'RdYlBu', 'RdYlGn', 'seismic']),\n", + " ('Qualitative', ['Accent', 'Dark2', 'hsv', 'Paired', 'Pastel1',\n", + " 'Pastel2', 'Set1', 'Set2', 'Set3', 'spectral']),\n", + " ('Miscellaneous', ['gist_earth', 'gist_ncar', 'gist_rainbow',\n", + " 'gist_stern', 'jet', 'brg', 'CMRmap', 'cubehelix',\n", + " 'gnuplot', 'gnuplot2', 'ocean', 'rainbow',\n", + " 'terrain', 'flag', 'prism'])]\n", + "\n", + "\n", + "nrows = max(len(cmap_list) for cmap_category, cmap_list in cmaps)\n", + "gradient = np.linspace(0, 1, 256)\n", + "gradient = np.vstack((gradient, gradient))\n", + "\n", + "def plot_color_gradients(cmap_category, cmap_list):\n", + " fig, axes = plt.subplots(nrows=nrows)\n", + " fig.subplots_adjust(top=0.95, bottom=0.01, left=0.2, right=0.99)\n", + " axes[0].set_title(cmap_category + ' colormaps', fontsize=14)\n", + "\n", + " for ax, name in zip(axes, cmap_list):\n", + " ax.imshow(gradient, aspect='auto', cmap=plt.get_cmap(name))\n", + " pos = list(ax.get_position().bounds)\n", + " x_text = pos[0] - 0.01\n", + " y_text = pos[1] + pos[3]/2.\n", + " fig.text(x_text, y_text, name, va='center', ha='right', fontsize=10)\n", + "\n", + " # Turn off *all* ticks & spines, not just the ones with colormaps.\n", + " for ax in axes:\n", + " ax.set_axis_off()\n", + "\n", + "for cmap_category, cmap_list in cmaps:\n", + " plot_color_gradients(cmap_category, cmap_list)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When colormaps are created in mpl, they get \"registered\" with a name. This allows one to specify a colormap to use by name." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2)\n", + "z = np.random.random((10, 10))\n", + "ax1.imshow(z, interpolation='none', cmap='gray')\n", + "ax2.imshow(z, interpolation='none', cmap='coolwarm')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Mathtext\n", + "Oftentimes, you just simply need that superscript or some other math text in your labels. Matplotlib provides a very easy way to do this for those familiar with LaTeX. Any text that is surrounded by dollar signs will be treated as \"[mathtext](http://matplotlib.org/users/mathtext.html#mathtext-tutorial)\". Do note that because backslashes are prevelent in LaTeX, it is often a good idea to prepend an `r` to your string literal so that Python will not treat the backslashes as escape characters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "plt.scatter([1, 2, 3, 4], [4, 3, 2, 1])\n", + "plt.title(r'$\\sigma_i=15$', fontsize=20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Annotations and Arrows\n", + "There are two ways one can place arbitrary text anywhere they want on a plot. The first is a simple [`text()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.text). Then there is the fancier [`annotate()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate) function that can help \"point out\" what you want to annotate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.01)\n", + "s = np.cos(2*np.pi*t)\n", + "plt.plot(t, s, lw=2)\n", + "\n", + "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", + " arrowprops=dict(facecolor='black', shrink=0.05))\n", + "\n", + "plt.ylim(-2, 2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are all sorts of boxes for your text, and arrows you can use, and there are many different ways to connect the text to the point that you want to annotate. For a complete tutorial on this topic, go to the [Annotation Guide](http://matplotlib.org/users/annotations_guide.html). In the meantime, here is a table of the kinds of arrows that can be drawn " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.patches as mpatches\n", + "\n", + "styles = mpatches.ArrowStyle.get_styles()\n", + "\n", + "ncol = 2\n", + "nrow = (len(styles)+1) // ncol\n", + "figheight = (nrow+0.5)\n", + "fig = plt.figure(figsize=(4.0*ncol/0.85, figheight/0.85))\n", + "fontsize = 0.4 * 70\n", + "\n", + "ax = fig.add_axes([0, 0, 1, 1])\n", + "ax.set_xlim(0, 4*ncol)\n", + "ax.set_ylim(0, figheight)\n", + "\n", + "def to_texstring(s):\n", + " s = s.replace(\"<\", r\"$<$\")\n", + " s = s.replace(\">\", r\"$>$\")\n", + " s = s.replace(\"|\", r\"$|$\")\n", + " return s\n", + "\n", + "for i, (stylename, styleclass) in enumerate(sorted(styles.items())):\n", + " x = 3.2 + (i//nrow)*4\n", + " y = (figheight - 0.7 - i%nrow)\n", + " p = mpatches.Circle((x, y), 0.2, fc=\"w\")\n", + " ax.add_patch(p)\n", + "\n", + " ax.annotate(to_texstring(stylename), (x, y),\n", + " (x-1.2, y),\n", + " ha=\"right\", va=\"center\",\n", + " size=fontsize,\n", + " arrowprops=dict(arrowstyle=stylename,\n", + " patchB=p,\n", + " shrinkA=50,\n", + " shrinkB=5,\n", + " fc=\"w\", ec=\"k\",\n", + " connectionstyle=\"arc3,rad=-0.25\",\n", + " ),\n", + " bbox=dict(boxstyle=\"square\", fc=\"w\"))\n", + "\n", + "ax.set_axis_off()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 3.4\n", + "Point out a local minimum with a fancy red arrow." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/3.4-arrows.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "t = np.arange(0.0, 5.0, 0.01)\n", + "s = np.cos(2*np.pi*t)\n", + "plt.plot(t, s, lw=2)\n", + "\n", + "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", + " arrowprops=dict())\n", + "\n", + "plt.ylim(-2, 2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hatches\n", + "A Patch object can have a hatching defined for it.\n", + "\n", + "* / - diagonal hatching\n", + "* \\ - back diagonal\n", + "* | - vertical\n", + "* \\- - horizontal\n", + "* \\+ - crossed\n", + "* x - crossed diagonal\n", + "* o - small circle\n", + "* O - large circle (upper-case 'o')\n", + "* . - dots\n", + "* \\* - stars\n", + " \n", + "Letters can be combined, in which case all the specified\n", + "hatchings are done. If same letter repeats, it increases the\n", + "density of hatching of that pattern.\n", + "\n", + "## Ugly tie contest!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "bars = plt.bar([1, 2, 3, 4], [10, 12, 15, 17])\n", + "plt.setp(bars[0], hatch='x', facecolor='w')\n", + "plt.setp(bars[1], hatch='xx-', facecolor='orange')\n", + "plt.setp(bars[2], hatch='+O.', facecolor='c')\n", + "plt.setp(bars[3], hatch='*', facecolor='y')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transforms\n", + "The topic of transforms in matplotlib, that is the ability to map the coordinates specified by your data to the coordinates of your figure, is very advanced and will not be covered in this tutorial. For those who are interested in learning about them, see the [transformation tutorial](http://matplotlib.org/users/transforms_tutorial.html). For those who are really daring, there are the developer guides to [transforms](http://matplotlib.org/devel/transformations.html) and [scales](http://matplotlib.org/devel/add_new_projection.html). While most users will never, ever need to understand matplotlib transforms to the level described in those links, it is important to be aware of them, and their critical role in figure-making.\n", + "\n", + "In a figure, there are four coordinate systems: *display*, *figure*, *axes*, and *data*. Transforms are used to convert coordinates in one system into another system for various uses. This is how matplotlib knows exactly where to place the ticks and ticklabels, even when you change the axis limits. The ticker says that the tick and label \"1.5\", for example, are to go at data x-coordinate 1.5. The transform says that location is at 0.4 in axes x-coordinate space. Meanwhile, the xlabel of \"Distance\" is placed at axes x-coordinate space of 0.5 (half-way). Meanwhile, a legend might be placed at a location relative to the figure coordinates.\n", + "\n", + "Furthermore, the transform system is what is used to allow various scales to work, such as log scales. The transform system is what is used to make the polar plots work seamlessly. Whether you realize it or not, you use the transforms system in matplotlib all the time. Everything drawn in matplotlib has a transform associated with it. Most of the time, you will never notice this, and will happily operate within the *data* coordinate system. But when you want to do some more advanced plots, with some eye-catching visual tricks, the transform system will be there for you." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Managing the unmanagable -- Introducing matplotlibrc\n", + "Matplotlib's greatest strength is its ability to give you complete control over every single aspect of your plots and figures. Matplotlib's second greatest strength is its ability to take as much control over as much of your plots and figures as you want. You, as the user, would never consider to use matplotlib if you had to specify all of these things for every single plot. Most of the time, the defaults are exactly what you want them to be.\n", + "\n", + "Matplotlib uses the matplotlibrc configuration file to define the plethora of defaults found in matplotlib. You can control the defaults of almost every property in matplotlib: figure size and dpi, line width, color and style, axes, axis and grid properties, text and font properties and so on. Just modify your rc file and re-run your scripts to produce your improved figures.\n", + "\n", + "To display where the currently active matplotlibrc file was loaded from, one can do the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "print(matplotlib.matplotlib_fname())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also change the rc settings during runtime within a python script or interactively from the python shell. All of the rc settings are stored in a dictionary-like variable called [`matplotlib.rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.matplotlib.rcParams), which is global to the matplotlib package. `rcParams` can be modified directly. Newer versions of matplotlib can use [`rc()`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rc), for example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "mpl.rcdefaults() # for when re-running this cell\n", + "\n", + "fig, (ax1, ax2) = plt.subplots(1, 2)\n", + "ax1.plot([1, 2, 3, 4])\n", + "\n", + "mpl.rc('lines', linewidth=2, linestyle='-.')\n", + "# Equivalent older, but still valid syntax\n", + "#mpl.rcParams['lines.linewidth'] = 2\n", + "#mpl.rcParams['lines.linestyle'] = '-.'\n", + "ax2.plot([1, 2, 3, 4])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To learn more, please see this guide on [customizing matplotlib](http://matplotlib.org/users/customizing.html)." + ] + } + ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -15,700 +723,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" - }, - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n", - "# Turning on inline plots -- just for use in ipython notebooks.\n", - "import matplotlib\n", - "matplotlib.use('nbagg')\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# How to speak \"MPL\"\n", - "In the previous parts, you learned how matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many plotting methods that matplotlib has to draw on those axes. With all that knowledge, you should be off making great and wonderful figures. Why are you still here?\n", - "\n", - "\"We don't know how to control our plots and figures!\" says some random voice in the back of the room.\n", - "\n", - "Of course! While the previous sections may have taught you some of the structure and syntax of matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of matplotlib.\n", - "\n", - "# Colors\n", - "This is, perhaps, the most important piece of vocabulary in matplotlib. Given that matplotlib is a plotting library, colors are associated with everything that is plotted in your figures. Matplotlib supports a [very robust language](http://matplotlib.org/api/colors_api.html#module-matplotlib.colors) for specifying colors that should be familiar to a wide variety of users.\n", - "\n", - "### Colornames\n", - "First, colors can be given as strings. For very basic colors, you can even get away with just a single letter:\n", - "\n", - "- b: blue\n", - "- g: green\n", - "- r: red\n", - "- c: cyan\n", - "- m: magenta\n", - "- y: yellow\n", - "- k: black\n", - "- w: white\n", - "\n", - "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\" are valid. See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (Note, I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", - "\n", - "### Hex values\n", - "Colors can also be specified by supplying an HTML/CSS hex string, such as `'#0000FF'` for blue.\n", - "\n", - "### 256 Shades of Gray\n", - "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a lighter shade of gray.\n", - "\n", - "### RGB[A] tuples\n", - "You may come upon instances where the previous ways of specifying colors do not work. This can sometimes happen in some of the deeper, stranger levels of the code. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", - "\n", - "In functions such as `plot()` and `scatter()`, while it may appear that they can take a color specification, what they really need is a \"format specification\", which includes color as part of the format. Unfortunately, such specifications are string only and so RGB[A] tuples are not supported for such arguments (but you can still pass an RGB[A] tuple for a \"color\" argument).\n", - "\n", - "Note, oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this problem.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 3.1\n", - "Try out some different string representations of colors (you can't do RGB[A] tuples here)." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/3.1-colors.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, , t, t**2, , t, t**3, )\n", - "plt.show()\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, , t, t**2, , t, t**3, )\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Markers\n", - "[Markers](http://matplotlib.org/api/markers_api.html) are commonly used in [`plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) plots, but also show up elsewhere. There is a wide set of markers available, and custom markers can even be specified.\n", - "\n", - "marker | description ||marker | description ||marker | description ||marker | description \n", - ":----------|:--------------||:---------|:--------------||:---------|:--------------||:---------|:--------------\n", - "\".\" | point ||\"+\" | plus ||\",\" | pixel ||\"x\" | cross\n", - "\"o\" | circle ||\"D\" | diamond ||\"d\" | thin_diamond || |\n", - "\"8\" | octagon ||\"s\" | square ||\"p\" | pentagon ||\"\\*\" | star\n", - "\"|\" | vertical line||\"\\_\" | horizontal line ||\"h\" | hexagon1 ||\"H\" | hexagon2\n", - "0 | tickleft ||4 | caretleft ||\"<\" | triangle_left ||\"3\" | tri_left\n", - "1 | tickright ||5 | caretright ||\">\" | triangle_right||\"4\" | tri_right\n", - "2 | tickup ||6 | caretup ||\"^\" | triangle_up ||\"2\" | tri_up\n", - "3 | tickdown ||7 | caretdown ||\"v\" | triangle_down ||\"1\" | tri_down\n", - "\"None\" | nothing ||`None` | nothing ||\" \" | nothing ||\"\" | nothing" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "xs, ys = np.mgrid[:4, 9:0:-1]\n", - "markers = [\".\", \"+\", \",\", \"x\", \"o\", \"D\", \"d\", \"\", \"8\", \"s\", \"p\", \"*\", \"|\", \"_\", \"h\", \"H\", 0, 4, \"<\", \"3\",\n", - " 1, 5, \">\", \"4\", 2, 6, \"^\", \"2\", 3, 7, \"v\", \"1\", \"None\", None, \" \", \"\"]\n", - "descripts = [\"point\", \"plus\", \"pixel\", \"cross\", \"circle\", \"diamond\", \"thin diamond\", \"\",\n", - " \"octagon\", \"square\", \"pentagon\", \"star\", \"vertical bar\", \"horizontal bar\", \"hexagon 1\", \"hexagon 2\",\n", - " \"tick left\", \"caret left\", \"triangle left\", \"tri left\", \"tick right\", \"caret right\", \"triangle right\", \"tri right\",\n", - " \"tick up\", \"caret up\", \"triangle up\", \"tri up\", \"tick down\", \"caret down\", \"triangle down\", \"tri down\",\n", - " \"Nothing\", \"Nothing\", \"Nothing\", \"Nothing\"]\n", - "fig, ax = plt.subplots(1, 1, figsize=(14, 4))\n", - "for x, y, m, d in zip(xs.T.flat, ys.T.flat, markers, descripts):\n", - " ax.scatter(x, y, marker=m, s=100)\n", - " ax.text(x + 0.1, y - 0.1, d, size=14)\n", - "ax.set_axis_off()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 3.2\n", - "Try out some different markers and colors" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/3.2-markers.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, , t, t**2, , t, t**3, )\n", - "plt.show()\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Linestyles\n", - "Line styles are about as commonly used as colors. There are a few predefined linestyles available to use. Note that there are some advanced techniques to specify some custom line styles. [Here](http://matplotlib.org/1.3.0/examples/lines_bars_and_markers/line_demo_dash_control.html) is an example of a custom dash pattern.\n", - "\n", - "linestyle | description\n", - "-------------------|------------------------------\n", - "'-' | solid\n", - "'--' | dashed\n", - "'-.' | dashdot\n", - "':' | dotted\n", - "'None' | draw nothing\n", - "' ' | draw nothing\n", - "'' | draw nothing\n", - "\n", - "Also, don't mix up \".-\" (line with dot markers) and \"-.\" (dash-dot line) when using the ``plot`` function!" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, '-', t, t**2, '--', t, t**3, '-.', t, -t, ':')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It is a bit confusing, but the line styles mentioned above are only valid for lines. Whenever you are dealing with the linestyles of the edges of \"Patch\" objects, you will need to use words instead of the symbols. So \"solid\" instead of \"-\", and \"dashdot\" instead of \"-.\". This issue will be fixed for the v2.1 release and allow these specifications to be used interchangably." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.bar([1, 2, 3, 4], [10, 20, 15, 13], ls='dashed', ec='r', lw=5)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Plot attributes\n", - "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For the [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`plt.scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) functions, you can mix the specification for the colors, linestyles, and markers in a single string." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0., 5., 0.2)\n", - "# red dashes, blue squares and green triangles\n", - "plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "| Property | Value Type \n", - "|------------------------|-------------------------------------------------\n", - "|alpha | float \n", - "|color or c | any matplotlib color \n", - "|dash_capstyle | ['butt', 'round' 'projecting'] \n", - "|dash_joinstyle | ['miter' 'round' 'bevel']\n", - "|dashes | sequence of on/off ink in points \n", - "|drawstyle | [ \u2018default\u2019 \u2018steps\u2019 \u2018steps-pre\u2019\n", - "| | \u2018steps-mid\u2019 \u2018steps-post\u2019 ]\n", - "|linestyle or ls | [ '-' '--' '-.' ':' 'None' ' ' ''] \n", - "| | and any drawstyle in combination with a \n", - "| | linestyle, e.g. 'steps--'. \n", - "|linewidth or lw | float value in points \n", - "|marker | [ 0 1 2 3 4 5 6 7 'o' 'd' 'D' 'h' 'H'\n", - "| | '' 'None' ' ' `None` '8' 'p' ','\n", - "| | '+' 'x' '.' 's' '\\*' '\\_' '|'\n", - "| | '1' '2' '3' '4' 'v' '<' '>' '^' ]\n", - "|markeredgecolor or mec | any matplotlib color\n", - "|markeredgewidth or mew | float value in points\n", - "|markerfacecolor or mfc | any matplotlib color\n", - "|markersize or ms | float\n", - "|solid_capstyle | ['butt' 'round' 'projecting']\n", - "|solid_joinstyle | ['miter' 'round' 'bevel']\n", - "|visible | [`True` `False`]\n", - "|zorder | any number\n", - "\n", - "## Exercise 3.3\n", - "Make a plot that has a dotted red line, with large yellow diamond markers that have a green edge" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/3.3-properties.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.1)\n", - "a = np.exp(-t) * np.cos(2*np.pi*t)\n", - "plt.plot(t, a, )\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Colormaps\n", - "Another very important property of many figures is the colormap. The job of a colormap is to relate a scalar value to a color. In addition to the regular portion of the colormap, an \"over\", \"under\" and \"bad\" color can be optionally defined as well. NaNs will trigger the \"bad\" part of the colormap.\n", - "\n", - "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The upcoming v2.0 release of matplotlib will take on a new default colormap along with some other stylistic changes to the defaults. The defaults will be discussed this week during SciPy 2015.\n", - "\n", - "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load http://matplotlib.org/mpl_examples/color/colormaps_reference.py # For those with v1.2 or higher" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "\"\"\"\n", - "Reference for colormaps included with Matplotlib.\n", - "\n", - "This reference example shows all colormaps included with Matplotlib. Note that\n", - "any colormap listed here can be reversed by appending \"_r\" (e.g., \"pink_r\").\n", - "These colormaps are divided into the following categories:\n", - "\n", - "Sequential:\n", - " These colormaps are approximately monochromatic colormaps varying smoothly\n", - " between two color tones---usually from low saturation (e.g. white) to high\n", - " saturation (e.g. a bright blue). Sequential colormaps are ideal for\n", - " representing most scientific data since they show a clear progression from\n", - " low-to-high values.\n", - "\n", - "Diverging:\n", - " These colormaps have a median value (usually light in color) and vary\n", - " smoothly to two different color tones at high and low values. Diverging\n", - " colormaps are ideal when your data has a median value that is significant\n", - " (e.g. 0, such that positive and negative values are represented by\n", - " different colors of the colormap).\n", - "\n", - "Qualitative:\n", - " These colormaps vary rapidly in color. Qualitative colormaps are useful for\n", - " choosing a set of discrete colors. For example::\n", - "\n", - " color_list = plt.cm.Set3(np.linspace(0, 1, 12))\n", - "\n", - " gives a list of RGB colors that are good for plotting a series of lines on\n", - " a dark background.\n", - "\n", - "Miscellaneous:\n", - " Colormaps that don't fit into the categories above.\n", - "\n", - "\"\"\"\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "\n", - "cmaps = [('Sequential', ['binary', 'Blues', 'BuGn', 'BuPu', 'gist_yarg',\n", - " 'GnBu', 'Greens', 'Greys', 'Oranges', 'OrRd',\n", - " 'PuBu', 'PuBuGn', 'PuRd', 'Purples', 'RdPu',\n", - " 'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']),\n", - " ('Sequential (2)', ['afmhot', 'autumn', 'bone', 'cool', 'copper',\n", - " 'gist_gray', 'gist_heat', 'gray', 'hot', 'pink',\n", - " 'spring', 'summer', 'winter']),\n", - " ('Diverging', ['BrBG', 'bwr', 'coolwarm', 'PiYG', 'PRGn', 'PuOr',\n", - " 'RdBu', 'RdGy', 'RdYlBu', 'RdYlGn', 'seismic']),\n", - " ('Qualitative', ['Accent', 'Dark2', 'hsv', 'Paired', 'Pastel1',\n", - " 'Pastel2', 'Set1', 'Set2', 'Set3', 'spectral']),\n", - " ('Miscellaneous', ['gist_earth', 'gist_ncar', 'gist_rainbow',\n", - " 'gist_stern', 'jet', 'brg', 'CMRmap', 'cubehelix',\n", - " 'gnuplot', 'gnuplot2', 'ocean', 'rainbow',\n", - " 'terrain', 'flag', 'prism'])]\n", - "\n", - "\n", - "nrows = max(len(cmap_list) for cmap_category, cmap_list in cmaps)\n", - "gradient = np.linspace(0, 1, 256)\n", - "gradient = np.vstack((gradient, gradient))\n", - "\n", - "def plot_color_gradients(cmap_category, cmap_list):\n", - " fig, axes = plt.subplots(nrows=nrows)\n", - " fig.subplots_adjust(top=0.95, bottom=0.01, left=0.2, right=0.99)\n", - " axes[0].set_title(cmap_category + ' colormaps', fontsize=14)\n", - "\n", - " for ax, name in zip(axes, cmap_list):\n", - " ax.imshow(gradient, aspect='auto', cmap=plt.get_cmap(name))\n", - " pos = list(ax.get_position().bounds)\n", - " x_text = pos[0] - 0.01\n", - " y_text = pos[1] + pos[3]/2.\n", - " fig.text(x_text, y_text, name, va='center', ha='right', fontsize=10)\n", - "\n", - " # Turn off *all* ticks & spines, not just the ones with colormaps.\n", - " for ax in axes:\n", - " ax.set_axis_off()\n", - "\n", - "for cmap_category, cmap_list in cmaps:\n", - " plot_color_gradients(cmap_category, cmap_list)\n", - "\n", - "plt.show()\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When colormaps are created in mpl, they get \"registered\" with a name. This allows one to specify a colormap to use by name." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2)\n", - "z = np.random.random((10, 10))\n", - "ax1.imshow(z, interpolation='none', cmap='gray')\n", - "ax2.imshow(z, interpolation='none', cmap='coolwarm')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Mathtext\n", - "Oftentimes, you just simply need that superscript or some other math text in your labels. Matplotlib provides a very easy way to do this for those familiar with LaTeX. Any text that is surrounded by dollar signs will be treated as \"[mathtext](http://matplotlib.org/users/mathtext.html#mathtext-tutorial)\". Do note that because backslashes are prevelent in LaTeX, it is often a good idea to prepend an `r` to your string literal so that Python will not treat the backslashes as escape characters." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.scatter([1, 2, 3, 4], [4, 3, 2, 1])\n", - "plt.title(r'$\\sigma_i=15$', fontsize=20)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Annotations and Arrows\n", - "There are two ways one can place arbitrary text anywhere they want on a plot. The first is a simple [`text()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.text). Then there is the fancier [`annotate()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate) function that can help \"point out\" what you want to annotate." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.01)\n", - "s = np.cos(2*np.pi*t)\n", - "plt.plot(t, s, lw=2)\n", - "\n", - "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", - " arrowprops=dict(facecolor='black', shrink=0.05))\n", - "\n", - "plt.ylim(-2, 2)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are all sorts of boxes for your text, and arrows you can use, and there are many different ways to connect the text to the point that you want to annotate. For a complete tutorial on this topic, go to the [Annotation Guide](http://matplotlib.org/users/annotations_guide.html). In the meantime, here is a table of the kinds of arrows that can be drawn " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib.patches as mpatches\n", - "\n", - "styles = mpatches.ArrowStyle.get_styles()\n", - "\n", - "ncol = 2\n", - "nrow = (len(styles)+1) // ncol\n", - "figheight = (nrow+0.5)\n", - "fig = plt.figure(figsize=(4.0*ncol/0.85, figheight/0.85))\n", - "fontsize = 0.4 * 70\n", - "\n", - "ax = fig.add_axes([0, 0, 1, 1])\n", - "ax.set_xlim(0, 4*ncol)\n", - "ax.set_ylim(0, figheight)\n", - "\n", - "def to_texstring(s):\n", - " s = s.replace(\"<\", r\"$<$\")\n", - " s = s.replace(\">\", r\"$>$\")\n", - " s = s.replace(\"|\", r\"$|$\")\n", - " return s\n", - "\n", - "for i, (stylename, styleclass) in enumerate(sorted(styles.items())):\n", - " x = 3.2 + (i//nrow)*4\n", - " y = (figheight - 0.7 - i%nrow)\n", - " p = mpatches.Circle((x, y), 0.2, fc=\"w\")\n", - " ax.add_patch(p)\n", - "\n", - " ax.annotate(to_texstring(stylename), (x, y),\n", - " (x-1.2, y),\n", - " ha=\"right\", va=\"center\",\n", - " size=fontsize,\n", - " arrowprops=dict(arrowstyle=stylename,\n", - " patchB=p,\n", - " shrinkA=50,\n", - " shrinkB=5,\n", - " fc=\"w\", ec=\"k\",\n", - " connectionstyle=\"arc3,rad=-0.25\",\n", - " ),\n", - " bbox=dict(boxstyle=\"square\", fc=\"w\"))\n", - "\n", - "ax.set_axis_off()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 3.4\n", - "Point out a local minimum with a fancy red arrow." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/3.4-arrows.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "t = np.arange(0.0, 5.0, 0.01)\n", - "s = np.cos(2*np.pi*t)\n", - "plt.plot(t, s, lw=2)\n", - "\n", - "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", - " arrowprops=dict())\n", - "\n", - "plt.ylim(-2, 2)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Hatches\n", - "A Patch object can have a hatching defined for it.\n", - "\n", - "* / - diagonal hatching\n", - "* \\ - back diagonal\n", - "* | - vertical\n", - "* \\- - horizontal\n", - "* \\+ - crossed\n", - "* x - crossed diagonal\n", - "* o - small circle\n", - "* O - large circle (upper-case 'o')\n", - "* . - dots\n", - "* \\* - stars\n", - " \n", - "Letters can be combined, in which case all the specified\n", - "hatchings are done. If same letter repeats, it increases the\n", - "density of hatching of that pattern.\n", - "\n", - "## Ugly tie contest!" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "bars = plt.bar([1, 2, 3, 4], [10, 12, 15, 17])\n", - "plt.setp(bars[0], hatch='x', facecolor='w')\n", - "plt.setp(bars[1], hatch='xx-', facecolor='orange')\n", - "plt.setp(bars[2], hatch='+O.', facecolor='c')\n", - "plt.setp(bars[3], hatch='*', facecolor='y')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Transforms\n", - "The topic of transforms in matplotlib, that is the ability to map the coordinates specified by your data to the coordinates of your figure, is very advanced and will not be covered in this tutorial. For those who are interested in learning about them, see the [transformation tutorial](http://matplotlib.org/users/transforms_tutorial.html). For those who are really daring, there are the developer guides to [transforms](http://matplotlib.org/devel/transformations.html) and [scales](http://matplotlib.org/devel/add_new_projection.html). While most users will never, ever need to understand matplotlib transforms to the level described in those links, it is important to be aware of them, and their critical role in figure-making.\n", - "\n", - "In a figure, there are four coordinate systems: *display*, *figure*, *axes*, and *data*. Transforms are used to convert coordinates in one system into another system for various uses. This is how matplotlib knows exactly where to place the ticks and ticklabels, even when you change the axis limits. The ticker says that the tick and label \"1.5\", for example, are to go at data x-coordinate 1.5. The transform says that location is at 0.4 in axes x-coordinate space. Meanwhile, the xlabel of \"Distance\" is placed at axes x-coordinate space of 0.5 (half-way). Meanwhile, a legend might be placed at a location relative to the figure coordinates.\n", - "\n", - "Furthermore, the transform system is what is used to allow various scales to work, such as log scales. The transform system is what is used to make the polar plots work seamlessly. Whether you realize it or not, you use the transforms system in matplotlib all the time. Everything drawn in matplotlib has a transform associated with it. Most of the time, you will never notice this, and will happily operate within the *data* coordinate system. But when you want to do some more advanced plots, with some eye-catching visual tricks, the transform system will be there for you." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Managing the unmanagable -- Introducing matplotlibrc\n", - "Matplotlib's greatest strength is its ability to give you complete control over every single aspect of your plots and figures. Matplotlib's second greatest strength is its ability to take as much control over as much of your plots and figures as you want. You, as the user, would never consider to use matplotlib if you had to specify all of these things for every single plot. Most of the time, the defaults are exactly what you want them to be.\n", - "\n", - "Matplotlib uses the matplotlibrc configuration file to define the plethora of defaults found in matplotlib. You can control the defaults of almost every property in matplotlib: figure size and dpi, line width, color and style, axes, axis and grid properties, text and font properties and so on. Just modify your rc file and re-run your scripts to produce your improved figures.\n", - "\n", - "To display where the currently active matplotlibrc file was loaded from, one can do the following:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib\n", - "print(matplotlib.matplotlib_fname())" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also change the rc settings during runtime within a python script or interactively from the python shell. All of the rc settings are stored in a dictionary-like variable called [`matplotlib.rcParams`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.matplotlib.rcParams), which is global to the matplotlib package. `rcParams` can be modified directly. Newer versions of matplotlib can use [`rc()`](http://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.rc), for example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib as mpl\n", - "import matplotlib.pyplot as plt\n", - "mpl.rcdefaults() # for when re-running this cell\n", - "\n", - "fig, (ax1, ax2) = plt.subplots(1, 2)\n", - "ax1.plot([1, 2, 3, 4])\n", - "\n", - "mpl.rc('lines', linewidth=2, linestyle='-.')\n", - "# Equivalent older, but still valid syntax\n", - "#mpl.rcParams['lines.linewidth'] = 2\n", - "#mpl.rcParams['lines.linestyle'] = '-.'\n", - "ax2.plot([1, 2, 3, 4])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To learn more, please see this guide on [customizing matplotlib](http://matplotlib.org/users/customizing.html)." - ] - } - ], - "metadata": {} + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index 2124b0c..3d1d4c7 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -1,4 +1,547 @@ { + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import print_function\n", + "\n", + "# Import conventions we'll be using here. See Part 1\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits, Legends, and Layouts\n", + "\n", + "In this section, we'll focus on what happens around the edges of the axes: Ticks, ticklabels, limits, layouts, and legends." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Limits and autoscaling\n", + "\n", + "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `ax.margins(...)`\n", + "\n", + "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", + "\n", + "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", + "ax2.margins(0.05) # 5% padding in all directions\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `ax.axis(...)`\n", + "\n", + "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", + "\n", + "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", + "\n", + " xmin, xmax, ymin, ymax = ax.axis()\n", + " \n", + "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", + "\n", + " ax.axis([xmin, xmax, ymin, ymax])\n", + " \n", + "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", + "\n", + " * *tight*: Set axes limits to the exact range of the data\n", + " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", + " \n", + "And as an example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(nrows=3)\n", + "\n", + "for ax in axes:\n", + " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "\n", + "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", + "\n", + "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", + "axes[1].axis('tight')\n", + "\n", + "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", + "axes[2].axis('equal')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Manually setting only one limit\n", + "\n", + "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Good -- setting limits after plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Bad -- Setting limits before plotting is done\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", + "ax1.set_ylim(bottom=-10)\n", + "ax2.set_xlim(right=25)\n", + "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Legends\n", + "\n", + "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", + "\n", + "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", + "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", + "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", + "ax.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", + "\n", + " ax.legend(loc=\"best\")\n", + " \n", + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label=\"_nolegend_\", marker='o', color='darkred')\n", + "ax.legend(loc='best')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 4.1\n", + "\n", + "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", + "\n", + "\n", + "\n", + "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/4.1-legends_and_scaling.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "t = np.linspace(0, 2 * np.pi, 150)\n", + "x1, y1 = np.cos(t), np.sin(t)\n", + "x2, y2 = 2 * x1, 2 * y1\n", + "\n", + "colors = ['darkred', 'darkgreen']\n", + "\n", + "# Try to plot the two circles, scale the axes as shown and add a legend\n", + "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dealing with the boundaries: Layout, ticks, spines, etc\n", + "\n", + "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", + "\n", + "## Ticks, Tick Lines, Tick Labels and Tickers\n", + "This is a constant source of confusion:\n", + "\n", + "* A Tick is the *location* of a Tick Label.\n", + "* A Tick Line is the line that denotes the location of the tick.\n", + "* A Tick Label is the text that is displayed at that tick.\n", + "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", + "\n", + "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", + "\n", + "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", + "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", + "\n", + "# Make the y-ticks a bit longer and go both in and out...\n", + "ax.tick_params(axis='y', direction='inout', length=10)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", + " \n", + "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", + "fruit, value = zip(*data)\n", + "\n", + "fig, ax = plt.subplots()\n", + "x = np.arange(len(fruit))\n", + "ax.bar(x, value, align='center', color='gray')\n", + "ax.set(xticks=x, xticklabels=fruit)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Subplot Spacing\n", + "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", + "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", + " left=0.125, right=0.9,\n", + " top=0.9, bottom=0.1)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", + "\n", + "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", + "\n", + "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def example_plot(ax):\n", + " ax.plot([1, 2])\n", + " ax.set_xlabel('x-label', fontsize=16)\n", + " ax.set_ylabel('y-label', fontsize=8)\n", + " ax.set_title('Title', fontsize=24)\n", + "\n", + "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", + "example_plot(ax1)\n", + "example_plot(ax2)\n", + "example_plot(ax3)\n", + "example_plot(ax4)\n", + "\n", + "# Try enabling fig.tight_layout to compare...\n", + "#fig.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## GridSpec\n", + "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sharing axes\n", + "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## \"Twinning\" axes\n", + "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax1 = plt.subplots(1, 1)\n", + "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", + "ax2 = ax1.twinx()\n", + "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", + "ax1.set(xlabel='X', ylabel='First scale')\n", + "ax2.set(ylabel='Other scale')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Axis Spines\n", + "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", + "ax.spines['top'].set_visible(False)\n", + "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", + "ax.spines['right'].set_visible(False)\n", + "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", + "\n", + "# \"outward\"\n", + "# Move the two remaining spines \"out\" away from the plot by 10 points\n", + "ax.spines['bottom'].set_position(('outward', 10))\n", + "ax.spines['left'].set_position(('outward', 10))\n", + "\n", + "# \"data\"\n", + "# Have the spines stay intersected at (0,0)\n", + "#ax.spines['bottom'].set_position(('data', 0))\n", + "#ax.spines['left'].set_position(('data', 0))\n", + "\n", + "# \"axes\"\n", + "# Have the two remaining spines placed at a fraction of the axes\n", + "#ax.spines['bottom'].set_position(('axes', 0.75))\n", + "#ax.spines['left'].set_position(('axes', 0.25))\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 4.2\n", + "\n", + "This one is a bit trickier. Once again, try to reproduce the figure below:\n", + "\n", + "\n", + "\n", + "\n", + "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the right and top sides.\n", + "\n", + "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/4.2-spines_ticks_and_subplot_spacing.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Try to reproduce the figure shown in images/exercise_4.2.png\n", + "# This one is a bit trickier!\n", + "\n", + "# Here's the data...\n", + "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", + "animals, friendliness, popularity = zip(*data)\n" + ] + } + ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -15,539 +558,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" - }, - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from __future__ import print_function\n", - "\n", - "# Import conventions we'll be using here. See Part 1\n", - "import matplotlib\n", - "matplotlib.use('nbagg')\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Limits, Legends, and Layouts\n", - "\n", - "In this section, we'll focus on what happens around the edges of the axes: Ticks, ticklabels, limits, layouts, and legends." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Limits and autoscaling\n", - "\n", - "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "###`ax.margins(...)`\n", - "\n", - "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", - "\n", - "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "ax1.margins(x=0.0, y=0.1) # 10% padding in the y-direction only\n", - "ax2.margins(0.05) # 5% padding in all directions\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `ax.axis(...)`\n", - "\n", - "The `ax.axis(...)` method is a convienent way of controlling the axes limits and enabling/disabling autoscaling.\n", - "\n", - "If you ever need to get all of the current plot limits, calling `ax.axis()` with no arguments will return the xmin/max/etc:\n", - "\n", - " xmin, xmax, ymin, ymax = ax.axis()\n", - " \n", - "If you'd like to manually set all of the x/y limits at once, you can use `ax.axis` for this, as well (note that we're calling it with a single argument that's a sequence, not 4 individual arguments):\n", - "\n", - " ax.axis([xmin, xmax, ymin, ymax])\n", - " \n", - "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", - "\n", - " * *tight*: Set axes limits to the exact range of the data\n", - " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", - " \n", - "And as an example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(nrows=3)\n", - "\n", - "for ax in axes:\n", - " ax.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "\n", - "axes[0].set_title('Normal Autoscaling', y=0.7, x=0.8)\n", - "\n", - "axes[1].set_title('ax.axis(\"tight\")', y=0.7, x=0.8)\n", - "axes[1].axis('tight')\n", - "\n", - "axes[2].set_title('ax.axis(\"equal\")', y=0.7, x=0.8)\n", - "axes[2].axis('equal')\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Manually setting only one limit\n", - "\n", - "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Good -- setting limits after plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Bad -- Setting limits before plotting is done\n", - "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=plt.figaspect(0.5))\n", - "ax1.set_ylim(bottom=-10)\n", - "ax2.set_xlim(right=25)\n", - "ax1.plot([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "ax2.scatter([-10, -5, 0, 5, 10, 15], [-1.2, 2, 3.5, -0.3, -4, 1])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Legends\n", - "\n", - "As you've seen in some of the examples so far, the X and Y axis can also be labeled, as well as the subplot itself via the title. \n", - "\n", - "However, another thing you can label is the line/point/bar/etc that you plot. You can provide a label to your plot, which allows your legend to automatically build itself. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Philadelphia')\n", - "ax.plot([1, 2, 3, 4], [30, 23, 13, 4], label='Boston')\n", - "ax.set(ylabel='Temperature (deg C)', xlabel='Time', title='A tale of two cities')\n", - "ax.legend()\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", - "\n", - " ax.legend(loc=\"best\")\n", - " \n", - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "ax.bar([1, 2, 3, 4], [10, 20, 25, 30], label=\"Foobar\", align='center', color='lightblue')\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], label=\"_nolegend_\", marker='o', color='darkred')\n", - "ax.legend(loc='best')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 4.1\n", - "\n", - "Once again, let's use a bit of what we've learned. Try to reproduce the following figure:\n", - "\n", - "\n", - "\n", - "Hint: You'll need to combine `ax.axis(...)` and `ax.margins(...)`. Here's the data and some code to get you started:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/4.1-legends_and_scaling.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": true, - "input": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "\n", - "t = np.linspace(0, 2 * np.pi, 150)\n", - "x1, y1 = np.cos(t), np.sin(t)\n", - "x2, y2 = 2 * x1, 2 * y1\n", - "\n", - "colors = ['darkred', 'darkgreen']\n", - "\n", - "# Try to plot the two circles, scale the axes as shown and add a legend\n", - "# Hint: it's easiest to combine `ax.axis(...)` and `ax.margins(...)` to scale the axes" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dealing with the boundaries: Layout, ticks, spines, etc\n", - "\n", - "One key thing we haven't talked about yet is all of the annotation on the outside of the axes, the borders of the axes, and how to adjust the amount of space around the axes. We won't go over every detail, but this next section should give you a reasonable working knowledge of how to configure what happens around the edges of your axes.\n", - "\n", - "## Ticks, Tick Lines, Tick Labels and Tickers\n", - "This is a constant source of confusion:\n", - "\n", - "* A Tick is the *location* of a Tick Label.\n", - "* A Tick Line is the line that denotes the location of the tick.\n", - "* A Tick Label is the text that is displayed at that tick.\n", - "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", - "\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([1, 2, 3, 4], [10, 20, 25, 30])\n", - "\n", - "# Manually set ticks and tick labels *on the x-axis* (note ax.xaxis.set, not ax.set!)\n", - "ax.xaxis.set(ticks=range(1, 5), ticklabels=[3, 100, -12, \"foo\"]) \n", - "\n", - "# Make the y-ticks a bit longer and go both in and out...\n", - "ax.tick_params(axis='y', direction='inout', length=10)\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", - " \n", - "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", - "\n", - "For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "data = [('apples', 2), ('oranges', 3), ('peaches', 1)]\n", - "fruit, value = zip(*data)\n", - "\n", - "fig, ax = plt.subplots()\n", - "x = np.arange(len(fruit))\n", - "ax.bar(x, value, align='center', color='gray')\n", - "ax.set(xticks=x, xticklabels=fruit)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Subplot Spacing\n", - "The spacing between the subplots can be adjusted using [`fig.subplots_adjust()`](http://matplotlib.org/api/pyplot_api.html?#matplotlib.pyplot.subplots_adjust). Play around with the example below to see how the different arguments affect the spacing." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, axes = plt.subplots(2, 2, figsize=(9, 9))\n", - "fig.subplots_adjust(wspace=0.5, hspace=0.3,\n", - " left=0.125, right=0.9,\n", - " top=0.9, bottom=0.1)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", - "\n", - "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", - "\n", - "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "def example_plot(ax):\n", - " ax.plot([1, 2])\n", - " ax.set_xlabel('x-label', fontsize=16)\n", - " ax.set_ylabel('y-label', fontsize=8)\n", - " ax.set_title('Title', fontsize=24)\n", - "\n", - "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)\n", - "example_plot(ax1)\n", - "example_plot(ax2)\n", - "example_plot(ax3)\n", - "example_plot(ax4)\n", - "\n", - "# Try enabling fig.tight_layout to compare...\n", - "#fig.tight_layout()\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## GridSpec\n", - "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sharing axes\n", - "There will be times when you want to have the x axis and/or the y axis of your subplots to be \"shared\". Sharing an axis means that the axis in one or more subplots will be tied together such that any change in one of the axis changes all of the other shared axes. This works very nicely with autoscaling arbitrary datasets that may have overlapping domains. Furthermore, when interacting with the plots (panning and zooming), all of the shared axes will pan and zoom automatically." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2.plot([3, 4, 5, 6], [6, 5, 4, 3])\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## \"Twinning\" axes\n", - "Sometimes one may want to overlay two plots on the same axes, but the scales may be entirely different. You can simply treat them as separate plots, but then twin them." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax1 = plt.subplots(1, 1)\n", - "ax1.plot([1, 2, 3, 4], [1, 2, 3, 4])\n", - "ax2 = ax1.twinx()\n", - "ax2.scatter([1, 2, 3, 4], [60, 50, 40, 30])\n", - "ax1.set(xlabel='X', ylabel='First scale')\n", - "ax2.set(ylabel='Other scale')\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Axis Spines\n", - "Spines are the axis lines for a plot. Each plot can have four spines: \"top\", \"bottom\", \"left\" and \"right\". By default, they are set so that they frame the plot, but they can be individually positioned and configured via the [`set_position()`](http://matplotlib.org/api/spines_api.html#matplotlib.spines.Spine.set_position) method of the spine. Here are some different configurations." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots()\n", - "ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])\n", - "ax.spines['top'].set_visible(False)\n", - "ax.xaxis.set_ticks_position('bottom') # no ticklines at the top\n", - "ax.spines['right'].set_visible(False)\n", - "ax.yaxis.set_ticks_position('left') # no ticklines on the right\n", - "\n", - "# \"outward\"\n", - "# Move the two remaining spines \"out\" away from the plot by 10 points\n", - "ax.spines['bottom'].set_position(('outward', 10))\n", - "ax.spines['left'].set_position(('outward', 10))\n", - "\n", - "# \"data\"\n", - "# Have the spines stay intersected at (0,0)\n", - "#ax.spines['bottom'].set_position(('data', 0))\n", - "#ax.spines['left'].set_position(('data', 0))\n", - "\n", - "# \"axes\"\n", - "# Have the two remaining spines placed at a fraction of the axes\n", - "#ax.spines['bottom'].set_position(('axes', 0.75))\n", - "#ax.spines['left'].set_position(('axes', 0.25))\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Exercise 4.2\n", - "\n", - "This one is a bit trickier. Once again, try to reproduce the figure below:\n", - "\n", - "\n", - "\n", - "\n", - "A few key hints: The two subplots have no vertical space between them (this means that the `hspace` is `0`). Note that the bottom spine is at 0 in data coordinates and the tick lines are missing from the right and top sides.\n", - "\n", - "Because you're going to be doing a lot of the same things to both subplots, to avoid repitive code you might consider writing a function that takes an `Axes` object and makes the spine changes, etc to it. \n", - "\n" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/4.2-spines_ticks_and_subplot_spacing.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "# Try to reproduce the figure shown in images/exercise_4.2.png\n", - "# This one is a bit trickier!\n", - "\n", - "# Here's the data...\n", - "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", - "animals, friendliness, popularity = zip(*data)\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part5-Artists.ipynb b/AnatomyOfMatplotlib-Part5-Artists.ipynb index 9b25d3e..2b6591f 100644 --- a/AnatomyOfMatplotlib-Part5-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part5-Artists.ipynb @@ -1,4 +1,301 @@ { + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function\n", + "# Turning on inline plots -- just for use in ipython notebooks.\n", + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Artists\n", + "Anything that can be displayed in a Figure is an [`Artist`](http://matplotlib.org/users/artists.html). There are two main classes of Artists: primatives and containers. Below is a sample of these primitives." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Show examples of matplotlib artists\n", + "http://matplotlib.org/api/artist_api.html\n", + "\n", + "Several examples of standard matplotlib graphics primitives (artists)\n", + "are drawn using matplotlib API. Full list of artists and the\n", + "documentation is available at\n", + "http://matplotlib.org/api/artist_api.html\n", + "\n", + "Copyright (c) 2010, Bartosz Telenczuk\n", + "\n", + "License: This work is licensed under the BSD. A copy should be\n", + "included with this source code, and is also available at\n", + "http://www.opensource.org/licenses/bsd-license.php\n", + "\"\"\"\n", + "\n", + "from matplotlib.collections import PatchCollection\n", + "import matplotlib.path as mpath\n", + "import matplotlib.patches as mpatches\n", + "import matplotlib.lines as mlines\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(7,7))\n", + "\n", + "# create 3x3 grid to plot the artists\n", + "pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1)\n", + "patches = []\n", + "\n", + "# add a circle\n", + "art = mpatches.Circle(pos[:, 0], 0.1, ec=\"none\")\n", + "patches.append(art)\n", + "plt.text(pos[0, 0], pos[1, 0] - 0.15, \"Circle\", ha=\"center\", size=14)\n", + "\n", + "# add a rectangle\n", + "art = mpatches.Rectangle(pos[:, 1] - [0.025, 0.05], 0.05, 0.1, ec=\"none\")\n", + "patches.append(art)\n", + "plt.text(pos[0, 1], pos[1, 1] - 0.15, \"Rectangle\", ha=\"center\", size=14)\n", + "\n", + "# add a wedge\n", + "wedge = mpatches.Wedge(pos[:, 2], 0.1, 30, 270, ec=\"none\")\n", + "patches.append(wedge)\n", + "plt.text(pos[0, 2], pos[1, 2] - 0.15, \"Wedge\", ha=\"center\", size=14)\n", + "\n", + "# add a Polygon\n", + "polygon = mpatches.RegularPolygon(pos[:, 3], 5, 0.1)\n", + "patches.append(polygon)\n", + "plt.text(pos[0, 3], pos[1, 3] - 0.15, \"Polygon\", ha=\"center\", size=14)\n", + "\n", + "#add an ellipse\n", + "ellipse = mpatches.Ellipse(pos[:, 4], 0.2, 0.1)\n", + "patches.append(ellipse)\n", + "plt.text(pos[0, 4], pos[1, 4] - 0.15, \"Ellipse\", ha=\"center\", size=14)\n", + "\n", + "#add an arrow\n", + "arrow = mpatches.Arrow(pos[0, 5] - 0.05, pos[1, 5] - 0.05, 0.1, 0.1, width=0.1)\n", + "patches.append(arrow)\n", + "plt.text(pos[0, 5], pos[1, 5] - 0.15, \"Arrow\", ha=\"center\", size=14)\n", + "\n", + "# add a path patch\n", + "Path = mpath.Path\n", + "verts = np.array([\n", + " (0.158, -0.257),\n", + " (0.035, -0.11),\n", + " (-0.175, 0.20),\n", + " (0.0375, 0.20),\n", + " (0.085, 0.115),\n", + " (0.22, 0.32),\n", + " (0.3, 0.005),\n", + " (0.20, -0.05),\n", + " (0.158, -0.257),\n", + " ])\n", + "verts = verts - verts.mean(0)\n", + "codes = [Path.MOVETO,\n", + " Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO,\n", + " Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY]\n", + "\n", + "path = mpath.Path(verts / 2.5 + pos[:, 6], codes)\n", + "patch = mpatches.PathPatch(path)\n", + "patches.append(patch)\n", + "plt.text(pos[0, 6], pos[1, 6] - 0.15, \"PathPatch\", ha=\"center\", size=14)\n", + "\n", + "# add a fancy box\n", + "fancybox = mpatches.FancyBboxPatch(\n", + " pos[:, 7] - [0.025, 0.05], 0.05, 0.1,\n", + " boxstyle=mpatches.BoxStyle(\"Round\", pad=0.02))\n", + "patches.append(fancybox)\n", + "plt.text(pos[0, 7], pos[1, 7] - 0.15, \"FancyBoxPatch\", ha=\"center\", size=14)\n", + "\n", + "# add a line\n", + "x,y = np.array([[-0.06, 0.0, 0.1], [0.05,-0.05, 0.05]])\n", + "line = mlines.Line2D(x+pos[0, 8], y+pos[1, 8], lw=5.)\n", + "plt.text(pos[0, 8], pos[1, 8] - 0.15, \"Line2D\", ha=\"center\", size=14)\n", + "\n", + "collection = PatchCollection(patches)\n", + "ax.add_collection(collection)\n", + "ax.add_line(line)\n", + "ax.set_axis_off()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Containers are objects like *Figure* and *Axes*. Containers are given primitives to draw. The plotting functions we discussed back in Parts 1 & 2 are convenience functions that generate these primitives and places them into the appropriate containers. In fact, most of those functions will return artist objects (or a list of artist objects) as well as store them into the appropriate axes container.\n", + "\n", + "As discussed in Part 3, there is a wide range of properties that can be defined for your plots. These properties are processed and passed down to the primitives, for your convenience. Ultimately, you can override anything you want just by directly setting a property to the object itself." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1, 1)\n", + "lines = plt.plot([1, 2, 3, 4], [1, 2, 3, 4], 'b', [1, 2, 3, 4], [4, 3, 2, 1], 'r')\n", + "lines[0].set(linewidth=5)\n", + "lines[1].set(linewidth=10, alpha=0.7)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To see what properties are set for an artist, use [`getp()`](http://matplotlib.org/api/artist_api.html#matplotlib.artist.getp)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "print(plt.getp(fig.patch))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Collections\n", + "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle) objects all with the same color, size, and edge width. Individual values for artists in the collection can also be set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.collections import LineCollection\n", + "fig, ax = plt.subplots(1, 1)\n", + "lc = LineCollection([[(4, 10), (16, 10)],\n", + " [(2, 2), (10, 15), (6, 7)],\n", + " [(14, 3), (1, 1), (3, 5)]])\n", + "lc.set_color('r')\n", + "lc.set_linewidth(5)\n", + "ax.add_collection(lc)\n", + "ax.set_xlim(0, 18)\n", + "ax.set_ylim(0, 18)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Now show how to set individual properties in a collection\n", + "fig, ax = plt.subplots(1, 1)\n", + "lc = LineCollection([[(4, 10), (16, 10)],\n", + " [(2, 2), (10, 15), (6, 7)],\n", + " [(14, 3), (1, 1), (3, 5)]])\n", + "lc.set_color(['r', 'blue', (0.2, 0.9, 0.3)])\n", + "lc.set_linewidth([4, 3, 6])\n", + "ax.add_collection(lc)\n", + "ax.set_xlim(0, 18)\n", + "ax.set_ylim(0, 18)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are other kinds of collections that are not just simply a list of primitives, but are Artists in their own right. These special kinds of collections take advantage of various optimizations that can be assumed when rendering similar or identical things. You actually do use these collections all the time whether you realize it or not. Markers are (indirectly) implemented this way (so, whenever you do `plot()` or `scatter()`, for example)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.collections import RegularPolyCollection\n", + "\n", + "fig, ax = plt.subplots(1, 1)\n", + "offsets = np.random.rand(20, 2)\n", + "collection = RegularPolyCollection(\n", + " numsides=5, # a pentagon\n", + " sizes=(150,),\n", + " offsets=offsets,\n", + " transOffset=ax.transData,\n", + " )\n", + "ax.add_collection(collection)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise 5.1\n", + "Give yourselves 4 gold stars!\n", + "\n", + "Hint: [StarPolygonCollection](http://matplotlib.org/api/collections_api.html#matplotlib.collections.StarPolygonCollection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load exercises/5.1-goldstar.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.collections import StarPolygonCollection\n", + "\n", + "fig, ax = plt.subplots(1, 1)\n", + "\n", + "collection = StarPolygonCollection(5,\n", + " offsets=[(0.5, 0.5)],\n", + " transOffset=ax.transData)\n", + "ax.add_collection(collection)\n", + "plt.show()" + ] + } + ], "metadata": { "kernelspec": { "display_name": "Python 2", @@ -15,303 +312,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" - }, - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ - { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n", - "# Turning on inline plots -- just for use in ipython notebooks.\n", - "import matplotlib\n", - "matplotlib.use('nbagg')\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Artists\n", - "Anything that can be displayed in a Figure is an [`Artist`](http://matplotlib.org/users/artists.html). There are two main classes of Artists: primatives and containers. Below is a sample of these primitives." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "\"\"\"\n", - "Show examples of matplotlib artists\n", - "http://matplotlib.org/api/artist_api.html\n", - "\n", - "Several examples of standard matplotlib graphics primitives (artists)\n", - "are drawn using matplotlib API. Full list of artists and the\n", - "documentation is available at\n", - "http://matplotlib.org/api/artist_api.html\n", - "\n", - "Copyright (c) 2010, Bartosz Telenczuk\n", - "\n", - "License: This work is licensed under the BSD. A copy should be\n", - "included with this source code, and is also available at\n", - "http://www.opensource.org/licenses/bsd-license.php\n", - "\"\"\"\n", - "\n", - "from matplotlib.collections import PatchCollection\n", - "import matplotlib.path as mpath\n", - "import matplotlib.patches as mpatches\n", - "import matplotlib.lines as mlines\n", - "\n", - "fig, ax = plt.subplots(1, 1, figsize=(7,7))\n", - "\n", - "# create 3x3 grid to plot the artists\n", - "pos = np.mgrid[0.2:0.8:3j, 0.2:0.8:3j].reshape(2, -1)\n", - "patches = []\n", - "\n", - "# add a circle\n", - "art = mpatches.Circle(pos[:, 0], 0.1, ec=\"none\")\n", - "patches.append(art)\n", - "plt.text(pos[0, 0], pos[1, 0] - 0.15, \"Circle\", ha=\"center\", size=14)\n", - "\n", - "# add a rectangle\n", - "art = mpatches.Rectangle(pos[:, 1] - [0.025, 0.05], 0.05, 0.1, ec=\"none\")\n", - "patches.append(art)\n", - "plt.text(pos[0, 1], pos[1, 1] - 0.15, \"Rectangle\", ha=\"center\", size=14)\n", - "\n", - "# add a wedge\n", - "wedge = mpatches.Wedge(pos[:, 2], 0.1, 30, 270, ec=\"none\")\n", - "patches.append(wedge)\n", - "plt.text(pos[0, 2], pos[1, 2] - 0.15, \"Wedge\", ha=\"center\", size=14)\n", - "\n", - "# add a Polygon\n", - "polygon = mpatches.RegularPolygon(pos[:, 3], 5, 0.1)\n", - "patches.append(polygon)\n", - "plt.text(pos[0, 3], pos[1, 3] - 0.15, \"Polygon\", ha=\"center\", size=14)\n", - "\n", - "#add an ellipse\n", - "ellipse = mpatches.Ellipse(pos[:, 4], 0.2, 0.1)\n", - "patches.append(ellipse)\n", - "plt.text(pos[0, 4], pos[1, 4] - 0.15, \"Ellipse\", ha=\"center\", size=14)\n", - "\n", - "#add an arrow\n", - "arrow = mpatches.Arrow(pos[0, 5] - 0.05, pos[1, 5] - 0.05, 0.1, 0.1, width=0.1)\n", - "patches.append(arrow)\n", - "plt.text(pos[0, 5], pos[1, 5] - 0.15, \"Arrow\", ha=\"center\", size=14)\n", - "\n", - "# add a path patch\n", - "Path = mpath.Path\n", - "verts = np.array([\n", - " (0.158, -0.257),\n", - " (0.035, -0.11),\n", - " (-0.175, 0.20),\n", - " (0.0375, 0.20),\n", - " (0.085, 0.115),\n", - " (0.22, 0.32),\n", - " (0.3, 0.005),\n", - " (0.20, -0.05),\n", - " (0.158, -0.257),\n", - " ])\n", - "verts = verts - verts.mean(0)\n", - "codes = [Path.MOVETO,\n", - " Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO,\n", - " Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY]\n", - "\n", - "path = mpath.Path(verts / 2.5 + pos[:, 6], codes)\n", - "patch = mpatches.PathPatch(path)\n", - "patches.append(patch)\n", - "plt.text(pos[0, 6], pos[1, 6] - 0.15, \"PathPatch\", ha=\"center\", size=14)\n", - "\n", - "# add a fancy box\n", - "fancybox = mpatches.FancyBboxPatch(\n", - " pos[:, 7] - [0.025, 0.05], 0.05, 0.1,\n", - " boxstyle=mpatches.BoxStyle(\"Round\", pad=0.02))\n", - "patches.append(fancybox)\n", - "plt.text(pos[0, 7], pos[1, 7] - 0.15, \"FancyBoxPatch\", ha=\"center\", size=14)\n", - "\n", - "# add a line\n", - "x,y = np.array([[-0.06, 0.0, 0.1], [0.05,-0.05, 0.05]])\n", - "line = mlines.Line2D(x+pos[0, 8], y+pos[1, 8], lw=5.)\n", - "plt.text(pos[0, 8], pos[1, 8] - 0.15, \"Line2D\", ha=\"center\", size=14)\n", - "\n", - "collection = PatchCollection(patches)\n", - "ax.add_collection(collection)\n", - "ax.add_line(line)\n", - "ax.set_axis_off()\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Containers are objects like *Figure* and *Axes*. Containers are given primitives to draw. The plotting functions we discussed back in Parts 1 & 2 are convenience functions that generate these primitives and places them into the appropriate containers. In fact, most of those functions will return artist objects (or a list of artist objects) as well as store them into the appropriate axes container.\n", - "\n", - "As discussed in Part 3, there is a wide range of properties that can be defined for your plots. These properties are processed and passed down to the primitives, for your convenience. Ultimately, you can override anything you want just by directly setting a property to the object itself." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig, ax = plt.subplots(1, 1)\n", - "lines = plt.plot([1, 2, 3, 4], [1, 2, 3, 4], 'b', [1, 2, 3, 4], [4, 3, 2, 1], 'r')\n", - "lines[0].set(linewidth=5)\n", - "lines[1].set(linewidth=10, alpha=0.7)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see what properties are set for an artist, use [`getp()`](http://matplotlib.org/api/artist_api.html#matplotlib.artist.getp)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fig = plt.figure()\n", - "print(plt.getp(fig.patch))" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Collections\n", - "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle) objects all with the same color, size, and edge width. Individual values for artists in the collection can also be set." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from matplotlib.collections import LineCollection\n", - "fig, ax = plt.subplots(1, 1)\n", - "lc = LineCollection([[(4, 10), (16, 10)],\n", - " [(2, 2), (10, 15), (6, 7)],\n", - " [(14, 3), (1, 1), (3, 5)]])\n", - "lc.set_color('r')\n", - "lc.set_linewidth(5)\n", - "ax.add_collection(lc)\n", - "ax.set_xlim(0, 18)\n", - "ax.set_ylim(0, 18)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Now show how to set individual properties in a collection\n", - "fig, ax = plt.subplots(1, 1)\n", - "lc = LineCollection([[(4, 10), (16, 10)],\n", - " [(2, 2), (10, 15), (6, 7)],\n", - " [(14, 3), (1, 1), (3, 5)]])\n", - "lc.set_color(['r', 'blue', (0.2, 0.9, 0.3)])\n", - "lc.set_linewidth([4, 3, 6])\n", - "ax.add_collection(lc)\n", - "ax.set_xlim(0, 18)\n", - "ax.set_ylim(0, 18)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are other kinds of collections that are not just simply a list of primitives, but are Artists in their own right. These special kinds of collections take advantage of various optimizations that can be assumed when rendering similar or identical things. You actually do use these collections all the time whether you realize it or not. Markers are (indirectly) implemented this way (so, whenever you do `plot()` or `scatter()`, for example)." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from matplotlib.collections import RegularPolyCollection\n", - "\n", - "fig, ax = plt.subplots(1, 1)\n", - "offsets = np.random.rand(20, 2)\n", - "collection = RegularPolyCollection(\n", - " numsides=5, # a pentagon\n", - " sizes=(150,),\n", - " offsets=offsets,\n", - " transOffset=ax.transData,\n", - " )\n", - "ax.add_collection(collection)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 5.1\n", - "Give yourselves 4 gold stars!\n", - "\n", - "Hint: [StarPolygonCollection](http://matplotlib.org/api/collections_api.html#matplotlib.collections.StarPolygonCollection)" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load exercises/5.1-goldstar.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from matplotlib.collections import StarPolygonCollection\n", - "\n", - "fig, ax = plt.subplots(1, 1)\n", - "\n", - "collection = StarPolygonCollection(5,\n", - " offsets=[(0.5, 0.5)],\n", - " transOffset=ax.transData)\n", - "ax.add_collection(collection)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb index 8ebaede..36fc680 100644 --- a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb +++ b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb @@ -1,368 +1,387 @@ { - "metadata": { - "name": "" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib\n", + "matplotlib.use('nbagg')\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# mpl_toolkits" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the core library of matplotlib, there are a few additional utilities that are set apart from matplotlib proper for some reason or another, but are often shipped with matplotlib.\n", + "\n", + "* [Basemap](http://matplotlib.org/basemap/) - shipped separately from matplotlib due to size of mapping data that are included.\n", + "* [mplot3d](http://matplotlib.org/mpl_toolkits/mplot3d/index.html#toolkit-mplot3d-index) - shipped with matplotlib to provide very simple, rudimentary 3D plots in the same style as matplotlib's 2D plots.\n", + "* [axes_grid1](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html) - An enhanced SubplotAxes. Very Enhanced..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# mplot3d\n", + "By taking advantage of matplotlib's z-order layering engine, mplot3d emulates 3D plotting by projecting 3D data into 2D space, layer by layer. While it isn't going to replace any of the true 3D plotting libraries anytime soon, its goal is to allow for matplotlib users to produce 3D plots with the same amount of simplicity as 2D plots are." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from mpl_toolkits.mplot3d import Axes3D, axes3d\n", + "\n", + "fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})\n", + "X, Y, Z = axes3d.get_test_data(0.05)\n", + "ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# axes_grid1\n", + "This module was originally intended as a collection of helper classes to ease the displaying of (possibly multiple) images with matplotlib. Some of the functionality has come to be useful for non-image plotting as well. Some classes deals with the sizing and positioning of multiple Axes relative to each other ([`ImageGrid`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#imagegrid), [`RGB Axes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#rgb-axes), and [`AxesDivider`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#axesdivider)). The [`ParasiteAxes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#parasiteaxes) allow for the plotting of multiple datasets in the same axes, but with each their own x or y scale. Also, there is the [`AnchoredArtist`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#anchoredartists) that can be used to anchor particular artist objects in place.\n", + "\n", + "One can get a sense of the neat things that can be done with this toolkit by browsing through its user guide linked above. There is one particular feature that is an absolute must-have for me -- automatic allocation of space for colorbars." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from mpl_toolkits.axes_grid1 import AxesGrid\n", + "fig = plt.figure()\n", + "grid = AxesGrid(fig, 111, # similar to subplot(111)\n", + " nrows_ncols = (2, 2),\n", + " axes_pad = 0.2,\n", + " share_all=True,\n", + " label_mode = \"L\", # similar to \"label_outer\"\n", + " cbar_location = \"right\",\n", + " cbar_mode=\"single\",\n", + " )\n", + "\n", + "extent = (-3,4,-4,3)\n", + "for i in range(4):\n", + " im = grid[i].imshow(Z, extent=extent, interpolation=\"nearest\")\n", + " \n", + "grid.cbar_axes[0].colorbar(im)\n", + "plt.show()" + ] + }, { - "cells": [ - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import matplotlib\n", - "matplotlib.use('nbagg')\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# mpl_toolkits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In addition to the core library of matplotlib, there are a few additional utilities that are set apart from matplotlib proper for some reason or another, but are often shipped with matplotlib.\n", - "\n", - "* [Basemap](http://matplotlib.org/basemap/) - shipped separately from matplotlib due to size of mapping data that are included.\n", - "* [mplot3d](http://matplotlib.org/mpl_toolkits/mplot3d/index.html#toolkit-mplot3d-index) - shipped with matplotlib to provide very simple, rudimentary 3D plots in the same style as matplotlib's 2D plots.\n", - "* [axes_grid1](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html) - An enhanced SubplotAxes. Very Enhanced..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# mplot3d\n", - "By taking advantage of matplotlib's z-order layering engine, mplot3d emulates 3D plotting by projecting 3D data into 2D space, layer by layer. While it isn't going to replace any of the true 3D plotting libraries anytime soon, its goal is to allow for matplotlib users to produce 3D plots with the same amount of simplicity as 2D plots are." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from mpl_toolkits.mplot3d import Axes3D, axes3d\n", - "\n", - "fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})\n", - "X, Y, Z = axes3d.get_test_data(0.05)\n", - "ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)\n", - "\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# axes_grid1\n", - "This module was originally intended as a collection of helper classes to ease the displaying of (possibly multiple) images with matplotlib. Some of the functionality has come to be useful for non-image plotting as well. Some classes deals with the sizing and positioning of multiple Axes relative to each other ([`ImageGrid`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#imagegrid), [`RGB Axes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#rgb-axes), and [`AxesDivider`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#axesdivider)). The [`ParasiteAxes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#parasiteaxes) allow for the plotting of multiple datasets in the same axes, but with each their own x or y scale. Also, there is the [`AnchoredArtist`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#anchoredartists) that can be used to anchor particular artist objects in place.\n", - "\n", - "One can get a sense of the neat things that can be done with this toolkit by browsing through its user guide linked above. There is one particular feature that is an absolute must-have for me -- automatic allocation of space for colorbars." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from mpl_toolkits.axes_grid1 import AxesGrid\n", - "fig = plt.figure()\n", - "grid = AxesGrid(fig, 111, # similar to subplot(111)\n", - " nrows_ncols = (2, 2),\n", - " axes_pad = 0.2,\n", - " share_all=True,\n", - " label_mode = \"L\", # similar to \"label_outer\"\n", - " cbar_location = \"right\",\n", - " cbar_mode=\"single\",\n", - " )\n", - "\n", - "extent = (-3,4,-4,3)\n", - "for i in range(4):\n", - " im = grid[i].imshow(Z, extent=extent, interpolation=\"nearest\")\n", - " \n", - "grid.cbar_axes[0].colorbar(im)\n", - "plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This next feature is commonly requested on the mailing lists. The problem is that most people who request it don't quite know how to describe it. We call it \"Parasite Axes\"." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load http://matplotlib.org/mpl_examples/axes_grid/demo_parasite_axes2.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from mpl_toolkits.axes_grid1 import host_subplot\n", - "import mpl_toolkits.axisartist as AA\n", - "import matplotlib.pyplot as plt\n", - "\n", - "if 1:\n", - "\n", - " host = host_subplot(111, axes_class=AA.Axes)\n", - " plt.subplots_adjust(right=0.75)\n", - "\n", - " par1 = host.twinx()\n", - " par2 = host.twinx()\n", - "\n", - " offset = 60\n", - " new_fixed_axis = par2.get_grid_helper().new_fixed_axis\n", - " par2.axis[\"right\"] = new_fixed_axis(loc=\"right\",\n", - " axes=par2,\n", - " offset=(offset, 0))\n", - " \n", - " par2.axis[\"right\"].toggle(all=True)\n", - "\n", - "\n", - "\n", - " host.set_xlim(0, 2)\n", - " host.set_ylim(0, 2)\n", - "\n", - " host.set_xlabel(\"Distance\")\n", - " host.set_ylabel(\"Density\")\n", - " par1.set_ylabel(\"Temperature\")\n", - " par2.set_ylabel(\"Velocity\")\n", - "\n", - " p1, = host.plot([0, 1, 2], [0, 1, 2], label=\"Density\")\n", - " p2, = par1.plot([0, 1, 2], [0, 3, 2], label=\"Temperature\")\n", - " p3, = par2.plot([0, 1, 2], [50, 30, 15], label=\"Velocity\")\n", - "\n", - " par1.set_ylim(0, 4)\n", - " par2.set_ylim(1, 65)\n", - "\n", - " host.legend()\n", - "\n", - " host.axis[\"left\"].label.set_color(p1.get_color())\n", - " par1.axis[\"right\"].label.set_color(p2.get_color())\n", - " par2.axis[\"right\"].label.set_color(p3.get_color())\n", - "\n", - " plt.draw()\n", - " plt.show()\n", - "\n", - " #plt.savefig(\"Test\")\n" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And finally, as a nice teaser of what else axes_grid1 can do..." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "%load http://matplotlib.org/mpl_toolkits/axes_grid/examples/demo_floating_axes.py" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "from matplotlib.transforms import Affine2D\n", - "\n", - "import mpl_toolkits.axisartist.floating_axes as floating_axes\n", - "\n", - "import numpy as np\n", - "import mpl_toolkits.axisartist.angle_helper as angle_helper\n", - "from matplotlib.projections import PolarAxes\n", - "from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \\\n", - " DictFormatter\n", - "\n", - "def setup_axes1(fig, rect):\n", - " \"\"\"\n", - " A simple one.\n", - " \"\"\"\n", - " tr = Affine2D().scale(2, 1).rotate_deg(30)\n", - "\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4))\n", - "\n", - " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", - " fig.add_subplot(ax1)\n", - "\n", - " aux_ax = ax1.get_aux_axes(tr)\n", - "\n", - " grid_helper.grid_finder.grid_locator1._nbins = 4\n", - " grid_helper.grid_finder.grid_locator2._nbins = 4\n", - "\n", - " return ax1, aux_ax\n", - "\n", - "\n", - "def setup_axes2(fig, rect):\n", - " \"\"\"\n", - " With custom locator and formatter.\n", - " Note that the extreme values are swapped.\n", - " \"\"\"\n", - "\n", - " #tr_scale = Affine2D().scale(np.pi/180., 1.)\n", - "\n", - " tr = PolarAxes.PolarTransform()\n", - "\n", - " pi = np.pi\n", - " angle_ticks = [(0, r\"$0$\"),\n", - " (.25*pi, r\"$\\frac{1}{4}\\pi$\"),\n", - " (.5*pi, r\"$\\frac{1}{2}\\pi$\")]\n", - " grid_locator1 = FixedLocator([v for v, s in angle_ticks])\n", - " tick_formatter1 = DictFormatter(dict(angle_ticks))\n", - "\n", - " grid_locator2 = MaxNLocator(2)\n", - "\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", - " extremes=(.5*pi, 0, 2, 1),\n", - " grid_locator1=grid_locator1,\n", - " grid_locator2=grid_locator2,\n", - " tick_formatter1=tick_formatter1,\n", - " tick_formatter2=None,\n", - " )\n", - "\n", - " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", - " fig.add_subplot(ax1)\n", - "\n", - " # create a parasite axes whose transData in RA, cz\n", - " aux_ax = ax1.get_aux_axes(tr)\n", - "\n", - " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", - " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", - " # drawn twice, and possibly over some other\n", - " # artists. So, we decrease the zorder a bit to\n", - " # prevent this.\n", - "\n", - " return ax1, aux_ax\n", - "\n", - "\n", - "def setup_axes3(fig, rect):\n", - " \"\"\"\n", - " Sometimes, things like axis_direction need to be adjusted.\n", - " \"\"\"\n", - "\n", - " # rotate a bit for better orientation\n", - " tr_rotate = Affine2D().translate(-95, 0)\n", - "\n", - " # scale degree to radians\n", - " tr_scale = Affine2D().scale(np.pi/180., 1.)\n", - "\n", - " tr = tr_rotate + tr_scale + PolarAxes.PolarTransform()\n", - "\n", - " grid_locator1 = angle_helper.LocatorHMS(4)\n", - " tick_formatter1 = angle_helper.FormatterHMS()\n", - "\n", - " grid_locator2 = MaxNLocator(3)\n", - "\n", - " ra0, ra1 = 8.*15, 14.*15\n", - " cz0, cz1 = 0, 14000\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", - " extremes=(ra0, ra1, cz0, cz1),\n", - " grid_locator1=grid_locator1,\n", - " grid_locator2=grid_locator2,\n", - " tick_formatter1=tick_formatter1,\n", - " tick_formatter2=None,\n", - " )\n", - "\n", - " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", - " fig.add_subplot(ax1)\n", - "\n", - " # adjust axis\n", - " ax1.axis[\"left\"].set_axis_direction(\"bottom\")\n", - " ax1.axis[\"right\"].set_axis_direction(\"top\")\n", - "\n", - " ax1.axis[\"bottom\"].set_visible(False)\n", - " ax1.axis[\"top\"].set_axis_direction(\"bottom\")\n", - " ax1.axis[\"top\"].toggle(ticklabels=True, label=True)\n", - " ax1.axis[\"top\"].major_ticklabels.set_axis_direction(\"top\")\n", - " ax1.axis[\"top\"].label.set_axis_direction(\"top\")\n", - "\n", - " ax1.axis[\"left\"].label.set_text(r\"cz [km$^{-1}$]\")\n", - " ax1.axis[\"top\"].label.set_text(r\"$\\alpha_{1950}$\")\n", - "\n", - "\n", - " # create a parasite axes whose transData in RA, cz\n", - " aux_ax = ax1.get_aux_axes(tr)\n", - "\n", - " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", - " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", - " # drawn twice, and possibly over some other\n", - " # artists. So, we decrease the zorder a bit to\n", - " # prevent this.\n", - "\n", - " return ax1, aux_ax\n", - "\n", - "\n", - "\n", - "if 1:\n", - " import matplotlib.pyplot as plt\n", - " fig = plt.figure(1, figsize=(8, 4))\n", - " fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95)\n", - "\n", - " ax1, aux_ax2 = setup_axes1(fig, 131)\n", - " aux_ax2.bar([0, 1, 2, 3], [3, 2, 1, 3])\n", - " \n", - " #theta = np.random.rand(10) #*.5*np.pi\n", - " #radius = np.random.rand(10) #+1.\n", - " #aux_ax1.scatter(theta, radius)\n", - "\n", - "\n", - " ax2, aux_ax2 = setup_axes2(fig, 132)\n", - "\n", - " theta = np.random.rand(10)*.5*np.pi\n", - " radius = np.random.rand(10)+1.\n", - " aux_ax2.scatter(theta, radius)\n", - "\n", - "\n", - " ax3, aux_ax3 = setup_axes3(fig, 133)\n", - "\n", - " theta = (8 + np.random.rand(10)*(14-8))*15. # in degrees\n", - " radius = np.random.rand(10)*14000.\n", - " aux_ax3.scatter(theta, radius)\n", - "\n", - " plt.show()" - ], - "language": "python", - "metadata": {}, - "outputs": [] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] - } - ], - "metadata": {} + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This next feature is commonly requested on the mailing lists. The problem is that most people who request it don't quite know how to describe it. We call it \"Parasite Axes\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load http://matplotlib.org/mpl_examples/axes_grid/demo_parasite_axes2.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from mpl_toolkits.axes_grid1 import host_subplot\n", + "import mpl_toolkits.axisartist as AA\n", + "import matplotlib.pyplot as plt\n", + "\n", + "if 1:\n", + "\n", + " host = host_subplot(111, axes_class=AA.Axes)\n", + " plt.subplots_adjust(right=0.75)\n", + "\n", + " par1 = host.twinx()\n", + " par2 = host.twinx()\n", + "\n", + " offset = 60\n", + " new_fixed_axis = par2.get_grid_helper().new_fixed_axis\n", + " par2.axis[\"right\"] = new_fixed_axis(loc=\"right\",\n", + " axes=par2,\n", + " offset=(offset, 0))\n", + " \n", + " par2.axis[\"right\"].toggle(all=True)\n", + "\n", + "\n", + "\n", + " host.set_xlim(0, 2)\n", + " host.set_ylim(0, 2)\n", + "\n", + " host.set_xlabel(\"Distance\")\n", + " host.set_ylabel(\"Density\")\n", + " par1.set_ylabel(\"Temperature\")\n", + " par2.set_ylabel(\"Velocity\")\n", + "\n", + " p1, = host.plot([0, 1, 2], [0, 1, 2], label=\"Density\")\n", + " p2, = par1.plot([0, 1, 2], [0, 3, 2], label=\"Temperature\")\n", + " p3, = par2.plot([0, 1, 2], [50, 30, 15], label=\"Velocity\")\n", + "\n", + " par1.set_ylim(0, 4)\n", + " par2.set_ylim(1, 65)\n", + "\n", + " host.legend()\n", + "\n", + " host.axis[\"left\"].label.set_color(p1.get_color())\n", + " par1.axis[\"right\"].label.set_color(p2.get_color())\n", + " par2.axis[\"right\"].label.set_color(p3.get_color())\n", + "\n", + " plt.draw()\n", + " plt.show()\n", + "\n", + " #plt.savefig(\"Test\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And finally, as a nice teaser of what else axes_grid1 can do..." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%load http://matplotlib.org/mpl_toolkits/axes_grid/examples/demo_floating_axes.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from matplotlib.transforms import Affine2D\n", + "\n", + "import mpl_toolkits.axisartist.floating_axes as floating_axes\n", + "\n", + "import numpy as np\n", + "import mpl_toolkits.axisartist.angle_helper as angle_helper\n", + "from matplotlib.projections import PolarAxes\n", + "from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \\\n", + " DictFormatter\n", + "\n", + "def setup_axes1(fig, rect):\n", + " \"\"\"\n", + " A simple one.\n", + " \"\"\"\n", + " tr = Affine2D().scale(2, 1).rotate_deg(30)\n", + "\n", + " grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4))\n", + "\n", + " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", + " fig.add_subplot(ax1)\n", + "\n", + " aux_ax = ax1.get_aux_axes(tr)\n", + "\n", + " grid_helper.grid_finder.grid_locator1._nbins = 4\n", + " grid_helper.grid_finder.grid_locator2._nbins = 4\n", + "\n", + " return ax1, aux_ax\n", + "\n", + "\n", + "def setup_axes2(fig, rect):\n", + " \"\"\"\n", + " With custom locator and formatter.\n", + " Note that the extreme values are swapped.\n", + " \"\"\"\n", + "\n", + " #tr_scale = Affine2D().scale(np.pi/180., 1.)\n", + "\n", + " tr = PolarAxes.PolarTransform()\n", + "\n", + " pi = np.pi\n", + " angle_ticks = [(0, r\"$0$\"),\n", + " (.25*pi, r\"$\\frac{1}{4}\\pi$\"),\n", + " (.5*pi, r\"$\\frac{1}{2}\\pi$\")]\n", + " grid_locator1 = FixedLocator([v for v, s in angle_ticks])\n", + " tick_formatter1 = DictFormatter(dict(angle_ticks))\n", + "\n", + " grid_locator2 = MaxNLocator(2)\n", + "\n", + " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", + " extremes=(.5*pi, 0, 2, 1),\n", + " grid_locator1=grid_locator1,\n", + " grid_locator2=grid_locator2,\n", + " tick_formatter1=tick_formatter1,\n", + " tick_formatter2=None,\n", + " )\n", + "\n", + " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", + " fig.add_subplot(ax1)\n", + "\n", + " # create a parasite axes whose transData in RA, cz\n", + " aux_ax = ax1.get_aux_axes(tr)\n", + "\n", + " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", + " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", + " # drawn twice, and possibly over some other\n", + " # artists. So, we decrease the zorder a bit to\n", + " # prevent this.\n", + "\n", + " return ax1, aux_ax\n", + "\n", + "\n", + "def setup_axes3(fig, rect):\n", + " \"\"\"\n", + " Sometimes, things like axis_direction need to be adjusted.\n", + " \"\"\"\n", + "\n", + " # rotate a bit for better orientation\n", + " tr_rotate = Affine2D().translate(-95, 0)\n", + "\n", + " # scale degree to radians\n", + " tr_scale = Affine2D().scale(np.pi/180., 1.)\n", + "\n", + " tr = tr_rotate + tr_scale + PolarAxes.PolarTransform()\n", + "\n", + " grid_locator1 = angle_helper.LocatorHMS(4)\n", + " tick_formatter1 = angle_helper.FormatterHMS()\n", + "\n", + " grid_locator2 = MaxNLocator(3)\n", + "\n", + " ra0, ra1 = 8.*15, 14.*15\n", + " cz0, cz1 = 0, 14000\n", + " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", + " extremes=(ra0, ra1, cz0, cz1),\n", + " grid_locator1=grid_locator1,\n", + " grid_locator2=grid_locator2,\n", + " tick_formatter1=tick_formatter1,\n", + " tick_formatter2=None,\n", + " )\n", + "\n", + " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", + " fig.add_subplot(ax1)\n", + "\n", + " # adjust axis\n", + " ax1.axis[\"left\"].set_axis_direction(\"bottom\")\n", + " ax1.axis[\"right\"].set_axis_direction(\"top\")\n", + "\n", + " ax1.axis[\"bottom\"].set_visible(False)\n", + " ax1.axis[\"top\"].set_axis_direction(\"bottom\")\n", + " ax1.axis[\"top\"].toggle(ticklabels=True, label=True)\n", + " ax1.axis[\"top\"].major_ticklabels.set_axis_direction(\"top\")\n", + " ax1.axis[\"top\"].label.set_axis_direction(\"top\")\n", + "\n", + " ax1.axis[\"left\"].label.set_text(r\"cz [km$^{-1}$]\")\n", + " ax1.axis[\"top\"].label.set_text(r\"$\\alpha_{1950}$\")\n", + "\n", + "\n", + " # create a parasite axes whose transData in RA, cz\n", + " aux_ax = ax1.get_aux_axes(tr)\n", + "\n", + " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", + " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", + " # drawn twice, and possibly over some other\n", + " # artists. So, we decrease the zorder a bit to\n", + " # prevent this.\n", + "\n", + " return ax1, aux_ax\n", + "\n", + "\n", + "\n", + "if 1:\n", + " import matplotlib.pyplot as plt\n", + " fig = plt.figure(1, figsize=(8, 4))\n", + " fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95)\n", + "\n", + " ax1, aux_ax2 = setup_axes1(fig, 131)\n", + " aux_ax2.bar([0, 1, 2, 3], [3, 2, 1, 3])\n", + " \n", + " #theta = np.random.rand(10) #*.5*np.pi\n", + " #radius = np.random.rand(10) #+1.\n", + " #aux_ax1.scatter(theta, radius)\n", + "\n", + "\n", + " ax2, aux_ax2 = setup_axes2(fig, 132)\n", + "\n", + " theta = np.random.rand(10)*.5*np.pi\n", + " radius = np.random.rand(10)+1.\n", + " aux_ax2.scatter(theta, radius)\n", + "\n", + "\n", + " ax3, aux_ax3 = setup_axes3(fig, 133)\n", + "\n", + " theta = (8 + np.random.rand(10)*(14-8))*15. # in degrees\n", + " radius = np.random.rand(10)*14000.\n", + " aux_ax3.scatter(theta, radius)\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" } - ] + }, + "nbformat": 4, + "nbformat_minor": 0 } From fb4a3a392f8faacd1c201ca26eaac38e047d0aaa Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sun, 9 Jul 2017 23:41:34 -0400 Subject: [PATCH 26/61] Use classic mode for several of the exercises --- exercises/1.1-subplots_and_basic_plotting.py | 2 ++ exercises/2.2-vmin_vmax_imshow_and_colorbars.py | 2 ++ exercises/4.1-legends_and_scaling.py | 2 ++ solutions/1.1-subplots_and_basic_plotting.py | 2 ++ solutions/2.2-vmin_vmax_imshow_and_colorbars.py | 2 ++ solutions/4.1-legends_and_scaling.py | 2 ++ solutions/5.1-goldstar.py | 5 +++-- 7 files changed, 15 insertions(+), 2 deletions(-) diff --git a/exercises/1.1-subplots_and_basic_plotting.py b/exercises/1.1-subplots_and_basic_plotting.py index 1ff79ca..1e4df45 100644 --- a/exercises/1.1-subplots_and_basic_plotting.py +++ b/exercises/1.1-subplots_and_basic_plotting.py @@ -1,6 +1,8 @@ import numpy as np import matplotlib.pyplot as plt +plt.style.use('classic') + # Try to reproduce the figure shown in images/exercise_1-1.png # Our data... diff --git a/exercises/2.2-vmin_vmax_imshow_and_colorbars.py b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py index 4922fb3..0b504f2 100644 --- a/exercises/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py @@ -2,6 +2,8 @@ import matplotlib.pyplot as plt np.random.seed(1) +plt.style.use('classic') + # Generate random data with different ranges... data1 = np.random.random((10, 10)) data2 = 2 * np.random.random((10, 10)) diff --git a/exercises/4.1-legends_and_scaling.py b/exercises/4.1-legends_and_scaling.py index a413272..3f96e87 100644 --- a/exercises/4.1-legends_and_scaling.py +++ b/exercises/4.1-legends_and_scaling.py @@ -1,6 +1,8 @@ import numpy as np import matplotlib.pyplot as plt +plt.style.use('classic') + # Try to reproduce the figure shown in images/exercise_4-1.png # Here's the data and colors used. diff --git a/solutions/1.1-subplots_and_basic_plotting.py b/solutions/1.1-subplots_and_basic_plotting.py index 4a641d6..cd23241 100644 --- a/solutions/1.1-subplots_and_basic_plotting.py +++ b/solutions/1.1-subplots_and_basic_plotting.py @@ -1,6 +1,8 @@ import numpy as np import matplotlib.pyplot as plt +plt.style.use('classic') + x = np.linspace(0, 10, 100) y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2) names = ['Signal 1', 'Signal 2', 'Signal 3'] diff --git a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py index 0629513..da67e7b 100644 --- a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py @@ -2,6 +2,8 @@ import matplotlib.pyplot as plt np.random.seed(1) +plt.style.use('classic') + # Generate random data with different ranges... data1 = np.random.random((10, 10)) data2 = 2 * np.random.random((10, 10)) diff --git a/solutions/4.1-legends_and_scaling.py b/solutions/4.1-legends_and_scaling.py index 2dda763..10e53b3 100644 --- a/solutions/4.1-legends_and_scaling.py +++ b/solutions/4.1-legends_and_scaling.py @@ -1,6 +1,8 @@ import numpy as np import matplotlib.pyplot as plt +plt.style.use('classic') + t = np.linspace(0, 2 * np.pi, 150) x1, y1 = np.cos(t), np.sin(t) x2, y2 = 2 * x1, 2 * y1 diff --git a/solutions/5.1-goldstar.py b/solutions/5.1-goldstar.py index 4057d05..321a4f0 100644 --- a/solutions/5.1-goldstar.py +++ b/solutions/5.1-goldstar.py @@ -4,10 +4,11 @@ fig, ax = plt.subplots(1, 1) offsets = zip([0.2, 0.4, 0.6, 0.8], [0.5] * 4) -collection = StarPolygonCollection(5, +collection = StarPolygonCollection(4, offsets=offsets, transOffset=ax.transData, facecolors=['gold'], - sizes=[75]) + sizes=[175], + edgecolors=['k']) ax.add_collection(collection) plt.show() From 30110387aca2f9f241ec185ec46595892b69e464 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Sun, 9 Jul 2017 23:49:27 -0400 Subject: [PATCH 27/61] Some minor code fixes and prose polishing --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 22 ++++++------ ...lib-Part4-Limits_Legends_and_Layouts.ipynb | 34 ++++++++++--------- AnatomyOfMatplotlib-Part5-Artists.ipynb | 21 +++++++++--- AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb | 6 ++-- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 4dfcd49..783dcac 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -6,7 +6,7 @@ "source": [ "# Part 2: Visual Overview of Plotting Functions\n", "\n", - "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and matplotlib gallery is a great place to get examples of all of them. \n", + "We've talked a lot about laying things out, etc, but we haven't talked about actually plotting data yet. Matplotlib has a number of different plotting functions -- many more than we'll cover here, in fact. There's a more complete list in the pyplot documentation, and Matplotlib gallery is a great place to get examples of all of them. \n", "\n", "However, a full list and/or the gallery can be a bit overwhelming at first. Instead we'll condense it down and give you a look at some of the ones you're most likely to use, and then go over a subset of those in more detail.\n", "\n", @@ -103,9 +103,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a matplotlib figure/axes/etc is an `Artist` of some sort. Most of the time, you will not need to retain these returned objects. You will want to capture them for special customizing that may not be possible through the normal plotting mechanism.\n", + "Note that we held on to what `ax.bar(...)` returned. Matplotlib plotting methods return an `Artist` or a sequence of artists. Anything you can see in a Matplotlib figure/axes/etc is an `Artist` of some sort. Most of the time, you will not need to retain these returned objects. You will want to capture them for special customizing that may not be possible through the normal plotting mechanism.\n", "\n", - "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus `for bar in vert_bars`)." + "Let's re-visit that last example and modify what's plotted. In the case of `bar`, a container artist is returned, so we'll modify its contents instead of the container itself (thus, `for bar in vert_bars`)." ] }, { @@ -120,8 +120,8 @@ "vert_bars = ax.bar(x, y, color='lightblue', align='center')\n", "\n", "# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.\n", - "for bar in vert_bars:\n", - " if bar.xy[1] < 0:\n", + "for bar, height in zip(vert_bars, y):\n", + " if height < 0:\n", " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", "\n", "plt.show()" @@ -148,7 +148,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -255,7 +255,7 @@ "source": [ "# Input Data: 2D Arrays or Images\n", "\n", - "There are several options for plotting 2D datasets. `imshow`, `pcolor`, and `pcolormesh` have a lot of overlap, at first glance. (The example image below is meant to clarify that somewhat.)\n", + "There are several options for plotting 2D datasets. `imshow`, `pcolor`, and `pcolormesh` have a lot of overlap, at first glance. The image below is meant to clarify that somewhat.\n", "\n", "\n", "\n", @@ -266,7 +266,7 @@ "\n", "Instead we'll focus on what they have in common.\n", "\n", - "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other matplotlib plotting methods that map a range of data values onto a colormap will return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." + "`imshow`, `pcolor`, `pcolormesh`, `scatter`, and any other Matplotlib plotting methods that map a range of data values onto a colormap will return artists that are instances of `ScalarMappable.` In practice, what that means is a) you can display a colorbar for them, and b) they share several keyword arguments." ] }, { @@ -349,7 +349,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -373,7 +373,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -419,6 +419,8 @@ "import matplotlib.pyplot as plt\n", "np.random.seed(1)\n", "\n", + "plt.style.use('classic')\n", + "\n", "# Generate random data with different ranges...\n", "data1 = np.random.random((10, 10))\n", "data2 = 2 * np.random.random((10, 10))\n", diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index 3d1d4c7..534fc87 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -32,7 +32,7 @@ "source": [ "# Limits and autoscaling\n", "\n", - "By default, matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For line and image plots, the limits are not padded, while plots such as scatter plots and bar plots are given some padding." + "By default, Matplotlib will attempt to determine limits for you that encompasses all the data you have plotted. This is the \"autoscale\" feature. For image plots, the limits are not padded while plots such as scatter plots and bar plots are given some padding." ] }, { @@ -57,9 +57,9 @@ "source": [ "### `ax.margins(...)`\n", "\n", - "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", + "If you'd like to add a bit of \"padding\" to a plot, `ax.margins()` is a very handy way to do so. Instead of choosing \"even-ish\" numbers as min/max ranges for each axis, `margins` will make Matplotlib calculate the min/max of each axis by taking the range of the data and adding on a fractional amount of padding.\n", "\n", - "As an example: (Note that the ranges for the scatter example actually shrink slightly in this case)" + "As an example:" ] }, { @@ -100,7 +100,7 @@ "However, you'll probably use `axis` mostly with either the `\"tight\"` or `\"equal\"` options. There are other options as well; see the documentation for full details. In a nutshell, though:\n", "\n", " * *tight*: Set axes limits to the exact range of the data\n", - " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. (In matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square, though!)\n", + " * *equal*: Set axes scales such that one cm/inch in the y-direction is the same as one cm/inch in the x-direction. In Matplotlib terms, this sets the aspect ratio of the plot to 1. That _doesn't_ mean that the axes \"box\" will be square.\n", " \n", "And as an example:" ] @@ -135,7 +135,7 @@ "source": [ "### Manually setting only one limit\n", "\n", - "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting matplotlib autoscale the rest of it." + "Another trick with limits is to specify only half of a limit. When done **after** a plot is made, this has the effect of allowing the user to anchor a limit while letting Matplotlib autoscale the rest of it." ] }, { @@ -203,11 +203,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Legends will go in the upper right corner by default (you can control this with the `loc` kwarg), but if you'd prefer matplotlib to choose a location to avoid overlapping plot elements as much as possible, you can pass in:\n", + "In `classic` mode, legends will go in the upper right corner by default (you can control this with the `loc` kwarg). As of v2.0, by default Matplotlib will choose a location to avoid overlapping plot elements as much as possible. To force this option, you can pass in:\n", "\n", " ax.legend(loc=\"best\")\n", " \n", - "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\". " + "Also, if you happen to be plotting something that you do not want to appear in the legend, just set the label to \"\\_nolegend\\_\"." ] }, { @@ -260,6 +260,8 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", + "plt.style.use('classic')\n", + "\n", "t = np.linspace(0, 2 * np.pi, 150)\n", "x1, y1 = np.cos(t), np.sin(t)\n", "x2, y2 = 2 * x1, 2 * y1\n", @@ -315,7 +317,7 @@ "source": [ "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", " \n", - "The easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "Currently, the easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", "\n", "For example:" ] @@ -365,9 +367,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magic\" that matplotlib performs. We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with placement of figures in their documents.\n", + "A common \"gotcha\" is that the labels are not automatically adjusted to avoid overlapping those of another subplot. Matplotlib does not currently have any sort of robust layout engine, as it is a design decision to minimize the amount of \"magical plotting\". We intend to let users have complete, 100% control over their plots. LaTeX users would be quite familiar with the amount of frustration that can occur with automatic placement of figures in their documents.\n", "\n", - "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins, and subplots so that nothing overlaps.\n", + "That said, there have been some efforts to develop tools that users can use to help address the most common compaints. The \"[Tight Layout](http://matplotlib.org/users/tight_layout_guide.html)\" feature, when invoked, will attempt to resize margins and subplots so that nothing overlaps.\n", "\n", "If you have multiple subplots, and want to avoid overlapping titles/axis labels/etc, `fig.tight_layout` is a great way to do so:" ] @@ -392,7 +394,7 @@ "example_plot(ax3)\n", "example_plot(ax4)\n", "\n", - "# Try enabling fig.tight_layout to compare...\n", + "# Enable fig.tight_layout to compare...\n", "#fig.tight_layout()\n", "\n", "plt.show()" @@ -403,7 +405,7 @@ "metadata": {}, "source": [ "## GridSpec\n", - "Under the hood, matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." + "Under the hood, Matplotlib utilizes [`GridSpec`](http://matplotlib.org/api/gridspec_api.html) to lay out the subplots. While `plt.subplots()` is fine for simple cases, sometimes you will need more advanced subplot layouts. In such cases, you should use GridSpec directly. GridSpec is outside the scope of this tutorial, but it is handy to know that it exists. [Here](http://matplotlib.org/users/gridspec.html) is a guide on how to use it." ] }, { @@ -478,8 +480,8 @@ "\n", "# \"outward\"\n", "# Move the two remaining spines \"out\" away from the plot by 10 points\n", - "ax.spines['bottom'].set_position(('outward', 10))\n", - "ax.spines['left'].set_position(('outward', 10))\n", + "#ax.spines['bottom'].set_position(('outward', 10))\n", + "#ax.spines['left'].set_position(('outward', 10))\n", "\n", "# \"data\"\n", "# Have the spines stay intersected at (0,0)\n", @@ -489,7 +491,7 @@ "# \"axes\"\n", "# Have the two remaining spines placed at a fraction of the axes\n", "#ax.spines['bottom'].set_position(('axes', 0.75))\n", - "#ax.spines['left'].set_position(('axes', 0.25))\n", + "#ax.spines['left'].set_position(('axes', 0.3))\n", "\n", "plt.show()" ] @@ -538,7 +540,7 @@ "\n", "# Here's the data...\n", "data = [('dogs', 4, 4), ('frogs', -3, 1), ('cats', 1, 5), ('goldfish', -2, 2)]\n", - "animals, friendliness, popularity = zip(*data)\n" + "animals, friendliness, popularity = zip(*data)" ] } ], diff --git a/AnatomyOfMatplotlib-Part5-Artists.ipynb b/AnatomyOfMatplotlib-Part5-Artists.ipynb index 2b6591f..c52cd26 100644 --- a/AnatomyOfMatplotlib-Part5-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part5-Artists.ipynb @@ -139,7 +139,7 @@ "source": [ "Containers are objects like *Figure* and *Axes*. Containers are given primitives to draw. The plotting functions we discussed back in Parts 1 & 2 are convenience functions that generate these primitives and places them into the appropriate containers. In fact, most of those functions will return artist objects (or a list of artist objects) as well as store them into the appropriate axes container.\n", "\n", - "As discussed in Part 3, there is a wide range of properties that can be defined for your plots. These properties are processed and passed down to the primitives, for your convenience. Ultimately, you can override anything you want just by directly setting a property to the object itself." + "As discussed in Part 3, there is a wide range of properties that can be defined for your plots. These properties are processed and applied to their primitives. Ultimately, you can override anything you want just by directly setting a property to the object itself." ] }, { @@ -173,7 +173,8 @@ "outputs": [], "source": [ "fig = plt.figure()\n", - "print(plt.getp(fig.patch))" + "print(plt.getp(fig.patch))\n", + "plt.close(fig)" ] }, { @@ -181,7 +182,7 @@ "metadata": {}, "source": [ "# Collections\n", - "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle) objects all with the same color, size, and edge width. Individual values for artists in the collection can also be set." + "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle) objects all with the same color, size, and edge width. Individual property values for artists in the collection can also be set (in some cases)." ] }, { @@ -194,6 +195,7 @@ "source": [ "from matplotlib.collections import LineCollection\n", "fig, ax = plt.subplots(1, 1)\n", + "# A collection of 3 lines\n", "lc = LineCollection([[(4, 10), (16, 10)],\n", " [(2, 2), (10, 15), (6, 7)],\n", " [(14, 3), (1, 1), (3, 5)]])\n", @@ -213,7 +215,7 @@ }, "outputs": [], "source": [ - "# Now show how to set individual properties in a collection\n", + "# Now set individual properties in a collection\n", "fig, ax = plt.subplots(1, 1)\n", "lc = LineCollection([[(4, 10), (16, 10)],\n", " [(2, 2), (10, 15), (6, 7)],\n", @@ -230,7 +232,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "There are other kinds of collections that are not just simply a list of primitives, but are Artists in their own right. These special kinds of collections take advantage of various optimizations that can be assumed when rendering similar or identical things. You actually do use these collections all the time whether you realize it or not. Markers are (indirectly) implemented this way (so, whenever you do `plot()` or `scatter()`, for example)." + "There are other kinds of collections that are not just simply a list of primitives, but are Artists in their own right. These special kinds of collections take advantage of various optimizations that can be assumed when rendering similar or identical things. You use these collections all the time whether you realize it or not! Markers are implemented this way (so, whenever you do `plot()` or `scatter()`, for example)." ] }, { @@ -294,6 +296,15 @@ "ax.add_collection(collection)\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb index 36fc680..f63074a 100644 --- a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb +++ b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb @@ -25,7 +25,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In addition to the core library of matplotlib, there are a few additional utilities that are set apart from matplotlib proper for some reason or another, but are often shipped with matplotlib.\n", + "In addition to the core library of Matplotlib, there are a few additional utilities that are set apart from Matplotlib proper for some reason or another, but are often shipped with Matplotlib.\n", "\n", "* [Basemap](http://matplotlib.org/basemap/) - shipped separately from matplotlib due to size of mapping data that are included.\n", "* [mplot3d](http://matplotlib.org/mpl_toolkits/mplot3d/index.html#toolkit-mplot3d-index) - shipped with matplotlib to provide very simple, rudimentary 3D plots in the same style as matplotlib's 2D plots.\n", @@ -37,7 +37,7 @@ "metadata": {}, "source": [ "# mplot3d\n", - "By taking advantage of matplotlib's z-order layering engine, mplot3d emulates 3D plotting by projecting 3D data into 2D space, layer by layer. While it isn't going to replace any of the true 3D plotting libraries anytime soon, its goal is to allow for matplotlib users to produce 3D plots with the same amount of simplicity as 2D plots are." + "By taking advantage of Matplotlib's z-order layering engine, mplot3d emulates 3D plotting by projecting 3D data into 2D space, layer by layer. While it isn't going to replace any of the true 3D plotting libraries anytime soon, its goal is to allow for Matplotlib users to produce 3D plots with the same amount of simplicity as 2D plots." ] }, { @@ -62,7 +62,7 @@ "metadata": {}, "source": [ "# axes_grid1\n", - "This module was originally intended as a collection of helper classes to ease the displaying of (possibly multiple) images with matplotlib. Some of the functionality has come to be useful for non-image plotting as well. Some classes deals with the sizing and positioning of multiple Axes relative to each other ([`ImageGrid`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#imagegrid), [`RGB Axes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#rgb-axes), and [`AxesDivider`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#axesdivider)). The [`ParasiteAxes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#parasiteaxes) allow for the plotting of multiple datasets in the same axes, but with each their own x or y scale. Also, there is the [`AnchoredArtist`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#anchoredartists) that can be used to anchor particular artist objects in place.\n", + "This module was originally intended as a collection of helper classes to ease the displaying of (possibly multiple) images with Matplotlib. Some of the functionality has come to be useful for non-image plotting as well. Some classes deals with the sizing and positioning of multiple Axes relative to each other ([`ImageGrid`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#imagegrid), [`RGB Axes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#rgb-axes), and [`AxesDivider`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#axesdivider)). The [`ParasiteAxes`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#parasiteaxes) allow for the plotting of multiple datasets in the same axes, but with each their own x or y scale. Also, there is the [`AnchoredArtist`](http://matplotlib.org/mpl_toolkits/axes_grid/users/overview.html#anchoredartists) that can be used to anchor particular artist objects in place.\n", "\n", "One can get a sense of the neat things that can be done with this toolkit by browsing through its user guide linked above. There is one particular feature that is an absolute must-have for me -- automatic allocation of space for colorbars." ] From 540c9bba3c6d13ee302b4973dc6331137c6c5ac6 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 10 Jul 2017 00:10:27 -0400 Subject: [PATCH 28/61] More prose polishing --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 27 +++++----- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 51 ++++++++----------- 2 files changed, 33 insertions(+), 45 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index ae34b0d..94e0cc2 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -12,7 +12,7 @@ "outputs": [], "source": [ "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function\n" + "from __future__ import print_function" ] }, { @@ -25,8 +25,7 @@ "source": [ "# Matplotlib\n", "## Introduction\n", - "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the bottom-up to serve dual-purposes. First, to allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system.\n", - "\n" + "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the beginning to serve two purposes. First, allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system." ] }, { @@ -37,12 +36,12 @@ "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", "\n", "## Gallery\n", - "Many users of matplotlib are often faced with the question, \"I want to make a plot that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query. This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make plots. Browse through the gallery, click on any figure that has pieces of what you want to see the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", + "Many users of Matplotlib are often faced with the question, \"I want to make a figure that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query! This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make figures. Browse through the gallery, click on any figure that has pieces of what you want to see and the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", "\n", - "As always, if you have a new and interesting plot that demonstrates a feature of matplotlib, feel free to submit a well-commented version of the example code for inclusion.\n", + "As always, if you have a new and interesting plot that demonstrates a feature of Matplotlib, feel free to submit a concise, well-commented version of the code for inclusion in the gallery.\n", "\n", "## Mailing Lists and StackOverflow\n", - "When you are just simply stuck, and can not figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](https://mail.python.org/mailman/listinfo/matplotlib-users). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "When you are just simply stuck, and cannot figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](https://mail.python.org/mailman/listinfo/matplotlib-users). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", "\n", "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too! We are also on [Gitter](https://gitter.im/matplotlib/matplotlib).\n", "\n", @@ -51,7 +50,7 @@ "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", "\n", "### Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at Matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." ] }, { @@ -81,7 +80,7 @@ "source": [ "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", "\n", - "Inside of IPython, it's often easiest to use the Jupyter ``nbagg`` or ``notebook`` backend. This allows plots to be displayed and interacted with inline in the browser in a Jupyter notebook. Otherwise, figures will pop up in a separate GUI window.\n", + "Inside of IPython, it's often easiest to use the Jupyter ``nbagg`` or ``notebook`` backend. This allows plots to be displayed and interacted with in the browser in a Jupyter notebook. Otherwise, figures will pop up in a separate GUI window.\n", "\n", "We can do this in two ways:\n", "\n", @@ -91,9 +90,9 @@ "2. ``matplotlib.use(\"backend_name\")``\n", " - Figures will only be shown when you call ``plt.show()``.\n", "\n", - "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an IPython notebook or from the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", + "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an Jupyter notebook or from a python script at the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", "\n", - "One final note: You need to do this before you ``import matplotlib.pyplot``." + "One final note: You will always need to do this before you ``import matplotlib.pyplot as plt``." ] }, { @@ -118,14 +117,13 @@ "\n", "People use \"plot\" to mean many different things. Here, we'll be using a consistent terminology (mirrored by the names of the underlying classes, etc):\n", "\n", - "\n", "\n", "\n", "The ``Figure`` is the top-level container in this hierarchy. It is the overall window/page that everything is drawn on. You can have multiple independent figures and ``Figure``s can contain multiple ``Axes``. \n", "\n", "Most plotting ocurs on an ``Axes``. The axes is effectively the area that we plot data on and any ticks/labels/etc associated with it. Usually we'll set up an Axes with a call to ``subplot`` (which places Axes on a regular grid), so in most cases, ``Axes`` and ``Subplot`` are synonymous.\n", "\n", - "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things all that much. However, it's worth mentioning here to explain where the term ``Axes`` comes from.\n" + "Each ``Axes`` has an ``XAxis`` and a ``YAxis``. These contain the ticks, tick locations, labels, etc. In this tutorial, we'll mostly control ticks, tick labels, and data limits through other mechanisms, so we won't touch the individual ``Axis`` part of things all that much. However, it is worth mentioning here to explain where the term ``Axes`` comes from.\n" ] }, { @@ -134,7 +132,7 @@ "source": [ "## Getting Started\n", "\n", - "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code, etc that you'll find elsewhere will use them as well." + "In this tutorial, we'll use the following import statements. These abbreviations are semi-standardized, and most tutorials, other scientific python code that you'll find elsewhere will use them as well." ] }, { @@ -236,7 +234,8 @@ "source": [ "fig = plt.figure()\n", "ax = fig.add_subplot(111) # We'll explain the \"111\" later. Basically, 1 row and 1 column.\n", - "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')\n", + "ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',\n", + " ylabel='Y-Axis', xlabel='X-Axis')\n", "plt.show()" ] }, diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 5cd063d..21f1065 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -10,7 +10,7 @@ "source": [ "# Let printing work the same in Python 2 and 3\n", "from __future__ import print_function\n", - "# Turning on inline plots -- just for use in ipython notebooks.\n", + "# Turning on inline plots -- just for use in jupyter notebooks.\n", "import matplotlib\n", "matplotlib.use('nbagg')\n", "import numpy as np\n", @@ -22,14 +22,16 @@ "metadata": {}, "source": [ "# How to speak \"MPL\"\n", - "In the previous parts, you learned how matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many plotting methods that matplotlib has to draw on those axes. With all that knowledge, you should be off making great and wonderful figures. Why are you still here?\n", + "In the previous parts, you learned how Matplotlib organizes plot-making by figures and axes. We broke down the components of a basic figure and learned how to create them. You also learned how to add one or more axes to a figure, and how to tie them together. You even learned how to change some of the basic appearances of the axes. Finally, we went over some of the many plotting methods that Matplotlib has to draw on those axes. With all that knowledge, you should be off making great and wonderful figures.\n", + "\n", + "Why are you still here?\n", "\n", "\"We don't know how to control our plots and figures!\" says some random voice in the back of the room.\n", "\n", - "Of course! While the previous sections may have taught you some of the structure and syntax of matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of matplotlib.\n", + "Of course! While the previous sections may have taught you some of the structure and syntax of Matplotlib, it did not describe much of the substance and vocabulary of the library. This section will go over many of the properties that are used throughout the library. Note that while many of the examples in this section may show one way of setting a particular property, that property may be applicible elsewhere in completely different context. This is the \"language\" of Matplotlib.\n", "\n", "# Colors\n", - "This is, perhaps, the most important piece of vocabulary in matplotlib. Given that matplotlib is a plotting library, colors are associated with everything that is plotted in your figures. Matplotlib supports a [very robust language](http://matplotlib.org/api/colors_api.html#module-matplotlib.colors) for specifying colors that should be familiar to a wide variety of users.\n", + "This is, perhaps, the most important piece of vocabulary in Matplotlib. Given that Matplotlib is a plotting library, colors are associated with everything that is plotted in your figures. Matplotlib supports a [very robust language](http://matplotlib.org/api/colors_api.html#module-matplotlib.colors) for specifying colors that should be familiar to a wide variety of users.\n", "\n", "### Colornames\n", "First, colors can be given as strings. For very basic colors, you can even get away with just a single letter:\n", @@ -43,20 +45,20 @@ "- k: black\n", "- w: white\n", "\n", - "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\" are valid. See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (Note, I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", + "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", "\n", "### Hex values\n", - "Colors can also be specified by supplying an HTML/CSS hex string, such as `'#0000FF'` for blue.\n", + "Colors can also be specified by supplying a HTML/CSS hex string, such as `'#0000FF'` for blue. Support for an optional alpha channel has recently been added as well.\n", "\n", "### 256 Shades of Gray\n", - "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a lighter shade of gray.\n", + "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a light shade of gray.\n", "\n", "### RGB[A] tuples\n", - "You may come upon instances where the previous ways of specifying colors do not work. This can sometimes happen in some of the deeper, stranger levels of the code. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", + "You may come upon instances where the previous ways of specifying colors do not work. This can sometimes happen in some of the deeper, stranger levels of the library. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", "\n", "In functions such as `plot()` and `scatter()`, while it may appear that they can take a color specification, what they really need is a \"format specification\", which includes color as part of the format. Unfortunately, such specifications are string only and so RGB[A] tuples are not supported for such arguments (but you can still pass an RGB[A] tuple for a \"color\" argument).\n", "\n", - "Note, oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this problem.\n" + "Oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this inconsistency." ] }, { @@ -78,19 +80,6 @@ "%load exercises/3.1-colors.py" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, , t, t**2, , t, t**3, )\n", - "plt.show()\n" - ] - }, { "cell_type": "code", "execution_count": null, @@ -140,7 +129,7 @@ " \"tick left\", \"caret left\", \"triangle left\", \"tri left\", \"tick right\", \"caret right\", \"triangle right\", \"tri right\",\n", " \"tick up\", \"caret up\", \"triangle up\", \"tri up\", \"tick down\", \"caret down\", \"triangle down\", \"tri down\",\n", " \"Nothing\", \"Nothing\", \"Nothing\", \"Nothing\"]\n", - "fig, ax = plt.subplots(1, 1, figsize=(14, 4))\n", + "fig, ax = plt.subplots(1, 1, figsize=(7.5, 4))\n", "for x, y, m, d in zip(xs.T.flat, ys.T.flat, markers, descripts):\n", " ax.scatter(x, y, marker=m, s=100)\n", " ax.text(x + 0.1, y - 0.1, d, size=14)\n", @@ -177,7 +166,7 @@ "source": [ "t = np.arange(0.0, 5.0, 0.2)\n", "plt.plot(t, t, , t, t**2, , t, t**3, )\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -238,7 +227,7 @@ "metadata": {}, "source": [ "# Plot attributes\n", - "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For the [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`plt.scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) functions, you can mix the specification for the colors, linestyles, and markers in a single string." + "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, Matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For the [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`plt.scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) functions, you can mix the specification for the colors, linestyles, and markers in a single string." ] }, { @@ -321,7 +310,7 @@ "# Colormaps\n", "Another very important property of many figures is the colormap. The job of a colormap is to relate a scalar value to a color. In addition to the regular portion of the colormap, an \"over\", \"under\" and \"bad\" color can be optionally defined as well. NaNs will trigger the \"bad\" part of the colormap.\n", "\n", - "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The upcoming v2.0 release of matplotlib will take on a new default colormap along with some other stylistic changes to the defaults. The defaults will be discussed this week during SciPy 2015.\n", + "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The v2.0 release of Matplotlib adopted a new default colormap, 'viridis', along with some other stylistic changes to the defaults.\n", "\n", "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." ] @@ -518,7 +507,7 @@ "ncol = 2\n", "nrow = (len(styles)+1) // ncol\n", "figheight = (nrow+0.5)\n", - "fig = plt.figure(figsize=(4.0*ncol/0.85, figheight/0.85))\n", + "fig = plt.figure(figsize=(3.0*ncol/0.85, figheight/0.85))\n", "fontsize = 0.4 * 70\n", "\n", "ax = fig.add_axes([0, 0, 1, 1])\n", @@ -638,9 +627,9 @@ "metadata": {}, "source": [ "# Transforms\n", - "The topic of transforms in matplotlib, that is the ability to map the coordinates specified by your data to the coordinates of your figure, is very advanced and will not be covered in this tutorial. For those who are interested in learning about them, see the [transformation tutorial](http://matplotlib.org/users/transforms_tutorial.html). For those who are really daring, there are the developer guides to [transforms](http://matplotlib.org/devel/transformations.html) and [scales](http://matplotlib.org/devel/add_new_projection.html). While most users will never, ever need to understand matplotlib transforms to the level described in those links, it is important to be aware of them, and their critical role in figure-making.\n", + "The topic of transforms in Matplotlib, that is the ability to map the coordinates specified by your data to the coordinates of your figure, is very advanced and will not be covered in this tutorial. For those who are interested in learning about them, see the [transformation tutorial](http://matplotlib.org/users/transforms_tutorial.html). For those who are really daring, there are the developer guides to [transforms](http://matplotlib.org/devel/transformations.html) and [scales](http://matplotlib.org/devel/add_new_projection.html). While most users will never, ever need to understand Matplotlib transforms to the level described in those links, it is important to be aware of them, and their critical role in figure-making.\n", "\n", - "In a figure, there are four coordinate systems: *display*, *figure*, *axes*, and *data*. Transforms are used to convert coordinates in one system into another system for various uses. This is how matplotlib knows exactly where to place the ticks and ticklabels, even when you change the axis limits. The ticker says that the tick and label \"1.5\", for example, are to go at data x-coordinate 1.5. The transform says that location is at 0.4 in axes x-coordinate space. Meanwhile, the xlabel of \"Distance\" is placed at axes x-coordinate space of 0.5 (half-way). Meanwhile, a legend might be placed at a location relative to the figure coordinates.\n", + "In a figure, there are four coordinate systems: *display*, *figure*, *axes*, and *data*. Transforms are used to convert coordinates in one system into another system for various uses. This is how Matplotlib knows exactly where to place the ticks and ticklabels, even when you change the axis limits. The ticker says that the tick and label \"1.5\", for example, are to go at data x-coordinate 1.5. The transform says that location is at 0.4 in axes x-coordinate space. Meanwhile, the xlabel of \"Distance\" is placed at axes x-coordinate space of 0.5 (half-way). Meanwhile, a legend might be placed at a location relative to the figure coordinates.\n", "\n", "Furthermore, the transform system is what is used to allow various scales to work, such as log scales. The transform system is what is used to make the polar plots work seamlessly. Whether you realize it or not, you use the transforms system in matplotlib all the time. Everything drawn in matplotlib has a transform associated with it. Most of the time, you will never notice this, and will happily operate within the *data* coordinate system. But when you want to do some more advanced plots, with some eye-catching visual tricks, the transform system will be there for you." ] @@ -650,9 +639,9 @@ "metadata": {}, "source": [ "# Managing the unmanagable -- Introducing matplotlibrc\n", - "Matplotlib's greatest strength is its ability to give you complete control over every single aspect of your plots and figures. Matplotlib's second greatest strength is its ability to take as much control over as much of your plots and figures as you want. You, as the user, would never consider to use matplotlib if you had to specify all of these things for every single plot. Most of the time, the defaults are exactly what you want them to be.\n", + "Matplotlib's greatest strength is its ability to give you complete control over every single aspect of your plots and figures. Matplotlib's second greatest strength is its ability to take as much control over as much of your plots and figures as you want. You, as the user, would never consider to use Matplotlib if you had to specify all of these things for every single plot. Most of the time, the defaults are exactly what you want them to be.\n", "\n", - "Matplotlib uses the matplotlibrc configuration file to define the plethora of defaults found in matplotlib. You can control the defaults of almost every property in matplotlib: figure size and dpi, line width, color and style, axes, axis and grid properties, text and font properties and so on. Just modify your rc file and re-run your scripts to produce your improved figures.\n", + "Matplotlib uses the matplotlibrc configuration file to define the plethora of defaults found in the library. You can control the defaults of almost every property in Matplotlib: figure size and dpi, line width, color and style, axes, axis and grid properties, text and font properties and so on. Just modify your rc file and re-run your scripts to produce your improved figures.\n", "\n", "To display where the currently active matplotlibrc file was loaded from, one can do the following:" ] From 6ef37a258eb6194d43ae9e73e5defd1029e7f895 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 10 Jul 2017 23:36:18 -0400 Subject: [PATCH 29/61] Swap out arrows and annotation section for property cycling Also add in sub-section on color cycle references. --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 234 ++++++------------ 1 file changed, 80 insertions(+), 154 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 21f1065..9a096a9 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -48,7 +48,7 @@ "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", "\n", "### Hex values\n", - "Colors can also be specified by supplying a HTML/CSS hex string, such as `'#0000FF'` for blue. Support for an optional alpha channel has recently been added as well.\n", + "Colors can also be specified by supplying a HTML/CSS hex string, such as `'#0000FF'` for blue. Support for an optional alpha channel was added for v2.0.\n", "\n", "### 256 Shades of Gray\n", "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a light shade of gray.\n", @@ -58,7 +58,10 @@ "\n", "In functions such as `plot()` and `scatter()`, while it may appear that they can take a color specification, what they really need is a \"format specification\", which includes color as part of the format. Unfortunately, such specifications are string only and so RGB[A] tuples are not supported for such arguments (but you can still pass an RGB[A] tuple for a \"color\" argument).\n", "\n", - "Oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this inconsistency." + "Oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this inconsistency.\n", + "\n", + "### Cycle references\n", + "With the advent of fancier color cycles coming from the many available styles, users needed a way to reference those colors in the style without explicitly knowing what they are. So, in v2.0, the ability to reference the first 10 iterations of the color cycle was added. Whereever one could specify a color, you can supply a 2 character string of 'C#'. So, 'C0' would be the first color, 'C1' would be the second, and so on and so forth up to 'C9'." ] }, { @@ -89,7 +92,7 @@ "outputs": [], "source": [ "t = np.arange(0.0, 5.0, 0.2)\n", - "plt.plot(t, t, , t, t**2, , t, t**3, )\n", + "plt.plot(t, t, t, t**2, t, t**3)\n", "plt.show()" ] }, @@ -312,18 +315,9 @@ "\n", "As we all know, we create figures in order to convey information visually to our readers. There is much care and consideration that have gone into the design of these colormaps. Your choice in which colormap to use depends on what you are displaying. In mpl, the \"jet\" colormap has historically been used by default, but it will often not be the colormap you would want to use. Much discussion has taken place on the mailing lists with regards to what colormap should be default. The v2.0 release of Matplotlib adopted a new default colormap, 'viridis', along with some other stylistic changes to the defaults.\n", "\n", - "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%load http://matplotlib.org/mpl_examples/color/colormaps_reference.py # For those with v1.2 or higher" + "I want to acknowedge Nicolas Rougier and Tony Yu for putting significant effort in educating users in proper colormap selections. Furthermore, thanks goes to Nathaniel Smith and Stéfan van der Walt for developing the new perceptually uniform colormaps such as viridis. [Here is the talk](https://www.youtube.com/watch?v=xAoljeRJ3lU) they gave at SciPy 2015 that does an excelent job explaining colormaps.\n", + "\n", + "Here is the full gallery of all the pre-defined colormaps, organized by the types of data they are usually used for." ] }, { @@ -334,7 +328,12 @@ }, "outputs": [], "source": [ + "# %load http://matplotlib.org/mpl_examples/color/colormaps_reference.py\n", "\"\"\"\n", + "==================\n", + "Colormap reference\n", + "==================\n", + "\n", "Reference for colormaps included with Matplotlib.\n", "\n", "This reference example shows all colormaps included with Matplotlib. Note that\n", @@ -372,28 +371,37 @@ "import matplotlib.pyplot as plt\n", "\n", "\n", - "cmaps = [('Sequential', ['binary', 'Blues', 'BuGn', 'BuPu', 'gist_yarg',\n", - " 'GnBu', 'Greens', 'Greys', 'Oranges', 'OrRd',\n", - " 'PuBu', 'PuBuGn', 'PuRd', 'Purples', 'RdPu',\n", - " 'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']),\n", - " ('Sequential (2)', ['afmhot', 'autumn', 'bone', 'cool', 'copper',\n", - " 'gist_gray', 'gist_heat', 'gray', 'hot', 'pink',\n", - " 'spring', 'summer', 'winter']),\n", - " ('Diverging', ['BrBG', 'bwr', 'coolwarm', 'PiYG', 'PRGn', 'PuOr',\n", - " 'RdBu', 'RdGy', 'RdYlBu', 'RdYlGn', 'seismic']),\n", - " ('Qualitative', ['Accent', 'Dark2', 'hsv', 'Paired', 'Pastel1',\n", - " 'Pastel2', 'Set1', 'Set2', 'Set3', 'spectral']),\n", - " ('Miscellaneous', ['gist_earth', 'gist_ncar', 'gist_rainbow',\n", - " 'gist_stern', 'jet', 'brg', 'CMRmap', 'cubehelix',\n", - " 'gnuplot', 'gnuplot2', 'ocean', 'rainbow',\n", - " 'terrain', 'flag', 'prism'])]\n", + "# Have colormaps separated into categories:\n", + "# http://matplotlib.org/examples/color/colormaps_reference.html\n", + "cmaps = [('Perceptually Uniform Sequential', [\n", + " 'viridis', 'plasma', 'inferno', 'magma']),\n", + " ('Sequential', [\n", + " 'Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',\n", + " 'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',\n", + " 'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn']),\n", + " ('Sequential (2)', [\n", + " 'binary', 'gist_yarg', 'gist_gray', 'gray', 'bone', 'pink',\n", + " 'spring', 'summer', 'autumn', 'winter', 'cool', 'Wistia',\n", + " 'hot', 'afmhot', 'gist_heat', 'copper']),\n", + " ('Diverging', [\n", + " 'PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu',\n", + " 'RdYlBu', 'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']),\n", + " ('Qualitative', [\n", + " 'Pastel1', 'Pastel2', 'Paired', 'Accent',\n", + " 'Dark2', 'Set1', 'Set2', 'Set3',\n", + " 'tab10', 'tab20', 'tab20b', 'tab20c']),\n", + " ('Miscellaneous', [\n", + " 'flag', 'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern',\n", + " 'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg', 'hsv',\n", + " 'gist_rainbow', 'rainbow', 'jet', 'nipy_spectral', 'gist_ncar'])]\n", "\n", "\n", "nrows = max(len(cmap_list) for cmap_category, cmap_list in cmaps)\n", "gradient = np.linspace(0, 1, 256)\n", "gradient = np.vstack((gradient, gradient))\n", "\n", - "def plot_color_gradients(cmap_category, cmap_list):\n", + "\n", + "def plot_color_gradients(cmap_category, cmap_list, nrows):\n", " fig, axes = plt.subplots(nrows=nrows)\n", " fig.subplots_adjust(top=0.95, bottom=0.01, left=0.2, right=0.99)\n", " axes[0].set_title(cmap_category + ' colormaps', fontsize=14)\n", @@ -409,8 +417,9 @@ " for ax in axes:\n", " ax.set_axis_off()\n", "\n", + "\n", "for cmap_category, cmap_list in cmaps:\n", - " plot_color_gradients(cmap_category, cmap_list)\n", + " plot_color_gradients(cmap_category, cmap_list, nrows)\n", "\n", "plt.show()\n" ] @@ -462,104 +471,35 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Annotations and Arrows\n", - "There are two ways one can place arbitrary text anywhere they want on a plot. The first is a simple [`text()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.text). Then there is the fancier [`annotate()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.annotate) function that can help \"point out\" what you want to annotate." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "t = np.arange(0.0, 5.0, 0.01)\n", - "s = np.cos(2*np.pi*t)\n", - "plt.plot(t, s, lw=2)\n", - "\n", - "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", - " arrowprops=dict(facecolor='black', shrink=0.05))\n", + "# Hatches\n", + "A Patch object can have a hatching defined for it.\n", "\n", - "plt.ylim(-2, 2)\n", - "plt.show()" + "* / - diagonal hatching\n", + "* \\ - back diagonal\n", + "* | - vertical\n", + "* \\- - horizontal\n", + "* \\+ - crossed\n", + "* x - crossed diagonal\n", + "* o - small circle\n", + "* O - large circle (upper-case 'o')\n", + "* . - dots\n", + "* \\* - stars\n", + " \n", + "Letters can be combined, in which case all the specified\n", + "hatchings are done. If same letter repeats, it increases the\n", + "density of hatching of that pattern." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "There are all sorts of boxes for your text, and arrows you can use, and there are many different ways to connect the text to the point that you want to annotate. For a complete tutorial on this topic, go to the [Annotation Guide](http://matplotlib.org/users/annotations_guide.html). In the meantime, here is a table of the kinds of arrows that can be drawn " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import matplotlib.patches as mpatches\n", - "\n", - "styles = mpatches.ArrowStyle.get_styles()\n", - "\n", - "ncol = 2\n", - "nrow = (len(styles)+1) // ncol\n", - "figheight = (nrow+0.5)\n", - "fig = plt.figure(figsize=(3.0*ncol/0.85, figheight/0.85))\n", - "fontsize = 0.4 * 70\n", - "\n", - "ax = fig.add_axes([0, 0, 1, 1])\n", - "ax.set_xlim(0, 4*ncol)\n", - "ax.set_ylim(0, figheight)\n", - "\n", - "def to_texstring(s):\n", - " s = s.replace(\"<\", r\"$<$\")\n", - " s = s.replace(\">\", r\"$>$\")\n", - " s = s.replace(\"|\", r\"$|$\")\n", - " return s\n", - "\n", - "for i, (stylename, styleclass) in enumerate(sorted(styles.items())):\n", - " x = 3.2 + (i//nrow)*4\n", - " y = (figheight - 0.7 - i%nrow)\n", - " p = mpatches.Circle((x, y), 0.2, fc=\"w\")\n", - " ax.add_patch(p)\n", - "\n", - " ax.annotate(to_texstring(stylename), (x, y),\n", - " (x-1.2, y),\n", - " ha=\"right\", va=\"center\",\n", - " size=fontsize,\n", - " arrowprops=dict(arrowstyle=stylename,\n", - " patchB=p,\n", - " shrinkA=50,\n", - " shrinkB=5,\n", - " fc=\"w\", ec=\"k\",\n", - " connectionstyle=\"arc3,rad=-0.25\",\n", - " ),\n", - " bbox=dict(boxstyle=\"square\", fc=\"w\"))\n", + "# Property Cycles\n", + "In case you haven't noticed, when you do multiple plot calls in the same axes -- and not specify any colors -- the color for each plot is different! The default style in Matplotlib will cycle through a list of colors if you don't specify any. This feature has been in Matplotlib for a long time and it is similar to Matlab behavior.\n", "\n", - "ax.set_axis_off()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise 3.4\n", - "Point out a local minimum with a fancy red arrow." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%load exercises/3.4-arrows.py" + "In v1.5, this feature was extended so that one can cycle through other properties besides just color. Now, you can cycle linestyles, markers, hatch styles -- just about any property that can be specified is now possible to be cycled.\n", + "\n", + "This feature is still being refined, and there has been significant improvements in its usability since v1.5, but here is a basic example that will work for v2.0 or greater (for v1.5, you may need to have this cycler expression quoted)." ] }, { @@ -570,14 +510,15 @@ }, "outputs": [], "source": [ - "t = np.arange(0.0, 5.0, 0.01)\n", - "s = np.cos(2*np.pi*t)\n", - "plt.plot(t, s, lw=2)\n", - "\n", - "plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),\n", - " arrowprops=dict())\n", - "\n", - "plt.ylim(-2, 2)\n", + "import matplotlib as mpl\n", + "from matplotlib.rcsetup import cycler\n", + "mpl.rc('axes', prop_cycle=cycler('color', 'rgc') +\n", + " cycler('lw', [1, 4, 6]) +\n", + " cycler('linestyle', ['-', '-.', ':']))\n", + "t = np.arange(0.0, 5.0, 0.2)\n", + "plt.plot(t, t)\n", + "plt.plot(t, t**2)\n", + "plt.plot(t, t**3)\n", "plt.show()" ] }, @@ -585,24 +526,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Hatches\n", - "A Patch object can have a hatching defined for it.\n", - "\n", - "* / - diagonal hatching\n", - "* \\ - back diagonal\n", - "* | - vertical\n", - "* \\- - horizontal\n", - "* \\+ - crossed\n", - "* x - crossed diagonal\n", - "* o - small circle\n", - "* O - large circle (upper-case 'o')\n", - "* . - dots\n", - "* \\* - stars\n", - " \n", - "Letters can be combined, in which case all the specified\n", - "hatchings are done. If same letter repeats, it increases the\n", - "density of hatching of that pattern.\n", - "\n", "## Ugly tie contest!" ] }, @@ -614,11 +537,14 @@ }, "outputs": [], "source": [ - "bars = plt.bar([1, 2, 3, 4], [10, 12, 15, 17])\n", - "plt.setp(bars[0], hatch='x', facecolor='w')\n", - "plt.setp(bars[1], hatch='xx-', facecolor='orange')\n", - "plt.setp(bars[2], hatch='+O.', facecolor='c')\n", - "plt.setp(bars[3], hatch='*', facecolor='y')\n", + "mpl.rc('axes', prop_cycle=cycler('color', ['r', 'orange', 'c', 'y']) +\n", + " cycler('hatch', ['x', 'xx-', '+O.', '*']))\n", + "x = np.array([0.4, 0.2, 0.5, 0.8, 0.6])\n", + "y = [0, -5, -6, -5, 0]\n", + "plt.fill(x+1, y)\n", + "plt.fill(x+2, y)\n", + "plt.fill(x+3, y)\n", + "plt.fill(x+4, y)\n", "plt.show()" ] }, @@ -631,7 +557,7 @@ "\n", "In a figure, there are four coordinate systems: *display*, *figure*, *axes*, and *data*. Transforms are used to convert coordinates in one system into another system for various uses. This is how Matplotlib knows exactly where to place the ticks and ticklabels, even when you change the axis limits. The ticker says that the tick and label \"1.5\", for example, are to go at data x-coordinate 1.5. The transform says that location is at 0.4 in axes x-coordinate space. Meanwhile, the xlabel of \"Distance\" is placed at axes x-coordinate space of 0.5 (half-way). Meanwhile, a legend might be placed at a location relative to the figure coordinates.\n", "\n", - "Furthermore, the transform system is what is used to allow various scales to work, such as log scales. The transform system is what is used to make the polar plots work seamlessly. Whether you realize it or not, you use the transforms system in matplotlib all the time. Everything drawn in matplotlib has a transform associated with it. Most of the time, you will never notice this, and will happily operate within the *data* coordinate system. But when you want to do some more advanced plots, with some eye-catching visual tricks, the transform system will be there for you." + "Furthermore, the transform system is what is used to allow various scales to work, such as log scales. The transform system is what is used to make the polar plots work seamlessly. Whether you realize it or not, you use the transforms system in Matplotlib all the time. Everything drawn in Matplotlib has a transform associated with it. Most of the time, you will never notice this, and will happily operate within the *data* coordinate system. But when you want to do some more advanced plots, with some eye-catching visual tricks, the transform system will be there for you." ] }, { From 83c54d7200b59d819f0d5dbdc86dc8ad354c7c8a Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 11 Jul 2017 00:09:16 -0400 Subject: [PATCH 30/61] Added subsection on the data kwarg --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 783dcac..b354ba0 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -192,6 +192,41 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `data` keyword argument\n", + "When using specialized data structures such as Pandas DataFrame and XArray, the input data to be plotted are accessed like dictionary elements. This can get very repetitive and tedious as one types out a plotting command accessing those elements. So, the `data` keyword argument was added to many of the plotting functions in v1.5. With this feature, one can pass in a single dictionary-like object as `data`, and use the string key names in the place of the usual input data arguments.\n", + "\n", + "Let's revisit the above example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = np.linspace(0, 10, 200)\n", + "data_obj = {'x': x,\n", + " 'y1': 2 * x + 1,\n", + " 'y2': 3 * x + 1.2,\n", + " 'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "# Plot the envelope with `fill_between`\n", + "ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)\n", + "\n", + "# Plot the \"centerline\" with `plot`\n", + "ax.plot('x', 'mean', color='black', data=data_obj)\n", + "\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "metadata": {}, From 91ae919dbc76f2cc41286d22ed4c87ff14a9f4ab Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 11 Jul 2017 11:04:24 -0400 Subject: [PATCH 31/61] Fix a couple of factual/grammatical errors --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 9a096a9..8afa98f 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -230,7 +230,7 @@ "metadata": {}, "source": [ "# Plot attributes\n", - "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, Matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For the [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`plt.scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) functions, you can mix the specification for the colors, linestyles, and markers in a single string." + "With just about any plot you can make, there are many attributes that can be modified to make the lines and markers suit your needs. Note that for many plotting functions, Matplotlib will cycle the colors for each dataset you plot. However, you are free to explicitly state which colors you want used for which plots. For [`plt.plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot), you can mix the specification for the colors, linestyles, and markers in a single string." ] }, { @@ -486,7 +486,7 @@ "* \\* - stars\n", " \n", "Letters can be combined, in which case all the specified\n", - "hatchings are done. If same letter repeats, it increases the\n", + "hatchings are done. Repeating a character increases the\n", "density of hatching of that pattern." ] }, From 3249e26a63efbc6b055e1f3cccbc065dd928b2e6 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 11 Jul 2017 11:05:35 -0400 Subject: [PATCH 32/61] Get the solution to match the text --- solutions/3.3-properties.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/3.3-properties.py b/solutions/3.3-properties.py index 340f787..7e0c9eb 100644 --- a/solutions/3.3-properties.py +++ b/solutions/3.3-properties.py @@ -1,4 +1,4 @@ t = np.arange(0.0, 5.0, 0.1) a = np.exp(-t) * np.cos(2*np.pi*t) -plt.plot(t, a, 'r:', marker='D', mfc='y') +plt.plot(t, a, 'r:D', mfc='y', mec='g') plt.show() From d633b769aeb5c78ed789fdeaa0f96d047753cbef Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 11 Jul 2017 11:34:33 -0400 Subject: [PATCH 33/61] Erm... 5-pointed star --- solutions/5.1-goldstar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/5.1-goldstar.py b/solutions/5.1-goldstar.py index 321a4f0..21f3272 100644 --- a/solutions/5.1-goldstar.py +++ b/solutions/5.1-goldstar.py @@ -4,7 +4,7 @@ fig, ax = plt.subplots(1, 1) offsets = zip([0.2, 0.4, 0.6, 0.8], [0.5] * 4) -collection = StarPolygonCollection(4, +collection = StarPolygonCollection(5, offsets=offsets, transOffset=ax.transData, facecolors=['gold'], From 2cc411a0aee9f513d4547ca4c5aa2bcd2dc295a1 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 11 Jul 2017 11:48:49 -0400 Subject: [PATCH 34/61] Updated axis_grid1 examples --- AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb | 203 +++++++++---------- 1 file changed, 92 insertions(+), 111 deletions(-) diff --git a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb index f63074a..9ecb7d3 100644 --- a/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb +++ b/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb @@ -109,64 +109,57 @@ }, "outputs": [], "source": [ - "%load http://matplotlib.org/mpl_examples/axes_grid/demo_parasite_axes2.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ + "# %load http://matplotlib.org/mpl_examples/axes_grid/demo_parasite_axes2.py\n", + "\"\"\"\n", + "Parasite axis demo\n", + "\n", + "The following code is an example of a parasite axis. It aims to show a user how\n", + "to plot multiple different values onto one single plot. Notice how in this\n", + "example, par1 and par2 are both calling twinx meaning both are tied directly to\n", + "the x-axis. From there, each of those two axis can behave separately from the\n", + "each other, meaning they can take on separate values from themselves as well as\n", + "the x-axis.\n", + "\"\"\"\n", "from mpl_toolkits.axes_grid1 import host_subplot\n", "import mpl_toolkits.axisartist as AA\n", "import matplotlib.pyplot as plt\n", "\n", - "if 1:\n", - "\n", - " host = host_subplot(111, axes_class=AA.Axes)\n", - " plt.subplots_adjust(right=0.75)\n", - "\n", - " par1 = host.twinx()\n", - " par2 = host.twinx()\n", + "host = host_subplot(111, axes_class=AA.Axes)\n", + "plt.subplots_adjust(right=0.75)\n", "\n", - " offset = 60\n", - " new_fixed_axis = par2.get_grid_helper().new_fixed_axis\n", - " par2.axis[\"right\"] = new_fixed_axis(loc=\"right\",\n", - " axes=par2,\n", - " offset=(offset, 0))\n", - " \n", - " par2.axis[\"right\"].toggle(all=True)\n", + "par1 = host.twinx()\n", + "par2 = host.twinx()\n", "\n", + "offset = 60\n", + "new_fixed_axis = par2.get_grid_helper().new_fixed_axis\n", + "par2.axis[\"right\"] = new_fixed_axis(loc=\"right\",\n", + " axes=par2,\n", + " offset=(offset, 0))\n", "\n", + "par2.axis[\"right\"].toggle(all=True)\n", "\n", - " host.set_xlim(0, 2)\n", - " host.set_ylim(0, 2)\n", + "host.set_xlim(0, 2)\n", + "host.set_ylim(0, 2)\n", "\n", - " host.set_xlabel(\"Distance\")\n", - " host.set_ylabel(\"Density\")\n", - " par1.set_ylabel(\"Temperature\")\n", - " par2.set_ylabel(\"Velocity\")\n", + "host.set_xlabel(\"Distance\")\n", + "host.set_ylabel(\"Density\")\n", + "par1.set_ylabel(\"Temperature\")\n", + "par2.set_ylabel(\"Velocity\")\n", "\n", - " p1, = host.plot([0, 1, 2], [0, 1, 2], label=\"Density\")\n", - " p2, = par1.plot([0, 1, 2], [0, 3, 2], label=\"Temperature\")\n", - " p3, = par2.plot([0, 1, 2], [50, 30, 15], label=\"Velocity\")\n", + "p1, = host.plot([0, 1, 2], [0, 1, 2], label=\"Density\")\n", + "p2, = par1.plot([0, 1, 2], [0, 3, 2], label=\"Temperature\")\n", + "p3, = par2.plot([0, 1, 2], [50, 30, 15], label=\"Velocity\")\n", "\n", - " par1.set_ylim(0, 4)\n", - " par2.set_ylim(1, 65)\n", + "par1.set_ylim(0, 4)\n", + "par2.set_ylim(1, 65)\n", "\n", - " host.legend()\n", + "host.legend()\n", "\n", - " host.axis[\"left\"].label.set_color(p1.get_color())\n", - " par1.axis[\"right\"].label.set_color(p2.get_color())\n", - " par2.axis[\"right\"].label.set_color(p3.get_color())\n", + "host.axis[\"left\"].label.set_color(p1.get_color())\n", + "par1.axis[\"right\"].label.set_color(p2.get_color())\n", + "par2.axis[\"right\"].label.set_color(p3.get_color())\n", "\n", - " plt.draw()\n", - " plt.show()\n", - "\n", - " #plt.savefig(\"Test\")\n" + "plt.show()\n" ] }, { @@ -184,26 +177,28 @@ }, "outputs": [], "source": [ - "%load http://matplotlib.org/mpl_toolkits/axes_grid/examples/demo_floating_axes.py" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ + "# %load http://matplotlib.org/mpl_toolkits/axes_grid/examples/demo_floating_axes.py\n", + "\"\"\"\n", + "Demo of the floating axes.\n", + "\n", + "This demo shows features of functions in floating_axes:\n", + " * Using scatter function and bar function with changing the\n", + " shape of the plot.\n", + " * Using GridHelperCurveLinear to rotate the plot and set the\n", + " boundary of the plot.\n", + " * Using FloatingSubplot to create a subplot using the return\n", + " value from GridHelperCurveLinear.\n", + " * Making sector plot by adding more features to GridHelperCurveLinear.\n", + "\"\"\"\n", "from matplotlib.transforms import Affine2D\n", - "\n", "import mpl_toolkits.axisartist.floating_axes as floating_axes\n", - "\n", "import numpy as np\n", "import mpl_toolkits.axisartist.angle_helper as angle_helper\n", "from matplotlib.projections import PolarAxes\n", - "from mpl_toolkits.axisartist.grid_finder import FixedLocator, MaxNLocator, \\\n", - " DictFormatter\n", + "from mpl_toolkits.axisartist.grid_finder import (FixedLocator, MaxNLocator,\n", + " DictFormatter)\n", + "import matplotlib.pyplot as plt\n", + "\n", "\n", "def setup_axes1(fig, rect):\n", " \"\"\"\n", @@ -211,7 +206,8 @@ " \"\"\"\n", " tr = Affine2D().scale(2, 1).rotate_deg(30)\n", "\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4))\n", + " grid_helper = floating_axes.GridHelperCurveLinear(\n", + " tr, extremes=(-0.5, 3.5, 0, 4))\n", "\n", " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", " fig.add_subplot(ax1)\n", @@ -229,9 +225,6 @@ " With custom locator and formatter.\n", " Note that the extreme values are swapped.\n", " \"\"\"\n", - "\n", - " #tr_scale = Affine2D().scale(np.pi/180., 1.)\n", - "\n", " tr = PolarAxes.PolarTransform()\n", "\n", " pi = np.pi\n", @@ -243,13 +236,12 @@ "\n", " grid_locator2 = MaxNLocator(2)\n", "\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", - " extremes=(.5*pi, 0, 2, 1),\n", - " grid_locator1=grid_locator1,\n", - " grid_locator2=grid_locator2,\n", - " tick_formatter1=tick_formatter1,\n", - " tick_formatter2=None,\n", - " )\n", + " grid_helper = floating_axes.GridHelperCurveLinear(\n", + " tr, extremes=(.5*pi, 0, 2, 1),\n", + " grid_locator1=grid_locator1,\n", + " grid_locator2=grid_locator2,\n", + " tick_formatter1=tick_formatter1,\n", + " tick_formatter2=None)\n", "\n", " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", " fig.add_subplot(ax1)\n", @@ -257,11 +249,11 @@ " # create a parasite axes whose transData in RA, cz\n", " aux_ax = ax1.get_aux_axes(tr)\n", "\n", - " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", - " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", - " # drawn twice, and possibly over some other\n", - " # artists. So, we decrease the zorder a bit to\n", - " # prevent this.\n", + " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", + " ax1.patch.zorder = 0.9 # but this has a side effect that the patch is\n", + " # drawn twice, and possibly over some other\n", + " # artists. So, we decrease the zorder a bit to\n", + " # prevent this.\n", "\n", " return ax1, aux_ax\n", "\n", @@ -286,13 +278,12 @@ "\n", " ra0, ra1 = 8.*15, 14.*15\n", " cz0, cz1 = 0, 14000\n", - " grid_helper = floating_axes.GridHelperCurveLinear(tr,\n", - " extremes=(ra0, ra1, cz0, cz1),\n", - " grid_locator1=grid_locator1,\n", - " grid_locator2=grid_locator2,\n", - " tick_formatter1=tick_formatter1,\n", - " tick_formatter2=None,\n", - " )\n", + " grid_helper = floating_axes.GridHelperCurveLinear(\n", + " tr, extremes=(ra0, ra1, cz0, cz1),\n", + " grid_locator1=grid_locator1,\n", + " grid_locator2=grid_locator2,\n", + " tick_formatter1=tick_formatter1,\n", + " tick_formatter2=None)\n", "\n", " ax1 = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)\n", " fig.add_subplot(ax1)\n", @@ -310,47 +301,37 @@ " ax1.axis[\"left\"].label.set_text(r\"cz [km$^{-1}$]\")\n", " ax1.axis[\"top\"].label.set_text(r\"$\\alpha_{1950}$\")\n", "\n", - "\n", " # create a parasite axes whose transData in RA, cz\n", " aux_ax = ax1.get_aux_axes(tr)\n", "\n", - " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", - " ax1.patch.zorder=0.9 # but this has a side effect that the patch is\n", - " # drawn twice, and possibly over some other\n", - " # artists. So, we decrease the zorder a bit to\n", - " # prevent this.\n", + " aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax\n", + " ax1.patch.zorder = 0.9 # but this has a side effect that the patch is\n", + " # drawn twice, and possibly over some other\n", + " # artists. So, we decrease the zorder a bit to\n", + " # prevent this.\n", "\n", " return ax1, aux_ax\n", "\n", "\n", + "##########################################################\n", + "fig = plt.figure(figsize=(8, 4))\n", + "fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95)\n", "\n", - "if 1:\n", - " import matplotlib.pyplot as plt\n", - " fig = plt.figure(1, figsize=(8, 4))\n", - " fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95)\n", - "\n", - " ax1, aux_ax2 = setup_axes1(fig, 131)\n", - " aux_ax2.bar([0, 1, 2, 3], [3, 2, 1, 3])\n", - " \n", - " #theta = np.random.rand(10) #*.5*np.pi\n", - " #radius = np.random.rand(10) #+1.\n", - " #aux_ax1.scatter(theta, radius)\n", - "\n", - "\n", - " ax2, aux_ax2 = setup_axes2(fig, 132)\n", - "\n", - " theta = np.random.rand(10)*.5*np.pi\n", - " radius = np.random.rand(10)+1.\n", - " aux_ax2.scatter(theta, radius)\n", + "ax1, aux_ax1 = setup_axes1(fig, 131)\n", + "aux_ax1.bar([0, 1, 2, 3], [3, 2, 1, 3])\n", "\n", + "ax2, aux_ax2 = setup_axes2(fig, 132)\n", + "theta = np.random.rand(10)*.5*np.pi\n", + "radius = np.random.rand(10) + 1.\n", + "aux_ax2.scatter(theta, radius)\n", "\n", - " ax3, aux_ax3 = setup_axes3(fig, 133)\n", + "ax3, aux_ax3 = setup_axes3(fig, 133)\n", "\n", - " theta = (8 + np.random.rand(10)*(14-8))*15. # in degrees\n", - " radius = np.random.rand(10)*14000.\n", - " aux_ax3.scatter(theta, radius)\n", + "theta = (8 + np.random.rand(10)*(14 - 8))*15. # in degrees\n", + "radius = np.random.rand(10)*14000.\n", + "aux_ax3.scatter(theta, radius)\n", "\n", - " plt.show()" + "plt.show()\n" ] }, { From f90363554e34c3dce7aea8d47bec6dc55af9254e Mon Sep 17 00:00:00 2001 From: Tobias Megies Date: Mon, 9 Apr 2018 15:43:25 +0200 Subject: [PATCH 35/61] Delete .example_utils.py.swo This is a vim swap file added unintentionally. --- examples/.example_utils.py.swo | Bin 4096 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/.example_utils.py.swo diff --git a/examples/.example_utils.py.swo b/examples/.example_utils.py.swo deleted file mode 100644 index 60e318fa2fe75abbd00f00fbf91b2f3690cf3e68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmYc?2=nw+FxN9-00IF92Afq=LIoOLF*zzTFl6PYr51t234rAMqP(P{)Wj45>hx0* zOA_^cE1mOGQuPz_5=)Hq9f4$iZl!;kZ(>P7PJT&FW|Dq>Nk(dseriQxZb43Jd}&E$ zPO)A=B>}TXrAI?xGz18R055~Fk)Z)dm9mneg0N61Aq}JQqaiRF0;3@?8UmvsFd71* QAut*OqaiRF0>dZ-02qWMwg3PC From 66308a9afe8fd9f9d236d4f739a634a01dd43d1b Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 3 Jun 2018 21:32:12 -0500 Subject: [PATCH 36/61] DOC: edits to Part 1 - changes to the backend discussion - formatting changes - add color mapping to scatter up front --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 158 +++++++----------- 1 file changed, 65 insertions(+), 93 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index 94e0cc2..f06de9e 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -1,20 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "# Let printing work the same in Python 2 and 3\n", - "from __future__ import print_function" - ] - }, { "cell_type": "markdown", "metadata": { @@ -25,7 +10,13 @@ "source": [ "# Matplotlib\n", "## Introduction\n", - "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the beginning to serve two purposes. First, allow for interactive, cross-platform control of figures and plots, and second, to make it very easy to produce static raster or vector graphics files without the need for any GUIs. Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system." + "\n", + "Matplotlib is a library for producing publication-quality figures. mpl (for short) was designed from the beginning to serve two purposes: \n", + "\n", + " 1. allow for interactive, cross-platform control of figures and plots\n", + " 2. make it easy to produce static raster or vector graphics files without the need for any GUIs. \n", + " \n", + "Furthermore, mpl -- much like Python itself -- gives the developer complete control over the appearance of their plots, while still being very usable through a powerful defaults system." ] }, { @@ -33,17 +24,19 @@ "metadata": {}, "source": [ "## Online Documentation\n", - "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains [examples](http://matplotlib.org/examples/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and, most importantly, the [gallery](http://matplotlib.org/gallery.html).\n", + "The [matplotlib.org](http://matplotlib.org) project website is the primary online resource for the library's documentation. It contains the [example galleries](https://matplotlib.org/gallery/index.html), [FAQs](http://matplotlib.org/faq/index.html), [API documentation](http://matplotlib.org/api/index.html), and [tutorials](https://matplotlib.org/tutorials/index.html).\n", "\n", "## Gallery\n", - "Many users of Matplotlib are often faced with the question, \"I want to make a figure that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query! This is why the [gallery](http://matplotlib.org/gallery.html) is so useful, because it showcases the variety of ways one can make figures. Browse through the gallery, click on any figure that has pieces of what you want to see and the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", + "Many users of Matplotlib are often faced with the question, \"I want to make a figure that has X with Y in the same figure, but it needs to look like Z\". Good luck getting an answer from a web search with that query! This is why the [gallery](https://matplotlib.org/gallery/index.html) is so useful, because it showcases the variety of ways one can make figures. Browse through the gallery, click on any figure that has pieces of what you want to see and the code that generated it. Soon enough, you will be like a chef, mixing and matching components to produce your masterpiece!\n", "\n", "As always, if you have a new and interesting plot that demonstrates a feature of Matplotlib, feel free to submit a concise, well-commented version of the code for inclusion in the gallery.\n", "\n", - "## Mailing Lists and StackOverflow\n", - "When you are just simply stuck, and cannot figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](https://mail.python.org/mailman/listinfo/matplotlib-users). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. The number one rule to remember with this list is to be persistant. While many questions do get answered fairly quickly, some do fall through the cracks, or the one person who knows the answer isn't available. Therefore, try again with your questions rephrased, or with a plot showing your attempts so far. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "## Mailing Lists, StackOverflow, and gitter\n", + "When you are just simply stuck, and cannot figure out how to get something to work, or just need some hints on how to get started, you will find much of the community at the matplotlib-users [mailing list](https://mail.python.org/mailman/listinfo/matplotlib-users). This mailing list is an excellent resource of information with many friendly members who just love to help out newcomers. We love plots, so an image showing what is wrong often gets the quickest responses.\n", + "\n", + "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too! \n", "\n", - "Another community resource is [StackOverflow](http://stackoverflow.com/questions/tagged/matplotlib), so if you need to build up karma points, submit your questions here, and help others out too! We are also on [Gitter](https://gitter.im/matplotlib/matplotlib).\n", + "We are also on [Gitter](https://gitter.im/matplotlib/matplotlib).\n", "\n", "## Github repository\n", "### Location\n", @@ -58,15 +51,16 @@ "metadata": {}, "source": [ "# Quick note on \"backends\" and Jupyter notebooks\n", - "Matplotlib has multiple backends. The backends allow mpl to be used on a variety of platforms with a variety of GUI toolkits (GTK, Qt, Wx, etc.), all of them written so that most of the time, you will not need to care which backend you are using. " + "\n", + "Matplotlib has multiple \"backends\" that handle converting Matplotlib's in-memory representation of your plot into the colorful output you can look at. This is either by writing files (ex png, svg, pdf) thaht ou can use an external tool to look at or by embedding into your GUI toolkit of choice (Qt, Tk, Wx, etc).\n", + "\n", + "To check what backend Matplotlib is currently using:" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib\n", @@ -78,32 +72,32 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Normally we wouldn't need to think about this too much, but IPython/Jupyter notebooks behave a touch differently than \"normal\" python.\n", - "\n", - "Inside of IPython, it's often easiest to use the Jupyter ``nbagg`` or ``notebook`` backend. This allows plots to be displayed and interacted with in the browser in a Jupyter notebook. Otherwise, figures will pop up in a separate GUI window.\n", - "\n", - "We can do this in two ways:\n", - "\n", - "1. The IPython ``%matplotlib backend_name`` \"magic\" command (or ``plt.ion()``, which behaves similarly)\n", - " - Figures will be shown automatically by IPython, even if you don't call ``plt.show()``.\n", - " \n", - "2. ``matplotlib.use(\"backend_name\")``\n", - " - Figures will only be shown when you call ``plt.show()``.\n", - "\n", - "Here, we'll use the second method for one simple reason: it allows our code to behave the same way regardless of whether we run it inside of an Jupyter notebook or from a python script at the command line. Feel free to use the ``%matplotlib`` magic command if you'd prefer.\n", + "If you are working interactively at an (I)python prompt, the GUI framework is not critical (mostly aesthetic) however when working in Jupyter we need to pick a backend that integrates with Jupyter (javascript) framework.\n", "\n", - "One final note: You will always need to do this before you ``import matplotlib.pyplot as plt``." + "To select the backend use ``matplotlib.use(\"backend_name\")``, in this case we want ``'nbagg'``\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ - "matplotlib.use('nbagg')" + "matplotlib.use('nbagg')\n", + "print(matplotlib.get_backend())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "which must be done *before* you `import matplotlib.pyplot as plt`.\n", + "\n", + "You can also set the backend via a 'magic ``%matplotlib backend_name``. In addition to setting the backend, the magic also calls `plt.ion()`, which puts Matplotlib in 'interacitve mode' (the inverse is `plt.ioff()`). In 'interactive mode' figures are shown (injected into the web page in the notebook) as soon as they are created. Otherwise, figures are not shown until you explicitly call `plt.show()`.\n", + "\n", + "\n", + "In these tutorials we will mostly work in non-interactive mode for better control of when\n", + "figures are shown in the notebooks." ] }, { @@ -138,9 +132,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -159,12 +151,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ - "fig = plt.figure()" + "fig = plt.figure(facecolor=(1, 0, 0, .1)) # red background to see where the figure is" ] }, { @@ -179,9 +169,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "plt.show()" @@ -193,6 +181,7 @@ "source": [ "Great, a blank figure! Not terribly useful yet.\n", "\n", + "\n", "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", "\n", "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" @@ -201,13 +190,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Twice as tall as it is wide:\n", - "fig = plt.figure(figsize=plt.figaspect(2.0))\n", + "fig = plt.figure(figsize=plt.figaspect(2.0), facecolor=(1, 0, 0, .1))\n", "plt.show()" ] }, @@ -227,9 +214,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig = plt.figure()\n", @@ -254,16 +239,15 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "ax.set_xlim([0.5, 4.5])\n", "ax.set_ylim([-2, 8])\n", - "ax.set_title('An Example Axes')\n", - "ax.set_ylabel('Y-Axis')\n", - "ax.set_xlabel('X-Axis')" + "ax.set_title('An Diferent Example Axes Tile')\n", + "ax.set_ylabel('Y-Axis (changed)')\n", + "ax.set_xlabel('X-Axis (changed)')\n", + "fig.canvas.draw_idle()" ] }, { @@ -295,15 +279,13 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], c=[1 ,2, 3, 5], marker='^')\n", "ax.set_xlim(0.5, 4.5)\n", "plt.show()" ] @@ -320,13 +302,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')\n", + "plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], c=[1, 2, 3, 5], marker='^')\n", "plt.xlim(0.5, 4.5)\n", "plt.show()" ] @@ -335,7 +315,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Much cleaner, and much clearer! So, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", + "That is a bit terser and has fewer local varialbes, so, why will most of my examples not follow the pyplot approach? Because [PEP20](http://www.python.org/dev/peps/pep-0020/) \"The Zen of Python\" says:\n", "\n", "\"Explicit is better than implicit\"\n", "\n", @@ -358,9 +338,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, axes = plt.subplots(nrows=2, ncols=2)\n", @@ -381,9 +359,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, axes = plt.subplots(nrows=2, ncols=2)\n", @@ -441,9 +417,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%load exercises/1.1-subplots_and_basic_plotting.py" @@ -452,9 +426,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -473,23 +445,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From dba20c6357cf470b2e8c83601d18f0b65f9c12c1 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 3 Jun 2018 22:17:48 -0500 Subject: [PATCH 37/61] ENH: switch problem 2.2 away from classic style --- .../2.2-vmin_vmax_imshow_and_colorbars.py | 2 -- ...ise_2.2-vmin_vmax_imshow_and_colorbars.png | Bin 13142 -> 53155 bytes .../2.2-vmin_vmax_imshow_and_colorbars.py | 1 - 3 files changed, 3 deletions(-) diff --git a/exercises/2.2-vmin_vmax_imshow_and_colorbars.py b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py index 0b504f2..4922fb3 100644 --- a/exercises/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/exercises/2.2-vmin_vmax_imshow_and_colorbars.py @@ -2,8 +2,6 @@ import matplotlib.pyplot as plt np.random.seed(1) -plt.style.use('classic') - # Generate random data with different ranges... data1 = np.random.random((10, 10)) data2 = 2 * np.random.random((10, 10)) diff --git a/images/exercise_2.2-vmin_vmax_imshow_and_colorbars.png b/images/exercise_2.2-vmin_vmax_imshow_and_colorbars.png index 66aaa3e81c511ba8d34181bb792fea87b70df5a9..45db4d946dd07594e8cabf4d74ccf51a64230ee6 100644 GIT binary patch literal 53155 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�r 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 literal 13142 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 T+FLmM2gA-;oF$yOa_7GRGuw)! diff --git a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py index da67e7b..2bc76a8 100644 --- a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py @@ -2,7 +2,6 @@ import matplotlib.pyplot as plt np.random.seed(1) -plt.style.use('classic') # Generate random data with different ranges... data1 = np.random.random((10, 10)) From dd049413394af0f2884e66ae015edea2c041028b Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 3 Jun 2018 22:36:46 -0500 Subject: [PATCH 38/61] DOC: minor edits do data kwarg discussion + code style + links --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 80 +++++++------------ 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index b354ba0..6ab58e8 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -47,9 +47,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Let's get our standard imports out of the way\n", @@ -77,9 +75,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "np.random.seed(1)\n", @@ -111,9 +107,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -147,9 +141,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "np.random.seed(1)\n", @@ -171,9 +163,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "x = np.linspace(0, 10, 200)\n", @@ -197,7 +187,8 @@ "metadata": {}, "source": [ "## `data` keyword argument\n", - "When using specialized data structures such as Pandas DataFrame and XArray, the input data to be plotted are accessed like dictionary elements. This can get very repetitive and tedious as one types out a plotting command accessing those elements. So, the `data` keyword argument was added to many of the plotting functions in v1.5. With this feature, one can pass in a single dictionary-like object as `data`, and use the string key names in the place of the usual input data arguments.\n", + "\n", + "When using nested data structures such as h5py objects, Pandas DataFrames, or XArrays, the data can be accessed via `[]` like dictionary elements. This can get very repetitive and tedious as one types out a plotting command accessing those elements. So, the `data` keyword argument was added to almost all of the plotting functions in v1.5. With this feature, one can pass in a single dictionary-like object as `data`, and use the string key names in the place of the usual input data arguments.\n", "\n", "Let's revisit the above example:" ] @@ -205,9 +196,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "x = np.linspace(0, 10, 200)\n", @@ -242,9 +231,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%load exercises/2.1-bar_and_fill_between.py" @@ -253,9 +240,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -316,9 +301,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from matplotlib.cbook import get_sample_data\n", @@ -342,9 +325,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -377,22 +358,22 @@ " \n", "`vmin` and `vmax` are particularly useful. Quite often, you'll want the colors to be mapped to a set range of data values, which aren't the min/max of your input data. For example, you might want a symmetric ranges of values around 0.\n", "\n", - "As an example of that, let's use a divergent colormap with the data we showed earlier. We'll also use `interpolation=\"nearest\"` to \"turn off\" interpolation of the cells in the input dataset:" + "See the documentation for longer discussions of [colormaps](https://matplotlib.org/tutorials/colors/colormaps.html) and [norms](https://matplotlib.org/tutorials/colors/colormapnorms.html).\n", + "\n", + "As an example of that, let's use a divergent colormap with the data we showed earlier. " ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from matplotlib.cbook import get_sample_data\n", "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", "\n", "fig, ax = plt.subplots()\n", - "im = ax.imshow(data, cmap='seismic', interpolation='nearest')\n", + "im = ax.imshow(data, cmap='seismic')\n", "fig.colorbar(im)\n", "plt.show()" ] @@ -407,13 +388,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", - "im = ax.imshow(data, cmap='seismic', interpolation='nearest',\n", + "im = ax.imshow(data, \n", + " cmap='seismic',\n", " vmin=-2, vmax=2)\n", "fig.colorbar(im)\n", "plt.show()" @@ -434,9 +414,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%load exercises/2.2-vmin_vmax_imshow_and_colorbars.py" @@ -445,9 +423,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", @@ -472,23 +448,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From 7ced77a0a6654a8c474f363813eb9c50a4da2d2e Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 3 Jun 2018 23:11:22 -0500 Subject: [PATCH 39/61] DOC: tweak comments about color --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 105 ++++++------------ 1 file changed, 36 insertions(+), 69 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 8afa98f..5c572bf 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -3,14 +3,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# Let printing work the same in Python 2 and 3\n", "from __future__ import print_function\n", - "# Turning on inline plots -- just for use in jupyter notebooks.\n", + "# Turning on notebook plots -- just for use in jupyter notebooks.\n", "import matplotlib\n", "matplotlib.use('nbagg')\n", "import numpy as np\n", @@ -45,23 +43,26 @@ "- k: black\n", "- w: white\n", "\n", - "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. For the British speaking and poor spellers among us (I am not implying that British speakers are poor spellers!), we allow \"grey\" where-ever \"gray\" appears in that list of colornames. All of these colornames are case-insensitive.\n", + "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. \n", + "\n", + "Matplotlib supports the [xkcd color names](https://xkcd.com/color/rgb/) prefxed by `'xkcd:'`.\n", + "\n", + "Matplotlib also understands `{'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}` which are the Tableau Colors from the ‘T10’ categorical palette (and the default color cycle);\n", "\n", "### Hex values\n", "Colors can also be specified by supplying a HTML/CSS hex string, such as `'#0000FF'` for blue. Support for an optional alpha channel was added for v2.0.\n", "\n", - "### 256 Shades of Gray\n", - "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a light shade of gray.\n", + "### Cycle references\n", + "With the advent of fancier color cycles coming from the many available styles, users needed a way to reference those colors in the style without explicitly knowing what they are. So, in v2.0, the ability to reference the first 10 iterations of the color cycle was added. Whereever one could specify a color, you can supply a 2 character string of 'C#'. So, 'C0' would be the first color, 'C1' would be the second, and so on and so forth up to 'C9'.\n", + "\n", "\n", "### RGB[A] tuples\n", - "You may come upon instances where the previous ways of specifying colors do not work. This can sometimes happen in some of the deeper, stranger levels of the library. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", + "You may come upon instances where the previous ways of specifying colors do not work. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", "\n", "In functions such as `plot()` and `scatter()`, while it may appear that they can take a color specification, what they really need is a \"format specification\", which includes color as part of the format. Unfortunately, such specifications are string only and so RGB[A] tuples are not supported for such arguments (but you can still pass an RGB[A] tuple for a \"color\" argument).\n", "\n", "Oftentimes there is a separate argument for \"alpha\" where-ever you can specify a color. The value for \"alpha\" will usually take precedence over the alpha value in the RGBA tuple. There is no easy way around this inconsistency.\n", - "\n", - "### Cycle references\n", - "With the advent of fancier color cycles coming from the many available styles, users needed a way to reference those colors in the style without explicitly knowing what they are. So, in v2.0, the ability to reference the first 10 iterations of the color cycle was added. Whereever one could specify a color, you can supply a 2 character string of 'C#'. So, 'C0' would be the first color, 'C1' would be the second, and so on and so forth up to 'C9'." + "\n" ] }, { @@ -75,20 +76,16 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ - "%load exercises/3.1-colors.py" + "%load exercises/3.1-colors.py\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t = np.arange(0.0, 5.0, 0.2)\n", @@ -119,9 +116,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "xs, ys = np.mgrid[:4, 9:0:-1]\n", @@ -151,9 +146,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%load exercises/3.2-markers.py" @@ -162,9 +155,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t = np.arange(0.0, 5.0, 0.2)\n", @@ -195,9 +186,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t = np.arange(0.0, 5.0, 0.2)\n", @@ -215,9 +204,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots(1, 1)\n", @@ -236,9 +223,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t = np.arange(0., 5., 0.2)\n", @@ -284,9 +269,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%load exercises/3.3-properties.py" @@ -295,9 +278,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "t = np.arange(0.0, 5.0, 0.1)\n", @@ -323,9 +304,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# %load http://matplotlib.org/mpl_examples/color/colormaps_reference.py\n", @@ -434,9 +413,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "fig, (ax1, ax2) = plt.subplots(1, 2)\n", @@ -457,9 +434,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "plt.scatter([1, 2, 3, 4], [4, 3, 2, 1])\n", @@ -505,9 +480,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", @@ -532,9 +505,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "mpl.rc('axes', prop_cycle=cycler('color', ['r', 'orange', 'c', 'y']) +\n", @@ -575,9 +546,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib\n", @@ -594,9 +563,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", @@ -624,23 +591,23 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From 4c404e76737a2c756c72c52d4dda0528c07cfe5a Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 20:55:56 -0400 Subject: [PATCH 40/61] Adding notes on testing the tutorial install --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee93428..9493e3f 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,5 @@ git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git cd AnatomyOfMatplotlib jupyter notebook ``` +A browser window should appear and you can verify that everything works as expected by clicking on the `Test Install.ipynb` notebook. There, you will see a "code cell" that you can execute. Run it, and you should see a very simple line plot, indicating that all is well. From b3e3bea7a93fb09b32c6d446716bff10b5a085ea Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 20:58:55 -0400 Subject: [PATCH 41/61] Update links in readme.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9493e3f..3cb647b 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ Please fork and contribute back improvements! Feel free to use this tutorial for conferences and other opportunities for training. The tutorial can be viewed on [nbviewer](http://nbviewer.jupyter.org): -* [Part 0: Introduction To NumPy](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb) -* [Part 1: Overview of Matplotlib](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb) -* [Part 2: Plotting Methods](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb) -* [Part 3: How To Speak MPL](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb) -* [Part 4: Limits, Legends, and Layouts](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb) -* [Part 5: Artists](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) -* [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) +* [Part 0: Introduction To NumPy](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb) +* [Part 1: Overview of Matplotlib](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb) +* [Part 2: Plotting Methods](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb) +* [Part 3: How To Speak MPL](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb) +* [Part 4: Limits, Legends, and Layouts](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb) +* [Part 5: Artists](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) +* [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) # Installation All you need is matplotlib (v1.5 or greater) and jupyter installed. From 9c61c2eca882774cd8b8c8a06d8340e40d1c9bb2 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 21:01:29 -0400 Subject: [PATCH 42/61] Update README.md I swear, this is the last remnant of the WeatherGod repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cb647b..726412c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ You can use your favorite Python package installer for this: ```bash conda install matplotlib jupyter -git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git +git clone https://github.com/matplotlib/AnatomyOfMatplotlib.git cd AnatomyOfMatplotlib jupyter notebook ``` From 206a25bd64a76e21238082c8115cca8d25d04c2a Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 20:55:56 -0400 Subject: [PATCH 43/61] Adding notes on testing the tutorial install --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee93428..9493e3f 100644 --- a/README.md +++ b/README.md @@ -26,4 +26,5 @@ git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git cd AnatomyOfMatplotlib jupyter notebook ``` +A browser window should appear and you can verify that everything works as expected by clicking on the `Test Install.ipynb` notebook. There, you will see a "code cell" that you can execute. Run it, and you should see a very simple line plot, indicating that all is well. From 7128e50033c9ca47d8506deb8f5e3a5cc31b6cf9 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 20:58:55 -0400 Subject: [PATCH 44/61] Update links in readme.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9493e3f..3cb647b 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ Please fork and contribute back improvements! Feel free to use this tutorial for conferences and other opportunities for training. The tutorial can be viewed on [nbviewer](http://nbviewer.jupyter.org): -* [Part 0: Introduction To NumPy](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb) -* [Part 1: Overview of Matplotlib](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb) -* [Part 2: Plotting Methods](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb) -* [Part 3: How To Speak MPL](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb) -* [Part 4: Limits, Legends, and Layouts](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb) -* [Part 5: Artists](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) -* [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/WeatherGod/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) +* [Part 0: Introduction To NumPy](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part0-Intro2NumPy.ipynb) +* [Part 1: Overview of Matplotlib](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb) +* [Part 2: Plotting Methods](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb) +* [Part 3: How To Speak MPL](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb) +* [Part 4: Limits, Legends, and Layouts](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb) +* [Part 5: Artists](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part5-Artists.ipynb) +* [Part 6: mpl_toolkits](http://nbviewer.jupyter.org/github/matplotlib/AnatomyOfMatplotlib/blob/master/AnatomyOfMatplotlib-Part6-mpl_toolkits.ipynb) # Installation All you need is matplotlib (v1.5 or greater) and jupyter installed. From 8c0fa6f65c50271300c317bb9fa9981bb5b20da5 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 13 Jun 2018 21:01:29 -0400 Subject: [PATCH 45/61] Update README.md I swear, this is the last remnant of the WeatherGod repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cb647b..726412c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ You can use your favorite Python package installer for this: ```bash conda install matplotlib jupyter -git clone https://github.com/WeatherGod/AnatomyOfMatplotlib.git +git clone https://github.com/matplotlib/AnatomyOfMatplotlib.git cd AnatomyOfMatplotlib jupyter notebook ``` From 5d4d1ee485572c650f30ac40c1929ccf74e2c87e Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 27 Jun 2018 21:06:17 -0400 Subject: [PATCH 46/61] Some copy-editing, and putting backa from __future__ that was taken out --- ...b-Part1-Figures_Subplots_and_layouts.ipynb | 28 +++++++++++++++---- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 4 ++- exercises/1.1-subplots_and_basic_plotting.py | 2 -- solutions/1.1-subplots_and_basic_plotting.py | 2 -- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index f06de9e..efa6b8a 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -1,5 +1,20 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "-" + } + }, + "outputs": [], + "source": [ + "# Let printing work the same in Python 2 and 3\n", + "from __future__ import print_function" + ] + }, { "cell_type": "markdown", "metadata": { @@ -52,7 +67,7 @@ "source": [ "# Quick note on \"backends\" and Jupyter notebooks\n", "\n", - "Matplotlib has multiple \"backends\" that handle converting Matplotlib's in-memory representation of your plot into the colorful output you can look at. This is either by writing files (ex png, svg, pdf) thaht ou can use an external tool to look at or by embedding into your GUI toolkit of choice (Qt, Tk, Wx, etc).\n", + "Matplotlib has multiple \"backends\" that handle converting Matplotlib's in-memory representation of your plot into the colorful output you can look at. This is done either by writing files (e.g., png, svg, pdf) that you can use an external tool to look at or by embedding into your GUI toolkit of choice (Qt, Tk, Wx, etc).\n", "\n", "To check what backend Matplotlib is currently using:" ] @@ -93,11 +108,12 @@ "source": [ "which must be done *before* you `import matplotlib.pyplot as plt`.\n", "\n", - "You can also set the backend via a 'magic ``%matplotlib backend_name``. In addition to setting the backend, the magic also calls `plt.ion()`, which puts Matplotlib in 'interacitve mode' (the inverse is `plt.ioff()`). In 'interactive mode' figures are shown (injected into the web page in the notebook) as soon as they are created. Otherwise, figures are not shown until you explicitly call `plt.show()`.\n", + "You can also set the backend via an 'ipython magic' ``%matplotlib backend_name``. In addition to setting the backend, the magic also calls `plt.ion()`, which puts Matplotlib in 'interacitve mode' (the inverse is `plt.ioff()`). In 'interactive mode' figures are shown (injected into the web page in the notebook) as soon as they are created. Otherwise, figures are not shown until you explicitly call `plt.show()`.\n", "\n", "\n", "In these tutorials we will mostly work in non-interactive mode for better control of when\n", - "figures are shown in the notebooks." + "figures are shown in the notebooks.\n", + "This also better mimics the behavior you can expect in regular python scripts.\n" ] }, { @@ -244,10 +260,10 @@ "source": [ "ax.set_xlim([0.5, 4.5])\n", "ax.set_ylim([-2, 8])\n", - "ax.set_title('An Diferent Example Axes Tile')\n", + "ax.set_title('A Different Example Axes Title')\n", "ax.set_ylabel('Y-Axis (changed)')\n", "ax.set_xlabel('X-Axis (changed)')\n", - "fig.canvas.draw_idle()" + "plt.show()" ] }, { @@ -285,7 +301,7 @@ "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)\n", - "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], c=[1 ,2, 3, 5], marker='^')\n", + "ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], c=[1, 2, 3, 5], marker='^')\n", "ax.set_xlim(0.5, 4.5)\n", "plt.show()" ] diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 5c572bf..5f7c0e7 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -52,10 +52,12 @@ "### Hex values\n", "Colors can also be specified by supplying a HTML/CSS hex string, such as `'#0000FF'` for blue. Support for an optional alpha channel was added for v2.0.\n", "\n", + "### 256 Shades of Gray\n", + "A gray level can be given instead of a color by passing a string representation of a number between 0 and 1, inclusive. `'0.0'` is black, while `'1.0'` is white. `'0.75'` would be a light shade of gray.\n", + "\n", "### Cycle references\n", "With the advent of fancier color cycles coming from the many available styles, users needed a way to reference those colors in the style without explicitly knowing what they are. So, in v2.0, the ability to reference the first 10 iterations of the color cycle was added. Whereever one could specify a color, you can supply a 2 character string of 'C#'. So, 'C0' would be the first color, 'C1' would be the second, and so on and so forth up to 'C9'.\n", "\n", - "\n", "### RGB[A] tuples\n", "You may come upon instances where the previous ways of specifying colors do not work. When all else fails, the universal language of colors for matplotlib is the RGB[A] tuple. This is the \"Red\", \"Green\", \"Blue\", and sometimes \"Alpha\" tuple of floats in the range of [0, 1]. One means full saturation of that channel, so a red RGBA tuple would be `(1.0, 0.0, 0.0, 1.0)`, whereas a partly transparent green RGBA tuple would be `(0.0, 1.0, 0.0, 0.75)`. The documentation will usually specify whether it accepts RGB or RGBA tuples. Sometimes, a list of tuples would be required for multiple colors, and you can even supply a Nx3 or Nx4 numpy array in such cases.\n", "\n", diff --git a/exercises/1.1-subplots_and_basic_plotting.py b/exercises/1.1-subplots_and_basic_plotting.py index 1e4df45..1ff79ca 100644 --- a/exercises/1.1-subplots_and_basic_plotting.py +++ b/exercises/1.1-subplots_and_basic_plotting.py @@ -1,8 +1,6 @@ import numpy as np import matplotlib.pyplot as plt -plt.style.use('classic') - # Try to reproduce the figure shown in images/exercise_1-1.png # Our data... diff --git a/solutions/1.1-subplots_and_basic_plotting.py b/solutions/1.1-subplots_and_basic_plotting.py index cd23241..4a641d6 100644 --- a/solutions/1.1-subplots_and_basic_plotting.py +++ b/solutions/1.1-subplots_and_basic_plotting.py @@ -1,8 +1,6 @@ import numpy as np import matplotlib.pyplot as plt -plt.style.use('classic') - x = np.linspace(0, 10, 100) y1, y2, y3 = np.cos(x), np.cos(x + 1), np.cos(x + 2) names = ['Signal 1', 'Signal 2', 'Signal 3'] From 35928df99733fbb04fa893caa29a16feb0302233 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Wed, 27 Jun 2018 21:42:52 -0400 Subject: [PATCH 47/61] Fix typo in statistical example image. * Plus, moved away from deprecated "normed" kwarg --- examples/statistical_example.py | 4 ++-- images/statistical_example.png | Bin 29378 -> 26680 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/statistical_example.py b/examples/statistical_example.py index f3e46a5..c98add8 100644 --- a/examples/statistical_example.py +++ b/examples/statistical_example.py @@ -19,7 +19,7 @@ def main(): boxplot(axes[1], dists, colors) violinplot(axes[2], dists, colors) - example_utils.title(fig, 'hist/boxplot/violinplot: Stastical plotting', + example_utils.title(fig, 'hist/boxplot/violinplot: Statistical plotting', y=0.9) fig.savefig('statistical_example.png', facecolor='none') @@ -39,7 +39,7 @@ def hist(ax, dists, colors): # each distribution separately so they'll overlap and turn on transparency ax.set_color_cycle(colors) for dist in dists: - ax.hist(dist, bins=20, normed=True, edgecolor='none', alpha=0.5) + ax.hist(dist, bins=20, density=True, edgecolor='none', alpha=0.5) ax.margins(y=0.05) ax.set_ylim(bottom=0) diff --git a/images/statistical_example.png b/images/statistical_example.png index 02ee0300a5fd7cdc5bf978fb1f87b95786b00dda..cc398d621c0ebf43360ff8aad2359321d6291bf4 100644 GIT binary patch literal 26680 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 Date: Mon, 9 Jul 2018 17:21:52 -0400 Subject: [PATCH 48/61] Fix some typos in part3 and a dead link --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 5f7c0e7..d7bbf0e 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -43,7 +43,7 @@ "- k: black\n", "- w: white\n", "\n", - "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](http://www.w3schools.com/html/html_colornames.asp) of the 147 colornames. \n", + "Other colornames that are allowed are the HTML/CSS colornames such as \"burlywood\" and \"chartreuse\". See the [full list](https://www.w3schools.com/Colors/colors_names.asp) of the 140 color names. \n", "\n", "Matplotlib supports the [xkcd color names](https://xkcd.com/color/rgb/) prefxed by `'xkcd:'`.\n", "\n", @@ -112,7 +112,7 @@ "1 | tickright ||5 | caretright ||\">\" | triangle_right||\"4\" | tri_right\n", "2 | tickup ||6 | caretup ||\"^\" | triangle_up ||\"2\" | tri_up\n", "3 | tickdown ||7 | caretdown ||\"v\" | triangle_down ||\"1\" | tri_down\n", - "\"None\" | nothing ||`None` | nothing ||\" \" | nothing ||\"\" | nothing" + "\"None\" | nothing ||`None` | default ||\" \" | nothing ||\"\" | nothing" ] }, { @@ -128,7 +128,7 @@ " \"octagon\", \"square\", \"pentagon\", \"star\", \"vertical bar\", \"horizontal bar\", \"hexagon 1\", \"hexagon 2\",\n", " \"tick left\", \"caret left\", \"triangle left\", \"tri left\", \"tick right\", \"caret right\", \"triangle right\", \"tri right\",\n", " \"tick up\", \"caret up\", \"triangle up\", \"tri up\", \"tick down\", \"caret down\", \"triangle down\", \"tri down\",\n", - " \"Nothing\", \"Nothing\", \"Nothing\", \"Nothing\"]\n", + " \"Nothing\", \"default\", \"Nothing\", \"Nothing\"]\n", "fig, ax = plt.subplots(1, 1, figsize=(7.5, 4))\n", "for x, y, m, d in zip(xs.T.flat, ys.T.flat, markers, descripts):\n", " ax.scatter(x, y, marker=m, s=100)\n", From 7fc0e25fadd477c4138979ffc5b522fcacf4c146 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 9 Jul 2018 17:41:40 -0400 Subject: [PATCH 49/61] Updated link for tick_params and added a bit about categoricals --- AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index 534fc87..c62c8c4 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -288,7 +288,7 @@ "* A Tick Label is the text that is displayed at that tick.\n", "* A [`Ticker`](http://matplotlib.org/api/ticker_api.html#module-matplotlib.ticker) automatically determines the ticks for an Axis and formats the tick labels.\n", "\n", - "[`tick_params()`](http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params) is often used to help configure your tickers." + "[`tick_params()`](https://matplotlib.org/api/axes_api.html#ticks-and-tick-labels) is often used to help configure your tickers." ] }, { @@ -317,7 +317,7 @@ "source": [ "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", " \n", - "Currently, the easiest way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category.\n", + "Currently, the most reliable way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category. There are some new approaches that work in newer versions of mpl, but the developers are still working out the details of how it should work. In the meantime, \"faking\" the values is the most reliable.\n", "\n", "For example:" ] From 681b78a9e329f2680ae8a812944ad70d6e8b36c7 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 9 Jul 2018 17:56:03 -0400 Subject: [PATCH 50/61] Fix some links in Part 5, and a bare zip() in a solution --- AnatomyOfMatplotlib-Part5-Artists.ipynb | 4 ++-- solutions/5.1-goldstar.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AnatomyOfMatplotlib-Part5-Artists.ipynb b/AnatomyOfMatplotlib-Part5-Artists.ipynb index c52cd26..4da8545 100644 --- a/AnatomyOfMatplotlib-Part5-Artists.ipynb +++ b/AnatomyOfMatplotlib-Part5-Artists.ipynb @@ -161,7 +161,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To see what properties are set for an artist, use [`getp()`](http://matplotlib.org/api/artist_api.html#matplotlib.artist.getp)" + "To see what properties are set for an artist, use [`getp()`](https://matplotlib.org/api/artist_api.html#functions)" ] }, { @@ -182,7 +182,7 @@ "metadata": {}, "source": [ "# Collections\n", - "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](http://matplotlib.org/api/artist_api.html#matplotlib.patches.Circle) objects all with the same color, size, and edge width. Individual property values for artists in the collection can also be set (in some cases)." + "In addition to the Figure and Axes containers, there is another special type of container called a [`Collection`](http://matplotlib.org/api/collections_api.html). A Collection usually contains a list of primitives of the same kind that should all be treated similiarly. For example, a [`CircleCollection`](http://matplotlib.org/api/collections_api.html#matplotlib.collections.CircleCollection) would have a list of [`Circle`](https://matplotlib.org/api/_as_gen/matplotlib.patches.Circle.html) objects all with the same color, size, and edge width. Individual property values for artists in the collection can also be set (in some cases)." ] }, { diff --git a/solutions/5.1-goldstar.py b/solutions/5.1-goldstar.py index 21f3272..7a04d3e 100644 --- a/solutions/5.1-goldstar.py +++ b/solutions/5.1-goldstar.py @@ -3,7 +3,7 @@ fig, ax = plt.subplots(1, 1) -offsets = zip([0.2, 0.4, 0.6, 0.8], [0.5] * 4) +offsets = list(zip([0.2, 0.4, 0.6, 0.8], [0.5] * 4)) collection = StarPolygonCollection(5, offsets=offsets, transOffset=ax.transData, From 4538f29bddc02871069a6e36509d574841277bc3 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Mon, 9 Jul 2018 23:53:30 -0400 Subject: [PATCH 51/61] Fix a couple of URLs in Part 1. --- AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb index efa6b8a..bece646 100644 --- a/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb +++ b/AnatomyOfMatplotlib-Part1-Figures_Subplots_and_layouts.ipynb @@ -58,7 +58,7 @@ "[Matplotlib](https://github.com/matplotlib) is hosted by GitHub.\n", "\n", "### Bug Reports and feature requests\n", - "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at Matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](http://matplotlib.org/devdocs/devel/MEP/index.html))." + "So, you think you found a bug? Or maybe you think some feature is just too difficult to use? Or missing altogether? Submit your bug reports [here](https://github.com/matplotlib/matplotlib/issues) at Matplotlib's issue tracker. We even have a process for submitting and discussing Matplotlib Enhancement Proposals ([MEPs](https://matplotlib.org/devel/MEP/index.html))." ] }, { @@ -200,7 +200,7 @@ "\n", "However, while we're on the topic, you can control the size of the figure through the ``figsize`` argument, which expects a tuple of ``(width, height)`` in inches. \n", "\n", - "A really useful utility function is [`figaspect`](http://matplotlib.org/api/figure_api.html?highlight=figaspect#matplotlib.figure.figaspect)" + "A really useful utility function is [`figaspect`](https://matplotlib.org/api/_as_gen/matplotlib.figure.figaspect.html?highlight=figaspect#matplotlib.figure.figaspect)" ] }, { From 7f673d8ca0c57855e96523606e58c810c839dd98 Mon Sep 17 00:00:00 2001 From: Benjamin Root Date: Tue, 10 Jul 2018 00:24:51 -0400 Subject: [PATCH 52/61] Adopted some of the changes in PR #23 for categoricals --- ...OfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb index c62c8c4..ec20839 100644 --- a/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb +++ b/AnatomyOfMatplotlib-Part4-Limits_Legends_and_Layouts.ipynb @@ -315,9 +315,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A commonly-asked question is \"How do I plot non-numerical categories?\"\n", - " \n", - "Currently, the most reliable way to do this is to \"fake\" the x-values and then change the tick labels to reflect the category. There are some new approaches that work in newer versions of mpl, but the developers are still working out the details of how it should work. In the meantime, \"faking\" the values is the most reliable.\n", + "A commonly-asked question is \"How do I plot categories?\"\n", + "\n", + "Starting in version 2.0 of mpl, just like any other data.\n", "\n", "For example:" ] @@ -334,9 +334,7 @@ "fruit, value = zip(*data)\n", "\n", "fig, ax = plt.subplots()\n", - "x = np.arange(len(fruit))\n", - "ax.bar(x, value, align='center', color='gray')\n", - "ax.set(xticks=x, xticklabels=fruit)\n", + "ax.bar(fruit, value, align='center', color='gray')\n", "plt.show()" ] }, From 9b79d529b091dabbe87c9771643f791bb2282c65 Mon Sep 17 00:00:00 2001 From: Benn Roth Date: Wed, 11 Jul 2018 13:53:25 -0500 Subject: [PATCH 53/61] Add knot to Ugly Tie shape Added geometry to the Ugly Tie polygon to look like a knot. It remains a single polygon so color will affect both visible parts. At large zooms/resolutions a connection between the right side of the knot and the main tie is visible because the points on right side of the knot are not perfectly in-line with the upper right corner of the tie where the two larger parts of the shape are visible. If this becomes an issue, doing some math to find evenly dividing, aligned points near the current values would make the connecting section of the polygon zero width. --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index d7bbf0e..70384ab 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -512,8 +512,8 @@ "source": [ "mpl.rc('axes', prop_cycle=cycler('color', ['r', 'orange', 'c', 'y']) +\n", " cycler('hatch', ['x', 'xx-', '+O.', '*']))\n", - "x = np.array([0.4, 0.2, 0.5, 0.8, 0.6])\n", - "y = [0, -5, -6, -5, 0]\n", + "x = np.array([0.7, 0.3, 0.385, 0.6153, 0.6, 0.4, 0.2, 0.5, 0.8, 0.6])\n", + "y = [0.65, 0.65, 0.1, 0.1, 0, 0, -5, -6, -5, 0]\n", "plt.fill(x+1, y)\n", "plt.fill(x+2, y)\n", "plt.fill(x+3, y)\n", From 2fd6c31b53cd05ecd77cca1118d9655a94bb5133 Mon Sep 17 00:00:00 2001 From: Benn Roth Date: Fri, 13 Jul 2018 09:27:04 -0500 Subject: [PATCH 54/61] Removed invisible connecting geometry repeated first point in 5th position to close knot shape. Added `np.nan` non-rending connection point. --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 70384ab..110301a 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -512,8 +512,8 @@ "source": [ "mpl.rc('axes', prop_cycle=cycler('color', ['r', 'orange', 'c', 'y']) +\n", " cycler('hatch', ['x', 'xx-', '+O.', '*']))\n", - "x = np.array([0.7, 0.3, 0.385, 0.6153, 0.6, 0.4, 0.2, 0.5, 0.8, 0.6])\n", - "y = [0.65, 0.65, 0.1, 0.1, 0, 0, -5, -6, -5, 0]\n", + "x = np.array([0.7, 0.3, 0.385, 0.6153, 0.7, np.nan, 0.6, 0.4, 0.2, 0.5, 0.8, 0.6])\n", + "y = [0.65, 0.65, 0.1, 0.1, 0.65, np.nan, 0, 0, -5, -6, -5, 0]\n", "plt.fill(x+1, y)\n", "plt.fill(x+2, y)\n", "plt.fill(x+3, y)\n", From c96a9255ef1479d1b8263d30aecefdab4f9b97ab Mon Sep 17 00:00:00 2001 From: ggodreau Date: Sat, 27 Oct 2018 19:00:33 -0500 Subject: [PATCH 55/61] Fixes #26 - /mpl-data/sample_data/axes_grid folder appears to no longer exists as of matplotlib v2.2.2 - added /assets folder in repo containing dependent numpy pickle, 'bivariate_normal.npy' file - revised load of data in AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb to reflect this change - tested successfully with matplotlib v2.2.2 and python v3.6.6 --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 38 ++++++++++++++++-- assets/bivariate_normal.npy | Bin 0 -> 1880 bytes 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 assets/bivariate_normal.npy diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 6ab58e8..f36cef2 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -269,6 +269,38 @@ "# Now you're on your own!\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "np.random.seed(1)\n", + "\n", + "# Generate data...\n", + "y_raw = np.random.randn(1000).cumsum() + 15\n", + "x_raw = np.linspace(0, 24, y_raw.size)\n", + "\n", + "# Get averages of every 100 samples...\n", + "x_pos = x_raw.reshape(-1, 100).min(axis=1)\n", + "y_avg = y_raw.reshape(-1, 100).mean(axis=1)\n", + "y_err = y_raw.reshape(-1, 100).ptp(axis=1)\n", + "\n", + "bar_width = x_pos[1] - x_pos[0]\n", + "\n", + "# Make a made up future prediction with a fake confidence\n", + "x_pred = np.linspace(0, 30)\n", + "y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred\n", + "y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred\n", + "\n", + "# Just so you don't have to guess at the colors...\n", + "barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue'\n", + "\n", + "# Now you're on your own!\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -305,7 +337,7 @@ "outputs": [], "source": [ "from matplotlib.cbook import get_sample_data\n", - "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "data = np.load('assets/bivariate_normal.npy')\n", "\n", "fig, ax = plt.subplots()\n", "im = ax.imshow(data, cmap='gist_earth')\n", @@ -370,7 +402,7 @@ "outputs": [], "source": [ "from matplotlib.cbook import get_sample_data\n", - "data = np.load(get_sample_data('axes_grid/bivariate_normal.npy'))\n", + "data = np.load('assets/bivariate_normal.npy')\n", "\n", "fig, ax = plt.subplots()\n", "im = ax.imshow(data, cmap='seismic')\n", @@ -462,7 +494,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.6" } }, "nbformat": 4, diff --git a/assets/bivariate_normal.npy b/assets/bivariate_normal.npy new file mode 100644 index 0000000000000000000000000000000000000000..b6b8dacdd0daecd53ef685f2a2dc29c98d5c6861 GIT binary patch literal 1880 zcmX|AeLNJ{8m6?@w|k|AjJb2;&S58qN?3txDq(VtzzprVUv_Y441f^WSsc=Xu`qKIa^c$D#jt9aU9vR$&lB zLg^=HL=v9pK(!}Y;EB{|S}ZLnDj=E`5~|pD4vM6Q%J=DEK{26nY`)vp0>9gKhXwu& zer;)XC8WM!i3iBmwDbomR~N~ihZ~C3XZ4}%zny5C?zirrU0wAhA)iNf_0{U#pm~9u=Sn}O;-UsA2dr9o+Gdcy=6|PX zM-V^V8_WtMZjtUm5PtQz)3-ar;hf`EI|pVYgsfrgTD^3Q@4Keoyyh3|^4XvEm~iXp z>?m1!<8yz)Ldte#^A50Y^?RHW>jrO(zQ3SXZ~{a+ea~N*@DItNg(P>Z(4!;qaR#+uP@$%uz zLzbLh)UuQpAlC;xcy0aXzC2(Q{LkoAay&@aJKto@RPt) zH>Y6?wk~bbDA_22FMdB#WLqYL+Pq~#(b=0|RpD7G@n?cFZX4UDCIChzoO<^?`wE`U zlXzjAEJzDEa6kFCUtxyXi?DAVg7&FW45w!p#1y@9-#IB@2!-z>3+7-lvx~>wxd1h{ z-{q7g&H;Ogq*<6Mg=9YFO?t}^2(t=(jHT^>cPb_S;Cu_(nI?6)b_pOf<4^DXNJSL> z5!Iiaspw+tmO*w{8cf$uZ45T$LVJ>PQ)qq%l%Fuh9ZnjCO9K;?jaV6E7Yo%>tLNaO z53@n1a~`myTexrV@4)lf;(jOI1k95<>1LECAYpyb&g#!Zl5N~yr)v1CAYjZA1xRpz2V`x%qD=sc8E5;z#`oDJEd$B$aNwZO3kisnkW z2qvseE7_EnuyIfE6Vtc-U^r`r`^2~c@jcik%HR;n_mwnrzmuRs+$dKtAw`TRejHcz zHM-@Jv>=HRqpbP9;6ILtP}kE8_i%>}6xWn!(U?(zis?bQfiD`7V8riWn?@UYK4j=q zaIG7)x!U*M_3uUN{+dmfJoJ)YqbqhS_GHpK^yRlP1%`Bemo&6hC4D4dG7W|Kd-v_SavZ6Q z^K$!y7hygB_4_mV`&;hVSiLeI{oRJ<^}U_QF78vIQ++2o{Y7eW^Okl*v)mjzRMdn_ zp0-vv+SMUhsm-z1!@nRepFCj&)) Date: Sat, 27 Oct 2018 19:08:06 -0500 Subject: [PATCH 56/61] Fixes #26 - removed redundant cell (typo on my part), line 272 --- ...tlib-Part2-Plotting_Methods_Overview.ipynb | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index f36cef2..8239f9e 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -269,38 +269,6 @@ "# Now you're on your own!\n" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "np.random.seed(1)\n", - "\n", - "# Generate data...\n", - "y_raw = np.random.randn(1000).cumsum() + 15\n", - "x_raw = np.linspace(0, 24, y_raw.size)\n", - "\n", - "# Get averages of every 100 samples...\n", - "x_pos = x_raw.reshape(-1, 100).min(axis=1)\n", - "y_avg = y_raw.reshape(-1, 100).mean(axis=1)\n", - "y_err = y_raw.reshape(-1, 100).ptp(axis=1)\n", - "\n", - "bar_width = x_pos[1] - x_pos[0]\n", - "\n", - "# Make a made up future prediction with a fake confidence\n", - "x_pred = np.linspace(0, 30)\n", - "y_max_pred = y_avg[0] + y_err[0] + 2.3 * x_pred\n", - "y_min_pred = y_avg[0] - y_err[0] + 1.2 * x_pred\n", - "\n", - "# Just so you don't have to guess at the colors...\n", - "barcolor, linecolor, fillcolor = 'wheat', 'salmon', 'lightblue'\n", - "\n", - "# Now you're on your own!\n" - ] - }, { "cell_type": "markdown", "metadata": {}, From bcf3d08fa31c9297c052efb977fb5ffd1e0cc9c5 Mon Sep 17 00:00:00 2001 From: JarnoRFB Date: Mon, 22 Apr 2019 16:38:36 +0200 Subject: [PATCH 57/61] Fix markers table for display in JupyterLab Before the changes, the table was not rendered properly. --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index 110301a..fd654f2 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -102,17 +102,17 @@ "# Markers\n", "[Markers](http://matplotlib.org/api/markers_api.html) are commonly used in [`plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) plots, but also show up elsewhere. There is a wide set of markers available, and custom markers can even be specified.\n", "\n", - "marker | description ||marker | description ||marker | description ||marker | description \n", - ":----------|:--------------||:---------|:--------------||:---------|:--------------||:---------|:--------------\n", - "\".\" | point ||\"+\" | plus ||\",\" | pixel ||\"x\" | cross\n", - "\"o\" | circle ||\"D\" | diamond ||\"d\" | thin_diamond || |\n", - "\"8\" | octagon ||\"s\" | square ||\"p\" | pentagon ||\"\\*\" | star\n", - "\"|\" | vertical line||\"\\_\" | horizontal line ||\"h\" | hexagon1 ||\"H\" | hexagon2\n", - "0 | tickleft ||4 | caretleft ||\"<\" | triangle_left ||\"3\" | tri_left\n", - "1 | tickright ||5 | caretright ||\">\" | triangle_right||\"4\" | tri_right\n", - "2 | tickup ||6 | caretup ||\"^\" | triangle_up ||\"2\" | tri_up\n", - "3 | tickdown ||7 | caretdown ||\"v\" | triangle_down ||\"1\" | tri_down\n", - "\"None\" | nothing ||`None` | default ||\" \" | nothing ||\"\" | nothing" + "marker | description | marker | description |marker | description | marker | description \n", + ":----------|:--------------| :---------|:-------------- |:---------|:--------------| :---------|:--------------\n", + "\".\" | point | \"+\" | plus |\",\" | pixel | \"x\" | cross\n", + "\"o\" | circle | \"D\" | diamond |\"d\" | thin_diamond | |\n", + "\"8\" | octagon | \"s\" | square |\"p\" | pentagon | \"\\*\" | star\n", + "\"|\" | vertical line| \"\\_\" | horizontal line | \"h\" | hexagon1 | \"H\" | hexagon2\n", + "0 | tickleft | 4 | caretleft |\"<\" | triangle_left | \"3\" | tri_left\n", + "1 | tickright | 5 | caretright |\">\" | triangle_right| \"4\" | tri_right\n", + "2 | tickup | 6 | caretup |\"^\" | triangle_up | \"2\" | tri_up\n", + "3 | tickdown | 7 | caretdown |\"v\" | triangle_down | \"1\" | tri_down\n", + "\"None\" | nothing | `None` | default |\" \" | nothing |\"\" | nothing" ] }, { @@ -607,9 +607,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.7.3" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 2 } From 47313848fbf84d580447d751b968381c4cae68fe Mon Sep 17 00:00:00 2001 From: JarnoRFB Date: Tue, 23 Apr 2019 22:47:07 +0200 Subject: [PATCH 58/61] Make text table more consistent --- AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb index fd654f2..e3c93fe 100644 --- a/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb +++ b/AnatomyOfMatplotlib-Part3-HowToSpeakMPL.ipynb @@ -102,17 +102,17 @@ "# Markers\n", "[Markers](http://matplotlib.org/api/markers_api.html) are commonly used in [`plot()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot) and [`scatter()`](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter) plots, but also show up elsewhere. There is a wide set of markers available, and custom markers can even be specified.\n", "\n", - "marker | description | marker | description |marker | description | marker | description \n", - ":----------|:--------------| :---------|:-------------- |:---------|:--------------| :---------|:--------------\n", - "\".\" | point | \"+\" | plus |\",\" | pixel | \"x\" | cross\n", - "\"o\" | circle | \"D\" | diamond |\"d\" | thin_diamond | |\n", - "\"8\" | octagon | \"s\" | square |\"p\" | pentagon | \"\\*\" | star\n", - "\"|\" | vertical line| \"\\_\" | horizontal line | \"h\" | hexagon1 | \"H\" | hexagon2\n", - "0 | tickleft | 4 | caretleft |\"<\" | triangle_left | \"3\" | tri_left\n", - "1 | tickright | 5 | caretright |\">\" | triangle_right| \"4\" | tri_right\n", - "2 | tickup | 6 | caretup |\"^\" | triangle_up | \"2\" | tri_up\n", - "3 | tickdown | 7 | caretdown |\"v\" | triangle_down | \"1\" | tri_down\n", - "\"None\" | nothing | `None` | default |\" \" | nothing |\"\" | nothing" + "marker | description | marker | description | marker | description | marker | description \n", + ":----------|:--------------|:----------|:----------------|:---------|:--------------|:----------|:--------------\n", + "\".\" | point | \"+\" | plus | \",\" | pixel | \"x\" | cross\n", + "\"o\" | circle | \"D\" | diamond | \"d\" | thin_diamond | |\n", + "\"8\" | octagon | \"s\" | square | \"p\" | pentagon | \"\\*\" | star\n", + "\"|\" | vertical line| \"\\_\" | horizontal line | \"h\" | hexagon1 | \"H\" | hexagon2\n", + "0 | tickleft | 4 | caretleft | \"<\" | triangle_left | \"3\" | tri_left\n", + "1 | tickright | 5 | caretright | \">\" | triangle_right| \"4\" | tri_right\n", + "2 | tickup | 6 | caretup | \"^\" | triangle_up | \"2\" | tri_up\n", + "3 | tickdown | 7 | caretdown | \"v\" | triangle_down | \"1\" | tri_down\n", + "\"None\" | nothing | `None` | default | \" \" | nothing | \"\" | nothing" ] }, { From 4aa4074aa3c7c376cd9e9b2262012f73edbb0dfb Mon Sep 17 00:00:00 2001 From: Jess Tiu Date: Mon, 21 Oct 2019 22:23:18 +0800 Subject: [PATCH 59/61] Add explanation for imshow usage --- solutions/2.2-vmin_vmax_imshow_and_colorbars.py | 1 + 1 file changed, 1 insertion(+) diff --git a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py index 2bc76a8..0fd5630 100644 --- a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py @@ -15,6 +15,7 @@ # Now you're on your own! for ax, data in zip(axes, [data1, data2, data3]): + # Display data, explicitly making the colormap cover values from 0 to 3 im = ax.imshow(data, vmin=0, vmax=3, interpolation='nearest') fig.colorbar(im, cax=cax, orientation='horizontal') From 21339aabbed1b0f0f5f77e812f48b04bb1d9eada Mon Sep 17 00:00:00 2001 From: Jess Tiu Date: Mon, 21 Oct 2019 22:55:51 +0800 Subject: [PATCH 60/61] Fix alignment --- solutions/2.2-vmin_vmax_imshow_and_colorbars.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py index 0fd5630..208e6ea 100644 --- a/solutions/2.2-vmin_vmax_imshow_and_colorbars.py +++ b/solutions/2.2-vmin_vmax_imshow_and_colorbars.py @@ -15,7 +15,7 @@ # Now you're on your own! for ax, data in zip(axes, [data1, data2, data3]): - # Display data, explicitly making the colormap cover values from 0 to 3 + # Display data, explicitly making the colormap cover values from 0 to 3 im = ax.imshow(data, vmin=0, vmax=3, interpolation='nearest') fig.colorbar(im, cax=cax, orientation='horizontal') From f8bc59ffe1f84b900989de41e685e85a6835ba76 Mon Sep 17 00:00:00 2001 From: Canute <46291012+canute24@users.noreply.github.com> Date: Sat, 7 Aug 2021 10:16:21 +0530 Subject: [PATCH 61/61] Updated with changes as per newer matplotlib api to remove deprecation warning Updated `bar.set(color='salmon', edgecolor='darkred', linewidth=3)` to pass `color` before `edgecolor` to fix `MatplotlibDeprecationWarning` --- AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb index 8239f9e..ac00986 100644 --- a/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb +++ b/AnatomyOfMatplotlib-Part2-Plotting_Methods_Overview.ipynb @@ -116,7 +116,7 @@ "# We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.\n", "for bar, height in zip(vert_bars, y):\n", " if height < 0:\n", - " bar.set(edgecolor='darkred', color='salmon', linewidth=3)\n", + " bar.set(color='salmon', edgecolor='darkred', linewidth=3)\n", "\n", "plt.show()" ]

p@}((N|8z`0CRUYu&5>*YgH}v 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 literal 0 HcmV?d00001 diff --git a/images/exercise_1.3.png b/images/exercise_1.3.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fda91e7dfe7171ed872b84d20f0eb995f21637 GIT binary patch literal 22841 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 WmQB0QbrE8jB5_XoZ0zZ4_x=z370N^a literal 0 HcmV?d00001 diff --git a/images/figure_axes_axis_labeled.png b/images/figure_axes_axis_labeled.png new file mode 100644 index 0000000000000000000000000000000000000000..6470c6279fe9ece662f08877496b3aa11eee9d4e GIT binary patch literal 185257 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%0D1EWrv>nkUwfj3o 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