{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [NTDS'17] demo 5: Plotting with Matplotlib\n", "[ntds'17]: https://github.com/mdeff/ntds_2017\n", "\n", "[Effrosyni Simou](http://lts4.epfl.ch/simou), [EPFL LTS4](http://lts4.epfl.ch)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ojective\n", "In this lab session we will provide a short tutorial to ``Matplotlib``. We will present:\n", "\n", "1) The ``matplotlib.pyplot`` module that provides a procedural interface similar to that of Matlab\n", "\n", "2) The Object Oriented API of Matplotlib, which allows for maximum flexibility " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Resources\n", "\n", "Here are some links that you may find useful if you want to learn more about ``Matplotlib``, than what is included in this demo:\n", "\n", "* [Matplotlib Documentation](https://matplotlib.org/index.html)\n", "* [Scipy Lecture Notes](http://www.scipy-lectures.org/intro/matplotlib/matplotlib.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. The Pyplot API" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "# magic command that sets the backend of matplotlib to the 'inline' backend \n", "\n", "import numpy as np\n", "from scipy import sparse\n", "import IPython.display as ipd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1.1: Plot a linear function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot $y=x+1$, add labels to the axes and give your plot a title." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([1,2,3,4])\n", "plt.xlabel('x')\n", "plt.ylabel('y=x+1')\n", "plt.axis([0, 4, 0, 4]);\n", "plt.title('My first plot');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1.2: Plot the sparsity pattern of a 2-D array." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create and plot an adjacency matrix for a graph with 10 nodes." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "row_ind = np.array([1, 3, 9, 7, 6, 9 ,2, 5, 8, 3, 7, 8])\n", "col_ind = np.array([2, 5, 8, 3, 7, 8, 1, 3, 9, 7, 6, 9])\n", "data = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])\n", "W = sparse.csr_matrix((data,(row_ind, col_ind)),shape=(10, 10)).toarray()\n", "#np.nonzero(W-W.transpose())" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.spy(W,markersize=5);\n", "plt.title('Adjacency Matrix W');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1.3: Plot a histogram" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Find the degree of the nodes of the graph that you created in Example 1.2 and plot the degree histogram." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "d = W.sum(axis=0)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n, bins, patches = plt.hist(d, 10, facecolor='g');\n", "plt.xlabel('Degree')\n", "plt.ylabel('Counts')\n", "plt.title('Histogram of degrees')\n", "plt.axis([0, 2, 0, 10])\n", "plt.grid(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What else can you plot with Pyplot?\n", "You can find a full list of all the functions provided by ``Pyplot`` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So far we have created simple plots, like the ones you had to create for your first two assignments, using the ``Pyplot`` API. ``Pyplot`` provides a procedural interface similar to the one that you might have been used to from Matlab. However, the Object Oriented API of ``Matplotlib`` offers greater control and customization of the plots and therefore it is recommended to new ``Matplotlib`` users to learn how to use it. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. The Object Oriented API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's have a closer look at what happened when we called the ``pyplot.plot()`` before. Actually, two things happened in the background:\n", "\n", "1) We created a figure instance describing the plot window and all of its properties.\n", "\n", "2) We added an axes element within the figure. The axes element allows for the data to be arranged in x and y coordinates and provides a wide range of functions. The axes class will be your \"best friend\" for creating plots with the OO API and you can find out more about it [here](https://matplotlib.org/api/axes_api.html).\n", "\n", "In order to fully understand ``Matplotlib`` you should have a look at [this tutorial](https://matplotlib.org/users/artists.html) in order to learn about the underlying concepts of ``Artist``, ``FigureCanvas`` and ``Renderer``.\n", "\n", "However, the basics in order to get you started are:\n", "* The ``FigureCanvas`` is where your ``Figure`` will be drawn. When you use ``Pyplot`` to create a ``Figure`` instance, the ``FigureCanvas`` instance is created for you; you do not have to specify anything explicitly. In any other case you have to specify the ``FigureCanvas``. This will also be the case when you want your ``Figure`` to appear in a Graphical User Interface (GUI).\n", "* The ``Figure`` will be the final \"picture\". A ``Figure`` may contain one or more plots. The ``Axes`` represents each individual plot." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2.1: Using the agg backend." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas\n", "from matplotlib.figure import Figure\n", "# create a Figure instance\n", "fig = Figure() \n", "# Instanciate the FigureCanvas with the figure as argument\n", "FigureCanvas(fig)\n", "#print(type(fig.canvas))\n", "ax = fig.add_subplot(111)\n", "ax.plot([1, 2, 3],[1, 2, 3])\n", "ax.set_title('My first title')\n", "ax.grid(True)\n", "ax.set_xlabel('x')\n", "ax.set_ylabel('y=x')\n", "fig.savefig('test')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Open the file `test.png` to see the plot that you created." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Image(filename='test.png') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, change the title in your created plot as follows:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ax.set_title('My new title')\n", "fig.savefig('test')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Open again the file test.png. You will see that the title has been changed. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3XtAVOWiNvBnAO8gFxEFBwUElasE\nKGgK6ha8ZChipZboxiIzvzp5Mi0z0zxWmrvcabVJcyuZ1FYLr6glmKJ5SQPBGyoIjCggotwZZt7v\nj05zIkEdhLVm4Pn9E7PetZiHxZKntWbNOwohhAAREZGRMZE7ABERUWOwwIiIyCixwIiIyCixwIiI\nyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCix\nwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiIyCixwIiMWE5ODszNzaHRaBpcR6FQ4PLlyxKmIpIG\nC4xaBScnJ7Rt2xZFRUV1lvv6+kKhUCA7O1ueYHpycnLCjz/+qHvcs2dPlJWVwdTUFAAwbNgwrFu3\nTq54RJJigVGr4ezsjC1btugenz17FpWVlTImIqJHwQKjVmPatGnYtGmT7vHGjRsRFRWle3zy5El0\n69YNtbW1umXbtm2Dr69vvd9vxowZePnll/HEE0/AwsICgYGBuHLlim78woULCA0NhY2NDfr27Yvv\nvvsOAJCVlQUrKytotVoAwPPPPw87Ozvdds899xw++eSTevPn5OTgySefhLm5OVasWIHs7GwoFArU\n1tZi4cKFOHz4MObMmQNzc3PMmTPnnu9RXV2N119/HT179kS3bt0wa9YsljgZL0HUCvTq1UscOHBA\n9OnTR5w7d07U1tYKpVIpsrOzBQCRlZUlhBDC3d1d7NmzR7fdhAkTxEcffVTv95w+fbqwtrYWx48f\nF2q1WkydOlU888wzQgghysrKhFKpFF999ZVQq9Xi119/FV26dBHp6elCCCEcHR3FqVOnhBBC9OnT\nRzg7O4tz587pxk6fPn3fn+MPWVlZAoBQq9VCCCFCQkLEl19+WWcbACIzM1MIIcSrr74qnnzySXHr\n1i1x9+5dMW7cOLFgwQK99iWRoeAZGLUqf5yFHThwAP369UOPHj3qjE+fPh1ff/01AKC4uBj79u3D\n1KlTG/x+EydOxMCBA2FmZoZnn30Wv/32GwBg165dcHJywt///neYmZnBz88PkZGR2Lp1KwAgJCQE\nhw4dwo0bNwAAkyZNwqFDh5CVlYW7d++if//+Tf6zCyHw5Zdf4uOPP4aNjQ0sLCzw1ltvIT4+vsmf\ni0gKZnIHIJLStGnTEBwcjKysrDqXD//w3HPPwd3dHWVlZfjuu+8wdOhQ2NvbN/j9unfvrvu6Y8eO\nKCsrAwBcu3YNx48fh5WVlW68trYW06ZNA/B7ge3YsQNKpRLBwcEYNmwY4uLi0L59ewwdOhQmJk3/\n/5aFhYWoqKiAv7+/bpkQ4r53MBIZMhYYtSq9evWCs7Mz9uzZg/Xr198z3qNHDwwaNAjff/894uLi\n8NJLLzXqeRwdHRESEoIDBw7UOx4SEoJ58+ZBqVQiJCQEQ4YMwaxZs9C+fXuEhIQ0+H0VCsV9n/d+\n47a2tujQoQMyMjLuOfMkMka8hEitzvr163Hw4EF06tSp3vGoqCisWLECZ8+eRURERKOeY9y4cbh0\n6RLi4uKgVquhVqtx8uRJnD9/HgDg5uaGDh064Ouvv0ZwcDA6d+6Mbt26Ydu2bfctsG7duuHq1auN\nGjcxMcELL7yA1157DQUFBQAAlUqFffv2NepnJJIbC4xand69eyMgIKDB8YiICFy7dg0RERENltyD\nWFhYYP/+/YiPj4eDgwO6d++O+fPno7q6WrdOSEgIunTpgp49e+oeCyHw2GOPNfh933zzTSxbtgxW\nVlb46KOP7hl/9dVXsXXrVlhbW+OVV165Z/zDDz+Eq6srgoKC0LlzZ4wcORIXL15s1M9IJDeFEELI\nHYLI0PTu3Rv/+te/MHLkSLmjEFEDeAZG9Bfbtm2DQqHAiBEj5I5CRPfBmziI/mTYsGE4d+4c4uLi\nmuVOQCJqOryESERERon/i0lEREaJBUZEREapxb4GZmtrCycnp0ZtW15e3ujbp5sTc+mHufTDXPoz\n1GyPkis7O/uejx0yWDLOw9is/P39G71tUlJS0wVpQsylH+bSD3Ppz1CzPUquR/nbKTVeQiQiIqPE\nAiMiIqPEAiMiIqMkWYFVVVVh4MCB6N+/Pzw9PbF48eJ71qmursYzzzwDV1dXBAYGIjs7Wzf2/vvv\nw9XVFX379uXko0REJN1diO3atcPBgwdhbm4OtVqNIUOGYMyYMQgKCtKts379elhbW+Py5cuIj4/H\n/Pnz8e233+LcuXOIj49HRkYGrl+/jpEjR+LSpUswNTWVKj4RERkYyc7AFAoFzM3NAUD38RJ//eyi\nhIQETJ8+HcDvn1D7008/QQiBhIQETJ48Ge3atYOzszNcXV1x4sQJqaITEZEBkvQ1MI1GA19fX9jZ\n2SE0NBSBgYF1xlUqFRwdHQEAZmZmsLS0xK1bt+osBwClUgmVSiVldCIig6fVCnx/Jg9qbeuYIVDS\nNzKbmprit99+Q0lJCSIiIpCeng4vLy/duKhnWkaFQtHg8r+KjY1FbGwsACAvLw/JycmNyllWVtbo\nbZsTc+mHufTDXPozpGw3yrXYkF6Ni7e1mOoq0MYkWe5IzU6WmTisrKwwbNgwJCYm1ikwpVKJ3Nxc\nKJVK1NbW4s6dO7CxsdEt/0NeXh4cHBzu+b4xMTGIiYkBAAQEBGDYsGGNypecnNzobZsTc+mHufTD\nXPozhGy1Gi2+SsnCqmOX0NbUBB9M9ES38iuy55KCZJcQCwsLUVJSAgCorKzEjz/+iH79+tVZJzw8\nHBs3bgQAbN26FSNGjIBCoUB4eDji4+NRXV2NrKwsZGZmYuDAgVJFJyIySOfz72Li50exfM8FDHXr\nigNzQzB5YM96r1C1RJKdgeXn52P69OnQaDTQarV4+umnMW7cOLzzzjsICAhAeHg4Zs6ciWnTpsHV\n1RU2NjaIj48HAHh6euLpp5+Gh4cHzMzMsHbtWt6BSEStVnWtBmuTruCzpMuw7NAGn055DON87FtN\ncf1BsgLz8fHBmTNn7lm+dOlS3dft27fHf/7zn3q3X7hwIRYuXNhs+YiIjMHpnNuYvzUNmQVliHis\nBxaN84BNp7Zyx5JFi52NnoioJamoqcWq/ZfwVUoWundujw0zBmB4Pzu5Y8mKBUZEZOBSLhdhwfY0\n5BZX4rmgnpg/uh8s2reRO5bsWGBERAbqTqUay3efx7encuFs2wnfxgQh0KWL3LEMBguMiMgA7c+4\ngbd/SEdRWTVeDHHBayP7oH0b3rz2ZywwIiIDUlhajXd3ZmB3Wj76dbfAuukB8FFayR3LILHAiIgM\ngBACP/ymwpKd51BRrcHrYX3wYkhvtDHlp141hAVGRCQzVUklFn5/FskXC+HX0worJvnA1c5C7lgG\njwVGRCQTrVZg8/Fr+GDvBWgFsPhJD0QNcoKpSet6Q3JjscCIiGRwtbAMC7adxYnsYgxxtcX7E73h\naNNR7lhGhQVGRCShWo0WXx7Owsc/XkJ7MxOsmOSDp/yVrW4aqKbAAiMiksi563fxxrZUpKvuYpRn\nN7w33gt2ndvLHctoscCIiJpZlVqDNQcv44tDV2DVsQ0+e9YPY7y686zrEbHAiIia0a/XivHG1jRc\nKSxHpJ8Si8a5w6pj65x8t6mxwIiImkF5dS1W7ruIjcey4WDZARujByKkT1e5Y7UoLDAioib286VC\nvLn9LFQllZg+qBfmje4H83b8c9vUuEeJiJrInQo13tt9Dlt/zYNL1074z6xBGOBkI3esFkuSAsvN\nzUVUVBRu3LgBExMTxMTE4NVXX62zzsqVK7F582YAQG1tLc6fP4/CwkLY2NjAyckJFhYWMDU1hZmZ\nGU6dOiVFbCKih5aYno9FCRkoLq/B7GG98crf3Dj5bjOTpMDMzMywatUq+Pn5obS0FP7+/ggNDYWH\nh4dunXnz5mHevHkAgJ07d+Ljjz+Gjc3//Z9LUlISbG1tpYhLRPTQCkqrsDghA3vTb8DDvjM2zBgA\nrx6WcsdqFSQpMHt7e9jb2wMALCws4O7uDpVKVafA/mzLli2YMmWKFNGIiBpFCIEjKjVePfQzKtUa\nzBvVFzHBLpx8V0KS7+ns7GycOXMGgYGB9Y5XVFQgMTERkZGRumUKhQJhYWHw9/dHbGysVFGJiOqV\nW1yBqK9OYN3ZGrjZmWPPK0Px8nBXlpfEFEIIIdWTlZWVISQkBAsXLsTEiRPrXefbb7/F119/jZ07\nd+qWXb9+HQ4ODigoKEBoaCg+/fRTBAcH37NtbGysruDy8vIQHx/f6Jzm5uaN2rY5MZd+mEs/zPVg\nWiHwU04ttl6qAQCE9xIY49YJJgb2huRH2Wevv/668dxnICRSU1MjwsLCxKpVq+673oQJE8TmzZsb\nHF+8eLFYuXLlA5/P399f74x/SEpKavS2zYm59MNc+mGu+8u8WSoiP0sRvebvEtPWHxe5xeUGk+2v\nHiXXo/ztlJok57tCCMycORPu7u6YO3dug+vduXMHhw4dwvjx43XLysvLUVpaqvt6//798PLyavbM\nREQAoNZosTbpMsauPozMgjKseqo/Nv59AJTWnDlebpLcxJGSkoK4uDh4e3vD19cXALB8+XLk5OQA\nAGbNmgUA+P777xEWFoZOnTrptr158yYiIiIA/H57/dSpUzF69GgpYhNRK5euuoM3tqbhXP5djPXu\njiXhXuhq0U7uWPS/JCmwIUOGQDzES20zZszAjBkz6ixzcXFBampqMyUjIrpXlVqD1T9lIvbnq7Dp\n1BZfPOeH0V72cseiv+BMHEREf3Iyuxjzt6bhalE5nvJX4u0nPGDZsY3csageLDAiIgBl1bVYkXgB\nm45dg9K6A+JmDsRQN06+a8hYYETU6iVfLMDC79Nx/U4lZgx2wrxRfdGJk+8aPP6GiKjVul1eg/d2\nn8P20yr07toJW2cNgn8vTr5rLFhgRNTqCCGwN/0G3klIR0mFGv9vhCvmjHBFOzNOvmtMWGBE1KoU\n3K3CooR07Mu4Ce8eltgUHQgPh85yx6JGYIERUasghMB/TuVh2e5zqK7VYsGYfnh+iDPMOH+h0WKB\nEVGLl1tcgTe3n8WRy0UY6GSDDyK94dLVMOZXpMZjgRFRi6XRCmw8mo2V+y7CRAG8N8ELzw7sCRMT\nw5p8lxqHBUZELVLmzVLM35aG0zklGNa3K/4nwhs9rDrIHYuaEAuMiFoUtUaLL5Kv4NODl9GpnSk+\necYX430doDCwjzyhR8cCI6IW42zeHczbmooLN0oxzsce74Z7wtack++2VCwwIjJ6VWoNPv7xEr78\n+Spszdshdpo/wjy7yx2LmhkLjIiM2i9Xb+HN7WeRVVSOyQMc8eZYd1h24OS7rQELjIiMUmmVGh/s\nvYDNx3PgaNMBm58PxOOutnLHIgmxwIjI6CRdKMBb35/FzbtVeH6IM+aG9UHHtvxz1tpI9hb03Nxc\nDB8+HO7u7vD09MTq1avvWSc5ORmWlpbw9fWFr68vli5dqhtLTExE37594erqig8++ECq2ERkQIrL\na/Bf8Wfw93+fhHk7M2x7aTDeHufB8mqlJPutm5mZYdWqVfDz80NpaSn8/f0RGhoKDw+POusNHToU\nu3btqrNMo9Hg5ZdfxoEDB6BUKjFgwACEh4ffsy0RtUxCCOxKy8e7OzJwp1KNV//mhtnDe3Py3VZO\nsgKzt7eHvf3vH8ltYWEBd3d3qFSqhyqhEydOwNXVFS4uLgCAyZMnIyEhgQVG1ArcrtLihU2/4sfz\nN+GjtMTmFwLRrzsn3yUJLyH+WXZ2Ns6cOYPAwMB7xo4dO4b+/ftjzJgxyMjIAACoVCo4Ojrq1lEq\nlVCpVJLlJSLpCSEQfyIHbx2pxOHMQiwc647tLw1meZGO5BeOy8rKEBkZiU8++QSdO9c9EP38/HDt\n2jWYm5tjz549mDBhAjIzMyGEuOf71Peu+tjYWMTGxgIA8vLykJyc3OiMjd22OTGXfphLP4aUq6BC\niw3p1ThfrIWbpcDzPu3QTZuDI4dz5I5WhyHtsz8z1FxNTkiopqZGhIWFiVWrVj3U+r169RKFhYXi\n6NGjIiwsTLd8+fLlYvny5ffd1t/fv9E5k5KSGr1tc2Iu/TCXfgwhV61GK778+Yro+/Ye4fVOotj8\nyzXx08GDcsdqkCHss/o8Sq5H+dspNcnOwIQQmDlzJtzd3TF37tx617lx4wa6desGhUKBEydOQKvV\nokuXLrCyskJmZiaysrLQo0cPxMfH45tvvpEqOhFJ4OKNUryxLQ2puSX4Wz87LIvwgr1lByQnX5U7\nGhkoyQosJSUFcXFx8Pb2hq+vLwBg+fLlyMn5/ZLArFmzsHXrVnz++ecwMzNDhw4dEB8fD4VCATMz\nM6xZswajRo2CRqNBdHQ0PD09pYpORM2oplaLz5IvY23SZVi0b4PVk30R3p+T79KDSVZgQ4YMqfe1\nrD+bM2cO5syZU+/Y2LFjMXbs2OaIRkQySc0twRtb03DxZinG+zrgnXEe6MLJd+kh8d1/RCS5yhoN\n/nHgItYfyYKdRXusiwrASI9ucsciI8MCIyJJHb1ShAXbziKnuAJTA3tiwZh+6Nyek++S/lhgRCSJ\nu1VqvL/nAracyEGvLh2x5YUgDOrdRe5YZMRYYETU7H48dxMLfziLwtJqxAS74LWRfdChLaeBokfD\nAiOiZnOrrBpLdp7DjtTr6NfdArHTAtDf0UruWNRCsMCIqMkJIbAj9Tre3ZGBsupavDayD14a1htt\nzWSZvY5aKBYYETWp/DuVePv7dPx0oQC+jlZYMckHfbpZyB2LWiAWGBE1Ca1WYMvJHLy/5wI0WoFF\n4zwwY7ATTE34hmRqHiwwInpkWUXlWLAtDcezivG4axe8H+GDnl06yh2LWjgWGBE1Wq1Gi69SsrBq\n/yW0NTPBh5HeeDrAkdNAkSRYYETUKOfz72L+tjSk5d1BqEc3LJvghW6d28sdi1oRFhgR6aW6VoO1\nSVfwWdJlWHZogzVTH8MT3vY86yLJscCI6KGdzrmN+VvTkFlQhojHeuCdcR6w7tRW7ljUSrHAiOiB\nKmpq8dG+S9hwNAv2ndtjw4wBGN7PTu5Y1MqxwIjovlIuF2HB9jTkFldiWlAvvDG6Lyw4+S4ZABYY\nEdXrTqUay3efx7encuFs2wnfxgQh0IWT75LhkGRel9zcXAwfPhzu7u7w9PTE6tWr71ln8+bN8PHx\ngY+PDwYPHozU1FTdmJOTk+6TnAMCAqSITNSq7c+4gdB/HMLW03mYFdIbe18dyvIigyPJGZiZmRlW\nrVoFPz8/lJaWwt/fH6GhofDw8NCt4+zsjEOHDsHa2hp79+5FTEwMjh8/rhtPSkqCra2tFHGJWq3C\n0mq8uzMDu9Py4W7fGeunD4C30lLuWET1kqTA7O3tYW9vDwCwsLCAu7s7VCpVnQIbPHiw7uugoCDk\n5eVJEY2I8Pvku0ev1+K/fj6EimoNXg/rgxdDeqONKSffJcMl+dGZnZ2NM2fOIDAwsMF11q9fjzFj\nxugeKxQKhIWFwd/fH7GxsVLEJGo1VCWV+Pu/TyI2rRoutp2w59UhmDPCjeVFBk8hhBBSPVlZWRlC\nQkKwcOFCTJw4sd51kpKSMHv2bBw5cgRduvx+zf369etwcHBAQUEBQkND8emnnyI4OPiebWNjY3UF\nl5eXh/j4+EbnNDc3b9S2zYm59MNc96cVAkm5tfjPxRoIAE/2Ehjr1gkmBvaGZEPZX/Ux1GyPkuv1\n11/HqVOnmjhRMxESqampEWFhYWLVqlUNrpOamipcXFzExYsXG1xn8eLFYuXKlQ98Pn9//0blFEKI\npKSkRm/bnJhLP8zVsCsFpeKpz4+KXvN3iefW/SJybpUbRK76GGouIQw326PkepS/nVKT5BqBEAIz\nZ86Eu7s75s6dW+86OTk5mDhxIuLi4tCnTx/d8vLycpSWluq+3r9/P7y8vKSITdTi1Gq0+Dz5Ckav\nPowLN+5i5SQfbIoeCEcbzhxPxkeSmzhSUlIQFxenuxUeAJYvX46cnBwAwKxZs7B06VLcunULs2fP\n/j2YmRlOnTqFmzdvIiIiAgBQW1uLqVOnYvTo0VLEJmpRzl2/ize2pSJddRejPLvhvfFesOPku2TE\nJCmwIUOGQDzgpbZ169Zh3bp19yx3cXGp854wItJPlVqDNQcv44tDV2DVsS0+f9YPY7zt5Y5F9Mg4\nEwdRC/brtWK8sTUNVwrLEemnxKJx7rDqyMl3qWVggRG1QOXVtVi57yI2HsuGg2UHbIweiJA+XeWO\nRdSkWGBELczPlwrx5vazuH6nElFBvTBvdD+Yt+M/dWp5eFQTtRB3KtR4b/c5bP01Dy5dO+G7Fwdh\ngJON3LGImg0LjKgFSEzPx6KEDBSX12D2sN545W9uaN/GVO5YRM2KBUZkxApKq7A4IQN702/A06Ez\nNswYAK8enHyXWgcWGJEREkJg22kV3tt1DpVqDd4Y3RcvDHXh/IXUqrDAiIxMbnEF3vr+LA5nFmGA\nkzU+iPRB766GNx8fUXNjgREZCa1WYNOxbKzYdxEKAEvHe+K5wF4wMTGsyXeJpMICIzIClwvKsGBb\nGk5du43gPl2xPMILSmvOX0itGwuMyICpNVrE/nwVq3/MRIe2plj1VH9M9OsBhYF95AmRHPR+xXf9\n+vV1Hms0GixZsqTJAhHR79JVdzB+TQpW7ruIUI9u+HFuCCL9lSwvov+ld4H99NNPGDt2LPLz85Ge\nno6goCDdx50Q0aOrUmvwYeIFjF+bgsKyanzxnD/WPuuHrhbt5I5GZFD0voT4zTff4Ntvv4W3tzc6\nduyILVu24PHHH2+ObEStzsnsYszfmoarReV4OkCJhWM9YNmxjdyxiAyS3gWWmZmJ1atXIzIyEufP\nn0dcXBwee+wxdOzIF5SJGqusuhYrEi9g07FrUFp3wNczAzHEzVbuWEQGTe9LiE8++STee+89/Otf\n/8KhQ4fg5uaGAQMGPHC73NxcDB8+HO7u7vD09MTq1avvWUcIgVdeeQWurq7w8fHB6dOndWMbN26E\nm5sb3NzcsHHjRn1jExms5IsFGPXxz4j75Rr+/rgT9v1XMMuL6CHofQZ24sQJdO7cGQCgUCjw3//9\n3wgPD3/wE5mZYdWqVfDz80NpaSn8/f0RGhoKDw8P3Tp79+5FZmYmMjMzcfz4cbz00ks4fvw4iouL\nsWTJEpw6dQoKhQL+/v4IDw+HtbW1vvGJDMbt8hq8t/sctp9WwdXOHFtnDYZ/Lx7TRA9L7zOwzp07\n48KFCwCg+6+bm9sDt7O3t4efnx8AwMLCAu7u7lCpVHXWSUhIQFRUFBQKBYKCglBSUoL8/Hzs27cP\noaGhsLGxgbW1NUJDQ5GYmKhvdCKDIITAnrP5CP34EHb8dh2vjHDF7leGsLyI9NSoidOmTp1a57/6\nys7OxpkzZxAYGFhnuUqlgqOjo+6xUqmESqVqcDmRsSm4W4U1v1Vj9ubTsLfsgB1zhmBuWF+0M+PM\n8UT6eqQ3Mgsh9N6mrKwMkZGR+OSTT3SXIu/3/RQKRYPL/yo2NhaxsbEAgLy8PCQnJ+ud74+Mjd22\nOTGXfgwplxACh1W12HKhBrVagaf7tMUoJzUKLp1GwSW50/3OkPbXnxlqLsBwsxlqrqYm6UwcarUa\nkZGRePbZZzFx4sR7xpVKJXJzc3WP8/Ly4ODgAKVSWeeXkZeXh2HDht2zfUxMDGJiYgAAAQEB9a7z\nMJKTkxu9bXNiLv0YSq7c4gq8uf0sjlwuwkBnG0xUVmLyEyPkjnUPQ9lff2WouQDDzWaouZqaZJ+9\nIITAzJkz4e7ujrlz59a7Tnh4ODZt2gQhBH755RdYWlrC3t4eo0aNwv79+3H79m3cvn0b+/fvx6hR\no6SKTtQoGq3AV0eyEPbxz/gttwTLJngh/oUgdO/EjzwhagqPdAamz5Q2KSkpiIuLg7e3N3x9fQEA\ny5cvR05ODgBg1qxZGDt2LPbs2QNXV1d07NgRGzZsAADY2Nhg0aJFutv133nnHdjY8KPSyXBl3izF\n/G1pOJ1TgmF9u2J5hDccrDrIHYuoRWlUgf3xmpQ+r4ENGTLkgesrFAqsXbu23rHo6GhER0c/fEgi\nGag1WnyRfAWfHryMTu1M8ckzvhjv68D5C4magd4FtmbNGuzYsQMAcPjw4SYPRGSs0vJK8MbWNFy4\nUYon+ztg8ZMesDXn/IVEzUXvi/E3btzA8OHD8fTTT+PIkSONuhORqCWpUmvw/p7zmLA2BbcravBl\nVAA+nfIYy4uomeldYMuWLUNmZiZmzpyJf//733Bzc8Nbb72FK1euNEc+IoP2y9VbGP3Jz/jXz1fx\nzABH7H8tBKEe3eSORdQqNOp2KIVCge7du6N79+4wMzPD7du3MWnSJLzxxhtNnY/IIJVWqbHw+7OY\nHPsLtAL45vlAvD/RB5YdOHM8kVT0fg3sn//8JzZu3AhbW1s8//zzWLlyJdq0aQOtVgs3NzesWLGi\nOXISGYykCwV46/uzuHm3Cs8PccbcsD7o2JYfbk4kNb3/1RUVFWH79u3o1atXneUmJibYtWtXkwUj\nMjTF5TVYujMDP/x2HX26meOzZwfjsZ6cv5BILnoX2NKlSxscc3d3f6QwRIZICIGdafl4d0cGSqvU\nePVvbnh5uCvamvENyURy4nUPovu4cacKb/+Qjh/P30R/pSU+nBSIft07P3hDImp2LDCiegghEH8y\nF8t3n4daq8XCse6IHuIMUxO+IZnIULDAiP7i2q1yLNh2Fseu3kKQiw0+mOgDJ9tOcscior9ggRH9\nL41WYENKFj7afxFtTEzw/kRvTB7gyGmgiAwUC4wIwMUbpXhjWxpSc0sw0t0OyyZ4o7tle7ljEdF9\nsMCoVaup1eKz5MtYm3QZFu3b4J9THsOTPvY86yIyAiwwarV+yy3B/K1puHizFON9HbD4SU/YdGor\ndywiekgsMGp1Kms0+MeBi1jxUvu4AAAYkUlEQVR/JAt2Fu2xfnoA/ubO+QuJjA0LjFqVo1eKsGDb\nWeQUV+DZwJ6YP6YfOrfn/IVExkiyAouOjsauXbtgZ2eH9PT0e8ZXrlyJzZs3AwBqa2tx/vx5FBYW\nwsbGBk5OTrCwsICpqSnMzMxw6tQpqWJTC3G3So3391zAlhM5cOrSEfExQQhy6SJ3LCJ6BJIV2IwZ\nMzBnzhxERUXVOz5v3jzMmzcPALBz5058/PHHsLGx0Y0nJSXB1tZWkqzUsvx47iYW/nAWhaXVeDHY\nBf81sg86tDWVOxYRPSLJCiw4OBjZ2dkPte6WLVswZcqU5g1ELd7dGoH/t+UMdqZeR7/uFvgyKgA+\nSiu5YxFREzG418AqKiqQmJiINWvW6JYpFAqEhYVBoVDgxRdfRExMjIwJydAJIbAj9ToWHq5AtbYS\nc0P7YFZIb06+S9TCGFyB7dy5E48//nidy4cpKSlwcHBAQUEBQkND0a9fPwQHB9+zbWxsLGJjYwEA\neXl5SE5OblSGsrKyRm/bnJjrwW5VarHpXA1SCzVwshB4wacDepiqcPSISu5oOoa0v/6MufRnqNkM\nNVeTExLKysoSnp6e911nwoQJYvPmzQ2OL168WKxcufKBz+Xv7693vj8kJSU1etvmxFwN02i0Iu5Y\ntvB8J1H0e3uvWH/4qvjp4EG5Y9XLEPZXfZhLf4aa7VFyPcrfTqkZ1DWVO3fu4NChQxg/frxuWXl5\nOUpLS3Vf79+/H15eXnJFJAOUVVSOKV/+grd/SEd/R0vs+69gRA9xhgln0yBq0SS7hDhlyhQkJyej\nqKgISqUSS5YsgVqtBgDMmjULAPD9998jLCwMnTr938zfN2/eREREBIDfb6+fOnUqRo8eLVVsMmC1\nGi3WH8nCPw5cQlszE6yI9MFTAUpOA0XUSkhWYFu2bHngOjNmzMCMGTPqLHNxcUFqamozpSJjdT7/\nLuZvS0Na3h2EenTDsgle6NaZk+8StSYGdxMH0f1U12qw9uBlfJZ8BVYd22DtVD+M9e7Osy6iVogF\nRkbj12u3MX9bGi4XlGGiXw8sesID1px8l6jVYoGRwauoqcXKfRfx76PZsO/cHhv+PgDD+9rJHYuI\nZMYCI4N2JLMIC7anIe92JaIG9cIbo/vBvB0PWyJigZGBulOpxv/sPofvTuXB2bYTvntxEAY62zx4\nQyJqNVhgZHD2ZdzAoh/Scau8Bi8N641X/+aG9m04+S4R1cUCI4NRWFqNd3dkYPfZfHjYd8ZXMwbA\nq4el3LGIyECxwEh2Qgh8f0aFpbvOoaJag3mj+iIm2AVtTA1qohgiMjAsMJKVqqQSb20/i0OXCuHf\nyxofRvrA1c5c7lhEZARYYCQLrVbg6+PX8OHeCxAA3n3SA1GDnGBiwjckE9HDYYGR5K4UlmHBtjSc\nzL6NoW62WB7hDUebjnLHIiIjwwIjydRqtIg9fBWf/JiJDm1M8dFT/RHp14PTQBFRo7DASBIZ1+9g\n/rY0pKvuYoxXdywZ7wk7C06+S0SNxwKjZlWl1uDTg5n44tBVWHdsi8+f9cMYb3u5YxFRC8ACo2Zz\nKrsYb2xLw9XCckzyV+LtJ9xh1ZGT7xJR02CBUZMrr/598t2Nx7LhYNkBm6IHIrhPV7ljEVELI9k7\nRaOjo2FnZwcvL696x5OTk2FpaQlfX1/4+vpi6dKlurHExET07dsXrq6u+OCDD6SKTI3w86VChH38\nMzYey8b0QU7Y/1owy4uImoVkZ2AzZszAnDlzEBUV1eA6Q4cOxa5du+os02g0ePnll3HgwAEolUoM\nGDAA4eHh8PDwaO7IpIeSihos230eW3/NQ++unfCfFwchwImT7xJR85GswIKDg5Gdna33didOnICr\nqytcXFwAAJMnT0ZCQgILzICcvFGL1//xM25X1GDOcFfMGeHKyXeJqNkZ1GRzx44dQ//+/TFmzBhk\nZGQAAFQqFRwdHXXrKJVKqFQquSLSnxTcrcKsuF+x9rdqdOvcDjvmPI7XR/VleRGRJAzmJg4/Pz9c\nu3YN5ubm2LNnDyZMmIDMzEwIIe5Zt6E3vsbGxiI2NhYAkJeXh+Tk5EZlKSsra/S2zclQcgkhcERV\niy0XalCjBcY7CYT3qUXhpTNIviR3uv9jKPvrr5hLP4aaCzDcbIaaq8kJCWVlZQlPT8+HWrdXr16i\nsLBQHD16VISFhemWL1++XCxfvvyB2/v7+zc6Z1JSUqO3bU6GkCvnVrl4bt0votf8XWLS5ynickGp\nQeSqD3Pph7n0Z6jZHiXXo/ztlJrBnIHduHED3bp1g0KhwIkTJ6DVatGlSxdYWVkhMzMTWVlZ6NGj\nB+Lj4/HNN9/IHbfV0WoFNh3Lxop9F6EA8N54Tzwb2AsmJgrkyh2OiFolyQpsypQpSE5ORlFREZRK\nJZYsWQK1Wg0AmDVrFrZu3YrPP/8cZmZm6NChA+Lj46FQKGBmZoY1a9Zg1KhR0Gg0iI6Ohqenp1Sx\nCcDlglLM33YWv167jZA+XbF8ojd6WHWQOxYRtXKSFdiWLVvuOz5nzhzMmTOn3rGxY8di7NixzRGL\n7kOt0eJfh67gnz9dRsd2pvjH0/0R8Rgn3yUiw2AwlxDJsKSr7mDe1jScz7+LJ3zs8e6Tnuhq0U7u\nWEREOiwwqqNKrcEnP2biy8NXYdOpLf41zR+jPLvLHYuI6B4sMNI5kVWMBdvScLWoHM8EOOKtse6w\n7NhG7lhERPVigRFKq9RYkXgRcb9cg6NNB2x+PhCPu9rKHYuI6L5YYK1c0sUCLNx+Fvl3qxD9uDNe\nH9UHHdvysCAiw8e/VK3U7fIavLfrHLafUcHNzhzbXhoMv57WcsciInpoLLBWRgiB3WfzsTghA3cq\n1XhlhCteHuGKdmacv5CIjAsLrBW5ebcKi35Ix/5zN+GjtMTXzwfC3b6z3LGIiBqFBdYKCCHw3alc\nLNt9HjW1Wrw1th+iH3eGmalBfRgBEZFeWGAtXM6tCizYnoajV24h0NkGH0b6wMm2k9yxiIgeGQus\nhdJoBf59NBsf7bsIUxMF/ifCC1MG9ISJCaeBIqKWgQXWAl26WYo3tqbht9wSjOhnh/+J8IK9JSff\nJaKWhQXWgtTUavHFoSv49GAmzNuZYfVkX4T3d+Dku0TUIrHAWojU3BLM35aGCzdKEd7fAYuf9EAX\nc06+S0QtFwvMyFXWaPDxj5ew7vBV2Fm0x7qoAIz06CZ3LCKiZifZfdTR0dGws7ODl5dXveObN2+G\nj48PfHx8MHjwYKSmpurGnJyc4O3tDV9fXwQEBEgV2eAdu3ILY1b/jNifr+KZAT2xf24wy4uIWg3J\nzsBmzJiBOXPmICoqqt5xZ2dnHDp0CNbW1ti7dy9iYmJw/Phx3XhSUhJsbTnBLADcrVLjg70X8M3x\nHPTq0hHfvBCIwb25b4iodZGswIKDg5Gdnd3g+ODBg3VfBwUFIS8vT4JUxufghZt4a3s6Ckqr8MJQ\nZ8wN7YsObTkNFBG1Pgb5Gtj69esxZswY3WOFQoGwsDAoFAq8+OKLiImJkTGdPG6VVeOL1Cr8kngK\nfbtZ4Itp/vB1tJI7FhGRbBRCCCHVk2VnZ2PcuHFIT09vcJ2kpCTMnj0bR44cQZcuXQAA169fh4OD\nAwoKChAaGopPP/0UwcHB92wbGxuL2NhYAEBeXh7i4+MblbOsrAzm5uaN2rapCSFwPF+DzeerUVEr\nEN67LZ5waQMzA3pDsiHtrz9jLv0wl/4MNduj5Hr99ddx6tSpJk7UTISEsrKyhKenZ4PjqampwsXF\nRVy8eLHBdRYvXixWrlz5wOfy9/dvVEYhhEhKSmr0tk3pekmFiN5wQvSav0uErzki4nb8JHekehnK\n/vor5tIPc+nPULM9Sq5H+dspNYOZzTUnJwcTJ05EXFwc+vTpo1teXl6O0tJS3df79+9v8E7GlkKr\nFfjmeA7C/vEzUq4U4e0n3LH9pcFQWhjMr4uISHaSvQY2ZcoUJCcno6ioCEqlEkuWLIFarQYAzJo1\nC0uXLsWtW7cwe/bs34OZmeHUqVO4efMmIiIiAAC1tbWYOnUqRo8eLVVsyWUXlWPB9jT8crUYg1y6\n4INIb/Tqwsl3iYj+SrIC27Jly33H161bh3Xr1t2z3MXFpc57wloqjVbgqyNZWHXgItqYmOCDid54\nZoAjp4EiImqAQd6F2NpcuHEX87emITXvDka6d8OyCV7obtle7lhERAaNBSaj6loN1iZdwWdJl2HZ\noQ0+nfIYxvnY86yLiOghsMBkcibnNuZvS8Olm2WIeKwHFo3zgE2ntnLHIiIyGiwwiVXU1GLV/kv4\nKiUL3Tu3x1czAjCiH+cvJCLSFwtMQkcvF2HB9rPIKa7Ac0E9MX90P1i0byN3LCIio8QCk8CdSjXe\n33Me8Sdz4WzbCfExQQhy6SJ3LCIio8YCa2YHzt3E2z+cRWFpNV4MccFrI/ugfRtOvktE9KhYYM2k\nqKwa7+7IwK60fPTrboEvowLgo+Tku0RETYUF1sSEEPjhNxWW7DyHimoN/ju0D2YN6402ppwGioio\nKbHAmtD1kkos/P4ski4W4rGeVlgR6QO3bhZyxyIiapFYYE1AqxXYfCIHH+69AI1WYPGTHoga5ART\nA/rIEyKiloYF9oiuFpZhwfazOJFVjCGutnh/ojccbTrKHYuIqMVjgTVSrUaLdUey8PGBS2hnZoIV\nk3zwlL+S00AREUmEBdYI567fxRvbUpGuuotRnt3w3ngv2HXm5LtERFJigemhulaDNQcv4/PkK7Dq\n2AafPeuHMV7dedZFRCQDFthD+vXa75PvXi4oQ6SfEm8/4Q5rTr5LRCQbyd6cFB0dDTs7O3h5edU7\nLoTAK6+8AldXV/j4+OD06dO6sY0bN8LNzQ1ubm7YuHGjVJEBAOXVtViyMwOTvjiKyhoNNkYPxKqn\n+7O8iIhkJlmBzZgxA4mJiQ2O7927F5mZmcjMzERsbCxeeuklAEBxcTGWLFmC48eP48SJE1iyZAlu\n374tSebDmYUY9cnP2JCSjaigXtj3WjBC+nSV5LmJiOj+JCuw4OBg2NjYNDiekJCAqKgoKBQKBAUF\noaSkBPn5+di3bx9CQ0NhY2MDa2trhIaG3rcIm0K5WmDef1Ixbf0JtDUzwX9mDcKS8V4wb8crrkRE\nhsJg/iKrVCo4OjrqHiuVSqhUqgaXN5cD527irSOVKFOrMHtYb7zyNzdOvktEZIAMpsCEEPcsUygU\nDS6vT2xsLGJjYwEAeXl5SE5O1jtHcrYaFmZavObXAU7tb+CXlBt6f4/mUlZW1qifqbkxl36YSz+G\nmgsw3GyGmqupGUyBKZVK5Obm6h7n5eXBwcEBSqWyzi8iLy8Pw4YNq/d7xMTEICYmBgAQEBDQ4Hr3\nM1QrkJScjJEjhuu9bXNLTk5u1M/U3JhLP8ylH0PNBRhuNkPN1dQMZor08PBwbNq0CUII/PLLL7C0\ntIS9vT1GjRqF/fv34/bt27h9+zb279+PUaNGNVsOUxMFzDiHIRGRwZPsDGzKlClITk5GUVERlEol\nlixZArVaDQCYNWsWxo4diz179sDV1RUdO3bEhg0bAAA2NjZYtGgRBgwYAAB455137nszCBERtQ6S\nFdiWLVvuO65QKLB27dp6x6KjoxEdHd0csYiIyEgZzCVEIiIifbDAiIjIKLHAiIjIKLHAiIjIKLHA\niIjIKClEfVNdtAC2trZwcnJq1LaFhYXo2tXwJu1lLv0wl36YS3+Gmu1RcmVnZ6OoqKiJEzWPFltg\njyIgIACnTp2SO8Y9mEs/zKUf5tKfoWYz1FxNjZcQiYjIKLHAiIjIKJm+++6778odwhD5+/vLHaFe\nzKUf5tIPc+nPULMZaq6mxNfAiIjIKPESIhERGaVWVWDR0dGws7ODl5dXveNCCLzyyitwdXWFj48P\nTp8+rRvbuHEj3Nzc4Obmho0bN0qaa/PmzfDx8YGPjw8GDx6M1NRU3ZiTkxO8vb3h6+uLgIAASXMl\nJyfD0tISvr6+8PX1xdKlS3VjiYmJ6Nu3L1xdXfHBBx9ImmvlypW6TF5eXjA1NUVxcTGA5t1fubm5\nGD58ONzd3eHp6YnVq1ffs44cx9jD5JLjGHuYXHIcYw+TS45jrKqqCgMHDkT//v3h6emJxYsX37NO\ndXU1nnnmGbi6uiIwMBDZ2dm6sffffx+urq7o27cv9u3b12S5ZCVakUOHDolff/1VeHp61ju+e/du\nMXr0aKHVasWxY8fEwIEDhRBC3Lp1Szg7O4tbt26J4uJi4ezsLIqLiyXLlZKSonu+PXv26HIJIUSv\nXr1EYWFhk2XRJ1dSUpJ44okn7lleW1srXFxcxJUrV0R1dbXw8fERGRkZkuX6sx07dojhw4frHjfn\n/rp+/br49ddfhRBC3L17V7i5ud3zc8txjD1MLjmOsYfJJccx9jC5/kyqY0yr1YrS0lIhhBA1NTVi\n4MCB4tixY3XWWbt2rXjxxReFEEJs2bJFPP3000IIITIyMoSPj4+oqqoSV69eFS4uLqK2trbJM0qt\nVZ2BBQcH3/ezxBISEhAVFQWFQoGgoCCUlJQgPz8f+/btQ2hoKGxsbGBtbY3Q0FAkJiZKlmvw4MGw\ntrYGAAQFBSEvL6/JnvtRcjXkxIkTcHV1hYuLC9q2bYvJkycjISFBllxbtmzBlClTmuy578fe3h5+\nfn4AAAsLC7i7u0OlUtVZR45j7GFyyXGMPUyuhjTnMaZvLqmOMYVCAXNzcwCAWq2GWq2GQlH3w3cT\nEhIwffp0AMCkSZPw008/QQiBhIQETJ48Ge3atYOzszNcXV1x4sSJZs/c3FpVgT2ISqWCo6Oj7rFS\nqYRKpWpwuRzWr1+PMWPG6B4rFAqEhYXB398fsbGxkuc5duwY+vfvjzFjxiAjIwNAw/tRahUVFUhM\nTERkZKRumVT7Kzs7G2fOnEFgYGCd5XIfYw3l+jM5jrH75ZLzGHvQ/pL6GNNoNPD19YWdnR1CQ0Pv\ne3yZmZnB0tISt27dMph/k01Nsg+0NAainhsyFQpFg8ullpSUhPXr1+PIkSO6ZSkpKXBwcEBBQQFC\nQ0PRr18/BAcHS5LHz88P165dg7m5Ofbs2YMJEyYgMzPTYPbXzp078fjjj9c5W5Nif5WVlSEyMhKf\nfPIJOnfuXGdMzmPsfrn+IMcxdr9cch5jD7O/pD7GTE1N8dtvv6GkpAQRERFIT0+v81qwof8Na2o8\nA/sTpVKJ3Nxc3eO8vDw4ODg0uFxKaWlpeP7555GQkIAuXbrolv+Rw87ODhEREZJeFujcubPuksbY\nsWOhVqtRVFRkEPsLAOLj4++5tNPc+0utViMyMhLPPvssJk6ceM+4XMfYg3IB8hxjD8ol1zH2MPsL\nkOcYAwArKysMGzbsnsvMf94vtbW1uHPnDmxsbAzm32STk+3VN5lkZWU1+OL/rl276rzAPmDAACHE\n7y+wOzk5ieLiYlFcXCycnJzErVu3JMt17do10bt3b5GSklJneVlZmbh7967u60GDBom9e/dKlis/\nP19otVohhBDHjx8Xjo6OQqvVCrVaLZydncXVq1d1L7Cnp6dLlksIIUpKSoS1tbUoKyvTLWvu/aXV\nasW0adPEq6++2uA6chxjD5NLjmPsYXLJcYw9TC4hpD/GCgoKxO3bt4UQQlRUVIghQ4aInTt31lln\nzZo1dW7ieOqpp4QQQqSnp9e5icPZ2blF3MTRqgps8uTJonv37sLMzEz06NFDrFu3Tnz++efi888/\nF0L8fuDOnj1buLi4CC8vL3Hy5EndtuvXrxe9e/cWvXv3Fl999ZWkuWbOnCmsrKxE//79Rf/+/YW/\nv78QQogrV64IHx8f4ePjIzw8PMSyZcskzfXpp58KDw8P4ePjIwIDA+v88du9e7dwc3MTLi4ukucS\nQogNGzaIZ555ps52zb2/Dh8+LAAIb29v3e9q9+7dsh9jD5NLjmPsYXLJcYw9TC4hpD/GUlNTha+v\nr/D29haenp5iyZIlQgghFi1aJBISEoQQQlRWVopJkyaJ3r17iwEDBogrV67otl+2bJlwcXERffr0\nEXv27GmyXHLiTBxERGSU+BoYEREZJRYYEREZJRYYEREZJRYYEREZJRYYEREZJRYYEREZJRYYEREZ\nJRYYkUROnjwJHx8fVFVVoby8HJ6enkhPT5c7FpHR4huZiST09ttvo6qqCpWVlVAqlXjzzTfljkRk\ntFhgRBKqqanBgAED0L59exw9ehSmpqZyRyIyWryESCSh4uJilJWVobS0FFVVVXLHITJqPAMjklB4\neDgmT56MrKws5OfnY82aNXJHIjJa/EBLIols2rQJZmZmmDp1KjQaDQYPHoyDBw9ixIgRckcjMko8\nAyMiIqPE18CIiMgoscCIiMgoscCIiMgoscCIiMgoscCIiMgoscCIiMgo/X8v2weGJjwuOwAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ipd.Image(filename='test.png') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2.2: Use Pyplot only to create the figure and show calls" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ ], "source": [ "%matplotlib notebook\n", "#activate the nbagg backend, which enables interactivity within the Jupyter Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A commonly used practice for production quality scripts is to use the ``matplotlib.pyplot`` just to create the figure and show calls, and use the OO API for everything else. There are two ways to do that:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### A: Create a figure using pyplot and create an axes instance on the figure with ``gca``" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "fig2 = plt.figure()\n", "ax2 = fig2.add_subplot(111)\n", "print(type(fig2.canvas))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that you have created your figures you can plot on them using the ``Axes`` class. Here, as an example, we will plot a scatter plot in ``fig1`` and a cool optical illusion created by [Jake VanderPlas](https://staff.washington.edu/jakevdp/) (the author of the [Python Data Science Handbook](https://github.com/jakevdp/PythonDataScienceHandbook )) in ``fig2``. If you are interested you can find more optical illusions created with ``Matplotlib`` by Jake VanderPlas [here](http://nbviewer.jupyter.org/gist/jakevdp/514bcc09637ac71ca1a8fa703c54e5f7)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5,1,'My first scatterplot')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#scatterplot\n", "a = np.random.randint(1, 100, size=10)\n", "b = np.random.randint(1, 100, size=10)\n", "ax1.scatter(a, b, color ='red', edgecolors='black')\n", "ax1.set_xscale(\"linear\")\n", "ax1.set_yscale(\"linear\") #change to \"log\" and see what happens\n", "ax1.set_xlim(0, 100)\n", "ax1.set_ylim(0, 100)\n", "ax1.set_title('My first scatterplot')\n", "#plt.show(fig1)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#optical illusion by Jake VanderPlas\n", "from matplotlib.collections import PatchCollection\n", "\n", "squares = [plt.Rectangle((i + 0.2 * (j % 3), j), 1, 1)\n", " for j in range(10) for i in range(0, 15, 2)]\n", "\n", "ax2.add_collection(PatchCollection(squares, color='black'))\n", "\n", "ax2.hlines(np.arange(11), 0, 16, color='gray')\n", "\n", "ax2.axis('equal')\n", "ax2.axis('off');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With ``axes.clear()`` you will clear the content of the figures ``fig1`` and ``fig2``." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ax1.clear();\n", "ax2.clear();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, you can spend some time to create you own plots with `Matplotlib`. Have fun!" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#your code here" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 1 }